Eu particulamente gosto de devolver um json padronizado com algumas informações relevantes, como status da requisição, campo de erros, informações sbre paginação e outras informações relevantes. Uma boa API facilita muito a vida do front, geralmente, faço algo como o exemplo abaixo, imaginando um endpoint que devolveria uma lista de livros:
{
"data": [
{
"id": 1,
"nome": "Entendendo algoritmos",
} ...
],
"meta": {
"total": 1,
"perPage": 10,
"currentPage": 0,
"nextPage": 1,
"lastPage": null,
"nextPageUrl": ...
},
"error" : {
"message": (alguma mensagem significativa para poder ser exibida no front),
"debugMessage": (alguma mensagem que ajudasse a compreender a raíz do erro),
"subErrors": [(em caso de múltiplos erros)],
}
}