api-design
API Design - Princípios RESTful e boas práticas
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
API Design - Princípios RESTful e boas práticas
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Especialista em produção e marketing de podcasts. Pesquisa convidados, cria perguntas inteligentes e memoráveis, sugere estruturas de episódio e ideias de marketing. Sempre aprende sobre o podcast do usuário primeiro. Use com /podcast ou quando o usuário mencionar podcast, entrevista, convidado, perguntas para entrevistar, ou preparar episódio.
You MUST use this before any creative work - creating features, building components, adding functionality, or modifying behavior. Explores user intent, requirements and design before implementation.
Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML/CSS layouts, or when styling/beautifying any web UI). Generates creative, polished code and UI design that avoids generic AI aesthetics.
Automatic agent selection and intelligent task routing. Analyzes user requests and automatically selects the best specialist agent(s) without requiring explicit user mentions.
Padrões de arquitetura de software - Decisões OBJETIVAS sobre design de sistemas
Benjamin Graham - O pai do Value Investing e Security Analysis
| name | api-design |
| description | API Design - Princípios RESTful e boas práticas |
| version | 1.0.0 |
| category | process |
| triggers | ["api","rest","endpoint","rota","route","http","request","response","crud"] |
| tools | [] |
| author | liquid-ai |
Esta skill implementa boas práticas para design de APIs RESTful consistentes e intuitivas.
┌─────────────────────────────────────────────────────────────┐
│ 1. CONSISTÊNCIA - Padrões previsíveis em toda API │
│ 2. SIMPLICIDADE - Fácil de entender e usar │
│ 3. DOCUMENTAÇÃO - Auto-explicativa quando possível │
│ 4. VERSIONAMENTO - Evoluir sem quebrar clientes │
└─────────────────────────────────────────────────────────────┘
# ✅ BOM - Substantivos no plural, kebab-case
GET /api/v1/users
GET /api/v1/user-profiles
GET /api/v1/order-items
# ❌ RUIM - Verbos, singular, camelCase
GET /api/v1/getUser
GET /api/v1/user
GET /api/v1/orderItems
# Recurso principal
GET /api/v1/users
# Sub-recurso (pertence a user)
GET /api/v1/users/{userId}/orders
# Máximo 2-3 níveis de aninhamento
GET /api/v1/users/{userId}/orders/{orderId}/items
# Se muito profundo, promova a recurso próprio
GET /api/v1/order-items?orderId={orderId}
| Method | Uso | Idempotente | Body |
|---|---|---|---|
GET | Ler recurso(s) | Sim | Não |
POST | Criar recurso | Não | Sim |
PUT | Substituir recurso completo | Sim | Sim |
PATCH | Atualizar parcialmente | Sim* | Sim |
DELETE | Remover recurso | Sim | Não |
# Listar todos os usuários
GET /api/v1/users
# Obter usuário específico
GET /api/v1/users/123
# Criar usuário
POST /api/v1/users
Body: { "name": "João", "email": "joao@email.com" }
# Atualizar usuário (completo)
PUT /api/v1/users/123
Body: { "name": "João Silva", "email": "joao@email.com", "phone": "..." }
# Atualizar usuário (parcial)
PATCH /api/v1/users/123
Body: { "name": "João Silva" }
# Remover usuário
DELETE /api/v1/users/123
| Code | Quando Usar |
|---|---|
200 OK | GET/PUT/PATCH bem-sucedido |
201 Created | POST criou recurso |
204 No Content | DELETE bem-sucedido |
| Code | Quando Usar |
|---|---|
400 Bad Request | Dados inválidos |
401 Unauthorized | Não autenticado |
403 Forbidden | Autenticado mas sem permissão |
404 Not Found | Recurso não existe |
409 Conflict | Conflito (ex: email duplicado) |
422 Unprocessable Entity | Validação falhou |
429 Too Many Requests | Rate limit excedido |
| Code | Quando Usar |
|---|---|
500 Internal Server Error | Erro inesperado |
502 Bad Gateway | Serviço upstream falhou |
503 Service Unavailable | Serviço temporariamente indisponível |
Content-Type: application/json
Authorization: Bearer <token>
Accept: application/json
Accept-Language: pt-BR
X-Request-ID: uuid-for-tracing
{
"data": {
"id": "123",
"name": "João",
"email": "joao@email.com",
"createdAt": "2025-01-13T10:30:00Z"
}
}
{
"data": [
{ "id": "1", "name": "João" },
{ "id": "2", "name": "Maria" }
],
"meta": {
"total": 100,
"page": 1,
"perPage": 20,
"totalPages": 5
}
}
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Dados inválidos",
"details": [
{
"field": "email",
"message": "Email inválido"
}
]
}
}
# Offset-based (simples)
GET /api/v1/users?page=2&perPage=20
# Cursor-based (melhor performance)
GET /api/v1/users?cursor=abc123&limit=20
{
"data": [...],
"meta": {
"total": 1000,
"page": 2,
"perPage": 20
},
"links": {
"self": "/api/v1/users?page=2",
"first": "/api/v1/users?page=1",
"prev": "/api/v1/users?page=1",
"next": "/api/v1/users?page=3",
"last": "/api/v1/users?page=50"
}
}
# Filtro simples
GET /api/v1/users?status=active
# Múltiplos valores
GET /api/v1/users?status=active,pending
# Operadores
GET /api/v1/orders?total[gte]=100&total[lte]=500
GET /api/v1/users?createdAt[after]=2025-01-01
# Ascendente
GET /api/v1/users?sort=name
# Descendente
GET /api/v1/users?sort=-createdAt
# Múltiplos campos
GET /api/v1/users?sort=-createdAt,name
# Busca simples
GET /api/v1/users?search=joão
# Busca em campo específico
GET /api/v1/users?name[contains]=silva
| Estratégia | Exemplo | Pros | Cons |
|---|---|---|---|
| URL Path | /api/v1/users | Explícito, cacheável | URL muda |
| Header | Accept-Version: 1 | URL limpa | Menos visível |
| Query | ?version=1 | Fácil testar | Pode ser esquecido |
Recomendação: URL Path para APIs públicas
# Versão atual
GET /api/v1/users
# Nova versão (breaking changes)
GET /api/v2/users
# Manter v1 funcionando por período de deprecação
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
X-API-Key: your-api-key-here
| Flow | Uso |
|---|---|
| Authorization Code | Web apps com backend |
| PKCE | Mobile/SPA apps |
| Client Credentials | Server-to-server |
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1673568000
Retry-After: 60
{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Limite de requisições excedido",
"retryAfter": 60
}
}
{
"data": {
"id": "123",
"name": "João",
"status": "active"
},
"links": {
"self": "/api/v1/users/123",
"orders": "/api/v1/users/123/orders",
"deactivate": "/api/v1/users/123/deactivate"
}
}
# Ações em recurso
POST /api/v1/users/123/activate
POST /api/v1/orders/456/cancel
POST /api/v1/emails/789/send
PATCH /api/v1/users/123
Body: { "status": "active" }
| Anti-Pattern | Problema | Solução |
|---|---|---|
| Verbos na URL | /getUsers, /createUser | Use HTTP methods |
| Inconsistência | /users vs /User | Padronize plural/kebab |
| Expor IDs internos | IDs sequenciais | Use UUIDs ou slugs |
| Retornar HTML em API | Dificulta consumo | Sempre JSON |
| Ignorar erros | Retornar 200 com erro | Status codes corretos |
Esta skill ativa AUTOMATICAMENTE quando: