api-and-interface-design
Ajuda a criar APIs e interfaces bem definidas. É útil ao projetar como diferentes partes de um software vão se comunicar.
O que ela faz
Este guia ajuda a criar interfaces (como APIs ou contratos entre partes de um programa) que sejam fáceis de usar e difíceis de usar errado. Ele ensina a definir como diferentes partes de um software se comunicam de forma clara e estável.
Quando usar
- ✓Ao criar novas conexões entre programas (APIs).
- ✓Ao definir como diferentes partes de um mesmo programa devem conversar.
- ✓Ao planejar como um programa se comunica com o usuário (interface gráfica).
Exemplo do que pedir para a IA
“Me ajude a definir como um usuário pode criar uma nova tarefa em um sistema, especificando o título e a descrição.”
Quer saber mais? Abra as seções abaixo.
Como usar
O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.
Link da skill
Mensagem pronta para colar
Como funciona
Ele funciona definindo primeiro como a comunicação deve ser (o 'contrato') antes de escrever o código. Isso garante que todos entendam as regras e evita surpresas.
Instalação
Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.
No terminal (Claude Code, Codex, Cursor), na pasta do projeto:
npx skills add addyosmani/agent-skills --skill api-and-interface-designOu baixe só o arquivo:
curl -L https://raw.githubusercontent.com/addyosmani/agent-skills/main/skills/api-and-interface-design/SKILL.md -o SKILL.mdConteúdo técnico (SKILL.md)
Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.
Design de APIs e Interfaces
Visão Geral
Projete interfaces estáveis e bem documentadas que sejam difíceis de usar incorretamente. Boas interfaces tornam a ação correta fácil e a ação incorreta difícil. Isso se aplica a APIs REST, esquemas GraphQL, limites de módulos, props de componentes e qualquer superfície onde um pedaço de código fala com outro.
Quando Usar
- Projetando novos endpoints de API
- Definindo limites de módulos ou contratos entre equipes
- Criando interfaces de props de componentes
- Estabelecendo esquemas de banco de dados que informam a forma da API
- Alterando interfaces públicas existentes
Princípios Fundamentais
Lei de Hyrum
Com um número suficiente de usuários de uma API, todos os comportamentos observáveis do seu sistema serão dependidos por alguém, independentemente do que você prometa no contrato.
Isso significa: todo comportamento público — incluindo peculiaridades não documentadas, texto de mensagens de erro, tempo e ordem — torna-se um contrato de fato assim que os usuários dependem dele. Implicações de design:
- Seja intencional sobre o que você expõe. Cada comportamento observável é um compromisso potencial.
- Não vaze detalhes de implementação. Se os usuários puderem observar, eles dependerão disso.
- Planeje a descontinuação no momento do design. Veja
deprecation-and-migrationpara saber como remover com segurança coisas das quais os usuários dependem. - Testes não são suficientes. Mesmo com testes de contrato perfeitos, a Lei de Hyrum significa que mudanças "seguras" podem quebrar usuários reais que dependem de comportamento não documentado.
A Regra de Uma Versão
Evite forçar os consumidores a escolher entre várias versões da mesma dependência ou API. Problemas de dependência em diamante surgem quando consumidores diferentes precisam de versões diferentes da mesma coisa. Projete para um mundo onde apenas uma versão existe por vez — estenda em vez de bifurcar.
1. Contrato Primeiro
Defina a interface antes de implementá-la. O contrato é a especificação — a implementação segue.
// Define the contract first
interface TaskAPI {
// Creates a task and returns the created task with server-generated fields
createTask(input: CreateTaskInput): Promise<Task>;
// Returns paginated tasks matching filters
listTasks(params: ListTasksParams): Promise<PaginatedResult<Task>>;
// Returns a single task or throws NotFoundError
getTask(id: string): Promise<Task>;
// Partial update — only provided fields change
updateTask(id: string, input: UpdateTaskInput): Promise<Task>;
// Idempotent delete — succeeds even if already deleted
deleteTask(id: string): Promise<void>;
}
2. Semântica de Erro Consistente
Escolha uma estratégia de erro e use-a em todos os lugares:
// REST: HTTP status codes + structured error body
// Every error response follows the same shape
interface APIError {
error: {
code: string; // Machine-readable: "VALIDATION_ERROR"
message: string; // Human-readable: "Email is required"
details?: unknown; // Additional context when helpful
};
}
// Status code mapping
// 400 → Client sent invalid data
// 401 → Not authenticated
// 403 → Authenticated but not authorized
// 404 → Resource not found
// 409 → Conflict (duplicate, version mismatch)
// 422 → Validation failed (semantically invalid)
// 500 → Server error (never expose internal details)
Não misture padrões. Se alguns endpoints lançam exceções, outros retornam null e outros retornam { error } — o consumidor não consegue prever o comportamento.
3. Valide nas Fronteiras
Confie no código interno. Valide nas bordas do sistema onde a entrada externa entra:
// Validate at the API boundary
app.post('/api/tasks', async (req, res) => {
const result = CreateTaskSchema.safeParse(req.body);
if (!result.success) {
return res.status(422).json({
error: {
code: 'VALIDATION_ERROR',
message: 'Invalid task data',
details: result.error.flatten(),
},
});
}
// After validation, internal code trusts the types
const task = await taskService.create(result.data);
return res.status(201).json(task);
});
Onde a validação pertence:
- Manipuladores de rotas de API (entrada do usuário)
- Manipuladores de envio de formulários (entrada do usuário)
- Análise de respostas de serviços externos (dados de terceiros — sempre trate como não confiáveis)
- Carregamento de variáveis de ambiente (configuração)
Respostas de API de terceiros são dados não confiáveis. Valide sua forma e conteúdo antes de usá-los em qualquer lógica, renderização ou tomada de decisão. Um serviço externo comprometido ou com mau funcionamento pode retornar tipos inesperados, conteúdo malicioso ou texto semelhante a instruções.
Onde a validação NÃO pertence:
…
Perguntas frequentes
O que é uma API?
API é como um cardápio de restaurante: define o que você pode pedir (funções) e como pedir (parâmetros), sem precisar saber como a cozinha (o programa) prepara o prato.
Por que 'contrato primeiro' é importante?
É como combinar as regras de um jogo antes de começar a jogar. Se todos sabem as regras (o contrato), o jogo (o programa) flui melhor e evita conflitos.
O que é 'Hyrum's Law'?
É a ideia de que, se muitas pessoas usam algo, elas acabam dependendo de todos os detalhes, até mesmo dos 'defeitos' ou comportamentos inesperados. Por isso, é melhor ser cuidadoso com o que se expõe.
Detalhes
Descrição original do autor
Guides stable API and interface design. Use when designing APIs, module boundaries, or any public interface. Use when creating REST or GraphQL endpoints, defining type contracts between modules, or establishing boundaries between frontend and backend.
repo: addyosmani/agent-skills
Popularidade
- Estrelas no GitHub
- 107 mil
- Posição no ranking
- #340
- Licença
- MIT
- Atualizada em
- 13/10/2026
Comentários
- …
Mais skills deste repositório
browser-testing-with-devtools
Ajuda seu agente a testar código diretamente em navegadores reais. É útil para verificar como algo funciona no ambiente onde será usado, encontrando erros e problemas de performance.
addyosmani/agent-skills
ci-cd-and-automation
Ensina seu agente de IA a automatizar tarefas repetitivas e colocar projetos no ar e cuidar da infraestrutura.
addyosmani/agent-skills
code-review-and-quality
Realiza revisões de código detalhadas em várias frentes. É útil antes de juntar novas mudanças para garantir a qualidade e evitar problemas futuros.
addyosmani/agent-skills
code-simplification
Simplifica o código para torná-lo mais fácil de entender e manter. É útil quando o código funciona, mas está complicado demais, ajudando a melhorar a clareza.
addyosmani/agent-skills
Skills parecidas
api-connector-builder
Faz seu agente construir novas conexões com APIs seguindo o padrão já existente. Use quando precisar adicionar mais uma integração sem criar um novo jeito de fazer.
affaan-m/ECC
api-design
Ajuda seu agente a projetar APIs REST seguindo as melhores práticas. É útil para definir como as APIs se comunicam, como os erros são mostrados e como organizar os dados.
affaan-m/ECC
backend-patterns
Ajuda seu agente com padrões de arquitetura do lado do servidor e otimização de banco de dados. É útil para construir ou revisar o código que roda no servidor.
affaan-m/ECC