An error shape agreed once, and used everywhere

Four error formats across one API, because each was invented by whoever wrote that controller.

HTTP/1.1 422 Unprocessable Content
Content-Type: application/problem+json

{
  "type": "https://docs.example.com/errors/validation",
  "title": "Validation failed",
  "status": 422,
  "detail": "The request body failed validation.",
  "instance": "/api/orders",
  "errors": {
    "lines.0.quantity": ["must be at least 1"]
  }
}

RFC 7807 is a small specification and the value is not its contents — it is that a consumer can write one error handler. The extension member for field errors is where implementations diverge, so it needs documenting as carefully as the standard fields. Enforcing it was one exception handler and deleting four bespoke ones; the harder part was the two endpoints that returned 200 with an error body.