Guia do desenvolvedor
Limites de taxa e erros
A API do PollsLive usa limites de taxa por chave e retorna objetos de erro JSON consistentes com códigos legíveis por máquina.
Limites de taxa
Os limites são aplicados por chave de API (ou por cliente OAuth) e por minuto. Exceder o limite retorna 429 Too Many Requests.
| Grupo de endpoints | Limite | Janela |
|---|---|---|
Todos os endpoints /api/v1/ | 120 requisições | 1 minuto |
POST /api/v1/polls | 20 requisições (além das 120) | 1 minuto por chave |
POST /api/v1/media | 30 requisições | 1 minuto |
GET /api/v1/polls/{id}/export?format=pdf | 10 requisições | 1 hora por espaço de trabalho |
POST /api/oauth/token | 10 requisições | 1 minuto por client_id |
Precisa de limites maiores para sua integração? Fale com nossa equipe.
Sessões ao vivo abertas ao mesmo tempo são um teto separado, não um limite de taxa: Free 1 sala, Pro 1 por licença de apresentador, Premium 2. Ao atingi-lo, retorna 403 com o código session_limit. Encerre uma sala pelo Studio (ou com POST /api/v1/sessions/{id}/control e end) antes de abrir outra.
Cabeçalhos de limite
As respostas JSON trazem cabeçalhos com metadados do limite:
X-RateLimit-Limit: 120
X-RateLimit-Window: 60sExceder o limite retorna 429 com o código rate_limited. Aguarde antes de tentar de novo. Não há cabeçalho Retry-After.
Formato da resposta de erro
Todos os erros da API retornam um corpo JSON com um objeto error aninhado contendo um code legível por máquina e uma message legível por humanos:
HTTP/1.1 404 Not Found
Content-Type: application/json
{
"error": {
"code": "not_found",
"message": "Poll not found."
}
}Erros de validação retornam 422 com um campo details dentro do objeto de erro:
{
"error": {
"code": "validation_failed",
"message": "Request validation failed.",
"details": {
"fieldErrors": { "title": ["String must contain at least 1 character(s)"] },
"formErrors": []
}
}
}Já os erros de token OAuth seguem o formato RFC 6749 §5.2:
{
"error": "invalid_client",
"error_description": "Invalid client credentials."
}Códigos de erro
| Status HTTP | code | Significado |
|---|---|---|
| 400 | invalid_json | O corpo da requisição não é JSON válido |
| 401 | missing_authorization | Nenhum token Bearer informado |
| 401 | invalid_api_key | Chave de API desconhecida ou incorreta |
| 401 | revoked_api_key | A chave foi revogada |
| 401 | expired_api_key | A chave expirou após a rotação |
| 401 | invalid_oauth_token | Token OAuth inválido ou expirado |
| 402 | upgrade_required | A ação exige um plano pago (Pro ou superior) ou um recurso que o plano não inclui (por exemplo, exportar em PDF) |
| 403 | insufficient_scope | A credencial não tem o escopo exigido por este endpoint |
| 403 | session_limit | O espaço de trabalho já está com o número de sessões ao vivo simultâneas do seu plano (POST /sessions) |
| 404 | not_found | Recurso não encontrado |
| 409 | already_voted | Este voterId já votou na enquete (POST /votes) |
| 409 | already_responded | Esta pessoa já respondeu ao slide (POST /responses) |
| 422 | validation_failed | O corpo da requisição falhou na validação de esquema |
| 429 | rate_limited | Requisições demais. Tente de novo após a janela reiniciar |
| 500 | internal_error | Erro inesperado do servidor |
Repetições e espera
Recomendamos uma estratégia de espera exponencial com variação aleatória para integrações em produção:
async function fetchWithRetry(url, options, maxRetries = 3) {
for (let attempt = 0; attempt <= maxRetries; attempt++) {
const res = await fetch(url, options);
if (res.status === 429) {
// PollsLive does not send Retry-After, so back off exponentially
// (capped at one minute, the length of a rate-limit window).
const backoff = Math.min(1000 * 2 ** attempt + Math.random() * 500, 60000);
await new Promise((r) => setTimeout(r, backoff));
continue;
}
if (res.status >= 500 && attempt < maxRetries) {
const backoff = Math.min(1000 * 2 ** attempt + Math.random() * 500, 30000);
await new Promise((r) => setTimeout(r, backoff));
continue;
}
return res;
}
throw new Error("Max retries exceeded");
}Não repita em erros 4xx (exceto 429): eles indicam um problema na sua requisição que não se resolve repetindo.
Formato de erro do OAuth
O endpoint de token (POST /api/oauth/token) retorna erros no formato RFC 6749:
| error | Significado |
|---|---|
invalid_request | Parâmetros ausentes ou malformados |
invalid_client | client_id desconhecido ou client_secret incorreto |
access_denied | O cliente está revogado, limitado por taxa (429), ou o espaço de trabalho está no plano Free (402) |
unsupported_grant_type | Somente client_credentials é suportado |
Ainda tem dúvidas?
Nossa equipe terá prazer em ajudar.