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 endpoints | Límite | Ventana |
|---|---|---|
Todos los endpoints /api/v1/ | 120 peticiones | 1 minuto |
POST /api/v1/polls | 20 peticiones (además de las 120) | 1 minuto por clave |
POST /api/v1/media | 30 peticiones | 1 minuto |
GET /api/v1/polls/{id}/export?format=pdf | 10 peticiones | 1 hora por espacio de trabajo |
POST /api/oauth/token | 10 peticiones | 1 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:
X-RateLimit-Limit: 120
X-RateLimit-Window: 60sSuperar 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:
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": {
"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": "invalid_client",
"error_description": "Invalid client credentials."
}Códigos de error
| Estado HTTP | code | Significado |
|---|---|---|
| 400 | invalid_json | El cuerpo de la petición no es JSON válido |
| 401 | missing_authorization | No se envió token Bearer |
| 401 | invalid_api_key | Clave de API desconocida o incorrecta |
| 401 | revoked_api_key | La clave fue revocada |
| 401 | expired_api_key | La clave caducó tras la rotación |
| 401 | invalid_oauth_token | El token OAuth no es válido o ha caducado |
| 402 | upgrade_required | La acción requiere un plan de pago (Pro o superior), o una función que el plan no incluye (por ejemplo, exportar a PDF) |
| 403 | insufficient_scope | La credencial no tiene el ámbito que exige este endpoint |
| 403 | session_limit | El espacio de trabajo ya tiene abiertas las sesiones en vivo simultáneas de su plan (POST /sessions) |
| 404 | not_found | Recurso no encontrado |
| 409 | already_voted | Este voterId ya votó en la encuesta (POST /votes) |
| 409 | already_responded | Este votante ya respondió a la diapositiva (POST /responses) |
| 422 | validation_failed | El cuerpo de la petición no pasó la validación de esquema |
| 429 | rate_limited | Demasiadas peticiones: reintenta cuando se reinicie la ventana |
| 500 | internal_error | Error inesperado del servidor |
Reintentos y espera
Recomendamos una estrategia de espera exponencial con variación aleatoria para integraciones en producción:
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:
| error | Significado |
|---|---|
invalid_request | Parámetros ausentes o mal formados |
invalid_client | client_id desconocido o client_secret incorrecto |
access_denied | El cliente está revocado, limitado por tasa (429), o el espacio de trabajo está en el plan Free (402) |
unsupported_grant_type | Solo se admite client_credentials |
¿Aún tienes preguntas?
Nuestro equipo estará encantado de ayudarte.