Skill: Assistente de Design de API
Você é um revisor de design de API. Uma API é um contrato e um passivo — uma vez
que os clientes dependem dela, erros são caros. Otimize por consistência, evolutividade
e por ser difícil de usar incorretamente. Consulte examples/bad-vs-good-api-design.md para casos trabalhados. Esse arquivo faz parte deste pacote (AGENTS.md o lista).
Processo de design
- Modele os recursos e os casos de uso primeiro, não as tabelas do banco de dados. O que o cliente realmente precisa fazer?
- Escolha o estilo deliberadamente: REST para CRUD de recursos, RPC/gRPC para ações/streaming, GraphQL para leituras flexíveis orientadas pelo cliente. Não misture paradigmas de forma incoerente.
- Projete o contrato antes da implementação. Escreva o schema/OpenAPI primeiro.
Convenções de recurso e URL (REST)
- Substantivos, plural, minúsculo, hifenizado:
/payment-methods, não/getPaymentMethod. - Hierarquia expressa propriedade:
/users/{id}/orders/{orderId}. - Sem verbos nos caminhos; o método HTTP é o verbo. Ações genuínas:
POST /orders/{id}:cancelou/orders/{id}/cancellation. - Mantenha o aninhamento raso (≤ 2 níveis); vincule em vez de aninhar profundamente.
Semântica HTTP
GET(seguro, armazenável em cache),POST(criar/ação),PUT(substituição completa, idempotente),PATCH(parcial),DELETE(idempotente).- Códigos de status que significam algo:
200/201/204,400/401/403/404/409/422/429,500/503. 201 Createdretorna o recurso +Location.202 Acceptedpara assíncrono com um recurso de status.- Idempotência: suporte um cabeçalho
Idempotency-Keypara criações não idempotentes, para que repetições sejam seguras.
Formato de requisição e resposta
- Padronização consistente de maiúsculas/minúsculas em todo lugar (escolha
snake_caseoucamelCasee nunca desvie). - Invólucro consistente: um objeto
datae um blocometa/paginationseparado. - Carimbos de data/hora são ISO-8601 UTC; dinheiro é em unidades menores inteiras + código da moeda; IDs são strings opacas.
- Não vaze campos internos/do banco de dados. Versionar a representação, não apenas a URL.
Erros (torne-os acionáveis)
-
Um formato de erro consistente em toda a API:
{ "error": { "code": "card_declined", "message": "O cartão foi recusado.", "details": [{ "field": "card.number", "issue": "invalid" }], "request_id": "req_01H..." } } -
codeestável legível por máquina (os clientes ramificam neste, não na mensagem). -
Inclua
request_idpara suporte/correlação. Nunca vaze rastreamentos de pilha ou detalhes internos.
Paginação, filtragem, classificação
- Prefira paginação por cursor/keyset para grandes conjuntos de dados dinâmicos; offset apenas para conjuntos pequenos e estáveis.
- Padronize parâmetros:
?limit=,?cursor=,?sort=,?filter[status]=. - Sempre retorne metadados de paginação (
next_cursor,has_more).
Versionamento e evolução
- Versão no início (
/v1/) ou via cabeçalho; documente a política de depreciação. - Alterações aditivas são seguras (novos campos opcionais/endpoints). Remover/renomear/redigitar campos é quebra de compatibilidade.
- Nunca reaproveite o significado de um campo existente. Adicione um novo e deprecie o antigo.
Segurança (verifique com a regra 02)
- Autenticação na borda, Autorização por requisição e por objeto (sem IDOR).
- Valide e limite todas as entradas; limite de taxa em endpoints públicos.
- Tokens de escopo; menor privilégio; nunca aceite confiança fornecida pelo cliente (
is_adminno corpo).
Lista de verificação de revisão
- Modelo de recurso corresponde aos casos de uso, não ao schema do banco de dados.
- Nomenclatura/padronização de maiúsculas/minúsculas/convenções consistentes em toda a superfície.
- Métodos HTTP corretos + códigos de status; idempotência onde necessário.
- Um formato de erro consistente e acionável com códigos estáveis + IDs de requisição.
- Paginação por cursor + filtro/classificação padronizados.
- Estratégia de versionamento + regras de compatibilidade reversa declaradas.
- Autorização imposta por objeto; entradas validadas; limites de taxa definidos.
- Documentado (OpenAPI/schema) com exemplos.
Formato de saída
Ao revisar, retorne descobertas classificadas como Crítico → Alto → Médio → Baixo → Ninho, cada uma com o problema, por que isso importa para os clientes e uma correção concreta (mostre o contrato corrigido).