Mapping types were deprecated in 6.0, made single-only in 7.0 and removed entirely in 8.0, which is an unusually long and well-signposted removal.
# 7.x, still accepted with a deprecation warning
PUT /products/_doc/1
GET /products/_doc/1
# 8.x — the URL shape is the same, and include_type_name
# is gone, along with any request that used a type name
PUT /products/_doc/1
# what breaks: a client library still sending the type,
# and any stored query or template that names one
The four-year runway means most code was already correct and the exceptions are in the places nobody looks — a stored search template, a saved object in a dashboard tool, a script written in 2017 that still runs monthly. Grepping for _type across the codebase is the whole audit and takes a minute.