Ir para o conteúdo

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 endpointsLimiteJanela
Todos os endpoints /api/v1/120 requisições1 minuto
POST /api/v1/polls20 requisições (além das 120)1 minuto por chave
POST /api/v1/media30 requisições1 minuto
GET /api/v1/polls/{id}/export?format=pdf10 requisições1 hora por espaço de trabalho
POST /api/oauth/token10 requisições1 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:

Cabeçalhos de resposta
X-RateLimit-Limit: 120
X-RateLimit-Window: 60s

Exceder 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:

Erro padrão
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:

Erro de validação
{
  "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:

Erro de OAuth
{
  "error": "invalid_client",
  "error_description": "Invalid client credentials."
}

Códigos de erro

Status HTTPcodeSignificado
400invalid_jsonO corpo da requisição não é JSON válido
401missing_authorizationNenhum token Bearer informado
401invalid_api_keyChave de API desconhecida ou incorreta
401revoked_api_keyA chave foi revogada
401expired_api_keyA chave expirou após a rotação
401invalid_oauth_tokenToken OAuth inválido ou expirado
402upgrade_requiredA ação exige um plano pago (Pro ou superior) ou um recurso que o plano não inclui (por exemplo, exportar em PDF)
403insufficient_scopeA credencial não tem o escopo exigido por este endpoint
403session_limitO espaço de trabalho já está com o número de sessões ao vivo simultâneas do seu plano (POST /sessions)
404not_foundRecurso não encontrado
409already_votedEste voterId já votou na enquete (POST /votes)
409already_respondedEsta pessoa já respondeu ao slide (POST /responses)
422validation_failedO corpo da requisição falhou na validação de esquema
429rate_limitedRequisições demais. Tente de novo após a janela reiniciar
500internal_errorErro 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:

Repetição com espera (JavaScript)
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:

errorSignificado
invalid_requestParâmetros ausentes ou malformados
invalid_clientclient_id desconhecido ou client_secret incorreto
access_deniedO cliente está revogado, limitado por taxa (429), ou o espaço de trabalho está no plano Free (402)
unsupported_grant_typeSomente client_credentials é suportado

Ainda tem dúvidas?

Nossa equipe terá prazer em ajudar.

Fale conosco

Os cookies essenciais mantêm a sua sessão iniciada e evitam votos duplicados. Com a sua autorização, também utilizamos o Cloudflare Web Analytics para contar visualizações de páginas e o Whop Pixel para saber que visitas levam a uma compra. Política de cookies