code. message is for logs and debugging — its wording can change
at any time.
Each operation lists the codes it can return. Treat those lists as open: a new
code can appear under an existing status, so fall back to the status when you
meet one you don’t recognise.
Some failures arrive without the envelope — a 400 on a body that isn’t
parseable JSON, a 413 on an oversized body, a 504 on a timeout. Read the
HTTP status before you parse the body.