Types are gone, four years after the deprecation

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.