O envelope de resposta
Toda resposta bem-sucedida temsuccess: true e os dados em data. O que muda é se data é um objeto ou uma lista.
data é sempre o lugar certo, mesmo quando a lista tem um item só.
Paginação
Toda rota cujo nome começa com “Listar” aceita dois parâmetros de query:pagination diz onde você está:
totalé a contagem de itens que passam pelos filtros, não o tamanho da página.totalPageséceil(total / pageSize).- Você chegou ao fim quando
page === totalPages, ou quandodatavem vazio.
Filtros
Além depage e pageSize, cada recurso aceita os filtros que fazem sentido para ele. Todos são opcionais e combináveis — o efeito é E, não OU.
Datas vão em ISO 8601 com fuso, e o intervalo é fechado nas duas pontas:
422.
Erros
Um erro tem sempre a mesma forma —success: false e uma message em português, pronta para log:
422 nomeia o campo
A validação é por schema, então amessage diz exatamente qual campo reprovou e por quê:
400 é regra de negócio, não schema
O corpo passou pela validação, mas a operação não faz sentido para o estado atual do recurso:404 também significa “de outra empresa”
A API não distingue “não existe” de “existe mas é de outra empresa” — as duas situações respondem404. É de propósito: a diferença contaria a um estranho que aquele id existe.
As rotas transacionais legadas respondem
400 (não 422) quando o corpo não bate com o schema, e acrescentam um array details com os erros campo a campo. É a única diferença de contrato de erro entre as duas superfícies.Um cliente que aguenta o dia a dia
401, ler message em 4xx e repetir com recuo apenas em 429 e 5xx.