Uma boa error response faz duas coisas: usa o status code HTTP certo (o sinal legível por máquina), e retorna um body estruturado e consistente sobre o qual um desenvolvedor pode agir. Formatos de erro inconsistentes são uma das maiores fontes de dor do lado do client.
Use um formato de erro padrão: RFC 7807 (problem+json)
A RFC 7807 define um body "problem details" padrão com um media type dedicado, para que todo erro na sua API tenha a mesma aparência:
HTTP/1.1 404 Not Found
Content-Type: application/problem+json
{
"type": "https://api.example.com/errors/not-found",
"title": "Resource not found",
"status": 404,
"detail": "No user exists with id 999",
"instance": "/users/999"
}
