Every error says what kind it is, and every route carries a code and request id
Error bodies on every /v1 route now carry type next to code: the kind of thing that went wrong, from the status, so a client can decide between fixing the request and retrying without a table of codes. The names are Anthropic's (invalid_request_error, authentication_error, billing_error, permission_error, not_found_error, request_too_large, rate_limit_error, overloaded_error, api_error), so /v1/messages answers as it did. The few routes that answered a bare message, the Apps preview and the dashboard's hosting and domain calls, now return a code and the request id like every other.
The field is added, nothing is moved or renamed, so a client that reads code, message and request_id sees no change. A stream that breaks carries type in its last frame too.
The record and action errors of an app keep their extras (problems, event, logs) where they were, and the reference and OpenAPI document of every app list the new field.
More in Errors.