Great framing. GraphQL is a good example of exactly this: with the usual application/json responses, many servers answer 200 even when the query failed, and the real result is an "errors" array next to (or instead of) "data". Partial success is allowed too, so one response can carry some fields and an error for others. A habit that helps: assert that "errors" is absent, or exactly what you expected, before you look at the data. Will a later part of the series cover GraphQL or JSON-RPC, where the status code says even less?