TL; DR: Dipende dal codice di stato stesso. A volte l'uso delle intestazioni è corretto, a volte non è necessario includere nulla e talvolta è corretto utilizzare un payload.
Questo di solito dipende molto dal codice di stato che stai utilizzando, ma molto probabilmente penso che stai pensando alla riga 4XX dei codici di stato per i quali dovresti leggere RFC 7231 .
6.5. Client Error 4xx
The 4xx (Client Error) class of status code indicates that the client seems to have erred. Except when responding to a HEAD request, the server SHOULD send a representation containing an explanation of the error situation, and whether it is a temporary or permanent condition. These status codes are applicable to any request method. User agents SHOULD display any included representation to the user.
Quindi puoi anche scavare più in profondità a seconda del codice che stai usando, ovviamente, ma questo è il senso. Per un esempio, guardando il codice di stato 409 viene indicato quanto segue:
6.5.8. 409 Conflict
The 409 (Conflict) status code indicates that the request could not be completed due to a conflict with the current state of the target resource. This code is used in situations where the user might be able to resolve the conflict and resubmit the request. The server SHOULD generate a payload that includes enough information for a user to recognize the source of the conflict.
[...]
Qui è esplicitamente dichiarato che dovresti includere un carico utile (corpo) che descrive il problema. Quindi per questo caso lavoreresti secondo l'unico modo canonico. Tuttavia, ciò di cui parlano come una rappresentazione può essere diverso e in genere dipende dalla richiesta fatta. Per un 403 Proibito è specificato esplicitamente che è possibile includere un messaggio di errore, ma se si desidera o meno farlo dipende da voi. Qui si tratta in realtà del tipo di informazioni che sei disposto a offrire.
Per 400 Bad Request non è specificato, ma considero una pratica abbastanza comune restituire un payload che indica eventuali problemi, ma qui tutto si riduce alle preferenze.
Probabilmente la RFC ti aiuterà molto più di qualsiasi mio breve riassunto.
Potrebbe anche essere utile leggere questa risposta a una domanda simile su come fornire informazioni sugli errori quando i codici di stato non sono sufficienti (raggiunge un punto pertinente).