Saltar al contenido

Guía para desarrolladores

Límites de tasa y errores

La API de PollsLive aplica límites de tasa por clave y devuelve objetos de error JSON coherentes con códigos legibles por máquina.

Límites de tasa

Los límites se aplican por clave de API (o por cliente OAuth) y por minuto. Superar el límite devuelve 429 Too Many Requests.

Grupo de endpointsLímiteVentana
Todos los endpoints /api/v1/120 peticiones1 minuto
POST /api/v1/polls20 peticiones (además de las 120)1 minuto por clave
POST /api/v1/media30 peticiones1 minuto
GET /api/v1/polls/{id}/export?format=pdf10 peticiones1 hora por espacio de trabajo
POST /api/oauth/token10 peticiones1 minuto por client_id

¿Necesitas límites más altos para tu integración? Contacta con nuestro equipo.

Las sesiones en vivo abiertas a la vez son un límite aparte, no de tasa de peticiones: Free 1 sala, Pro 1 por licencia de presentador, Premium 2. Alcanzarlo devuelve 403 con el código session_limit. Cierra una sala desde Studio (o con POST /api/v1/sessions/{id}/control y end) antes de abrir otra.

Cabeceras de límite

Las respuestas JSON incluyen cabeceras con metadatos del límite:

Cabeceras de respuesta
X-RateLimit-Limit: 120
X-RateLimit-Window: 60s

Superar el límite devuelve 429 con el código rate_limited. Espera antes de reintentar. No hay cabecera Retry-After.

Formato de respuesta de error

Todos los errores de la API devuelven un cuerpo JSON con un objeto error anidado que contiene un code legible por máquina y un message legible por humanos:

Error estándar
HTTP/1.1 404 Not Found
Content-Type: application/json

{
  "error": {
    "code": "not_found",
    "message": "Poll not found."
  }
}

Los errores de validación devuelven 422 con un campo details dentro del objeto de error:

Error de validación
{
  "error": {
    "code": "validation_failed",
    "message": "Request validation failed.",
    "details": {
      "fieldErrors": { "title": ["String must contain at least 1 character(s)"] },
      "formErrors": []
    }
  }
}

Los errores del token OAuth siguen en cambio el formato RFC 6749 §5.2:

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

Códigos de error

Estado HTTPcodeSignificado
400invalid_jsonEl cuerpo de la petición no es JSON válido
401missing_authorizationNo se envió token Bearer
401invalid_api_keyClave de API desconocida o incorrecta
401revoked_api_keyLa clave fue revocada
401expired_api_keyLa clave caducó tras la rotación
401invalid_oauth_tokenEl token OAuth no es válido o ha caducado
402upgrade_requiredLa acción requiere un plan de pago (Pro o superior), o una función que el plan no incluye (por ejemplo, exportar a PDF)
403insufficient_scopeLa credencial no tiene el ámbito que exige este endpoint
403session_limitEl espacio de trabajo ya tiene abiertas las sesiones en vivo simultáneas de su plan (POST /sessions)
404not_foundRecurso no encontrado
409already_votedEste voterId ya votó en la encuesta (POST /votes)
409already_respondedEste votante ya respondió a la diapositiva (POST /responses)
422validation_failedEl cuerpo de la petición no pasó la validación de esquema
429rate_limitedDemasiadas peticiones: reintenta cuando se reinicie la ventana
500internal_errorError inesperado del servidor

Reintentos y espera

Recomendamos una estrategia de espera exponencial con variación aleatoria para integraciones en producción:

Reintento con 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");
}

No reintentes ante errores 4xx (salvo el 429): indican un problema en tu petición que no se resolverá reintentando.

Formato de error de OAuth

El endpoint de token (POST /api/oauth/token) devuelve errores en formato RFC 6749:

errorSignificado
invalid_requestParámetros ausentes o mal formados
invalid_clientclient_id desconocido o client_secret incorrecto
access_deniedEl cliente está revocado, limitado por tasa (429), o el espacio de trabajo está en el plan Free (402)
unsupported_grant_typeSolo se admite client_credentials

¿Aún tienes preguntas?

Nuestro equipo estará encantado de ayudarte.

Contáctanos

Usamos cookies esenciales para mantener tu sesión iniciada y evitar votos duplicados. Con tu permiso, también usamos Cloudflare Web Analytics para contar las visitas a las páginas y el Whop Pixel para ver qué visitas terminan en una compra. Política de cookies