API - Introdução
Bem-vindo à documentação da API do OitoPorOito. Esta API REST fornece acesso programático a todas as funcionalidades da plataforma.
Base URL
Desenvolvimento:
Autenticação
A API usa Bearer Token (JWT) para autenticação via Supabase.
Obter Token
POST /auth/login
Content-Type: application/json
{
"email": "usuario@example.com",
"password": "senha123"
}
Resposta:
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refresh_token": "...",
"expires_in": 3600,
"user": {
"id": "uuid",
"email": "usuario@example.com",
"username": "jogador123"
}
}
Usar Token
Inclua o token no header Authorization:
Formato de Resposta
Sucesso
Erro
{
"success": false,
"error": {
"code": "INVALID_CREDENTIALS",
"message": "Email ou senha incorretos",
"details": {}
}
}
Códigos de Status HTTP
| Código | Significado |
|---|---|
| 200 | OK - Sucesso |
| 201 | Created - Recurso criado |
| 204 | No Content - Sucesso sem conteúdo |
| 400 | Bad Request - Requisição inválida |
| 401 | Unauthorized - Não autenticado |
| 403 | Forbidden - Sem permissão |
| 404 | Not Found - Recurso não encontrado |
| 429 | Too Many Requests - Rate limit excedido |
| 500 | Internal Server Error - Erro no servidor |
Rate Limiting
Limites por endpoint:
- Autenticação: 5 requisições/minuto
- Leitura: 100 requisições/minuto
- Escrita: 30 requisições/minuto
Headers de rate limit:
Paginação
Endpoints que retornam listas usam paginação:
Resposta:
{
"success": true,
"data": [...],
"pagination": {
"page": 2,
"limit": 20,
"total": 150,
"totalPages": 8,
"hasNext": true,
"hasPrev": true
}
}
Filtros e Ordenação
Filtros
Ordenação
Busca
Versionamento
A API usa versionamento via URL:
- Atual:
/v1/ - Próxima:
/v2/(quando disponível)
Versões antigas são mantidas por pelo menos 6 meses após nova versão.
SDKs e Bibliotecas
JavaScript/TypeScript
import { OitoPorOito } from '@oitoporoito/sdk';
const client = new OitoPorOito({
apiKey: 'your-api-key',
baseURL: 'https://api.oitoporoito.com/v1'
});
// Buscar perfil
const user = await client.users.me();
// Buscar partidas
const games = await client.games.list({ limit: 10 });
Python
from oitoporoito import Client
client = Client(api_key='your-api-key')
# Buscar perfil
user = client.users.me()
# Buscar partidas
games = client.games.list(limit=10)
Endpoints Principais
Autenticação
POST /auth/login- LoginPOST /auth/signup- CadastroPOST /auth/logout- LogoutPOST /auth/refresh- Renovar token
Usuários
GET /users/me- Perfil atualGET /users/:id- Perfil por IDPATCH /users/me- Atualizar perfilGET /users/search- Buscar usuários
Partidas
POST /games- Criar partidaGET /games/:id- Buscar partidaPATCH /games/:id/move- Fazer movimentoPOST /games/:id/resign- ResignarPOST /games/:id/draw- Oferecer empate
Puzzles
GET /puzzles- Listar puzzlesGET /puzzles/:id- Buscar puzzlePOST /puzzles/:id/attempt- Tentar resolverGET /puzzles/daily- Puzzle do dia
Social
GET /friends- Listar amigosPOST /friends/:id- Adicionar amigoDELETE /friends/:id- Remover amigoGET /clubs- Listar clubesPOST /clubs- Criar clube
Webhooks
Configure webhooks para receber eventos em tempo real:
POST /webhooks
{
"url": "https://seu-site.com/webhook",
"events": ["game.finished", "friend.request"],
"secret": "seu-secret"
}
Eventos disponíveis:
- game.started
- game.finished
- game.move
- friend.request
- friend.accepted
- club.invite
- tournament.started
Realtime (WebSocket)
Para atualizações em tempo real, use WebSocket:
const ws = new WebSocket('wss://api.oitoporoito.com/realtime');
ws.onopen = () => {
ws.send(JSON.stringify({
type: 'subscribe',
channel: 'game:123',
token: 'seu-jwt-token'
}));
};
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
console.log('Nova jogada:', data);
};
Erros Comuns
401 Unauthorized
Solução: Renovar token com /auth/refresh
429 Rate Limit
Solução: Aguardar antes de nova requisição
400 Validation Error
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Dados inválidos",
"details": {
"email": ["Email inválido"],
"password": ["Mínimo 8 caracteres"]
}
}
}
Ambientes
Produção
Staging
Desenvolvimento Local
Recursos
Suporte
- 📧 Email: api@oitoporoito.com
- 💬 Discord: OitoPorOito Community
- 🐛 Issues: GitHub