Entwickler-Leitfaden
Ratenlimits & Fehler
Die PollsLive-API arbeitet mit Ratenlimits pro Schlüssel und liefert einheitliche JSON-Fehlerobjekte mit maschinenlesbaren Codes.
Ratenlimits
Die Limits gelten pro API-Schlüssel (oder pro OAuth-Client) und Minute. Wird das Limit überschritten, folgt 429 Too Many Requests.
| Endpunktgruppe | Limit | Zeitfenster |
|---|---|---|
Alle /api/v1/-Endpunkte | 120 Anfragen | 1 Minute |
POST /api/v1/polls | 20 Anfragen (zusätzlich zu den 120) | 1 Minute pro Schlüssel |
POST /api/v1/media | 30 Anfragen | 1 Minute |
GET /api/v1/polls/{id}/export?format=pdf | 10 Anfragen | 1 Stunde pro Workspace |
POST /api/oauth/token | 10 Anfragen | 1 Minute pro client_id |
Brauchst du höhere Limits für deine Integration? Wende dich an unser Team.
Gleichzeitig offene Live-Sitzungen sind eine eigene Obergrenze, kein Ratenlimit: Free 1 Raum, Pro 1 pro Präsentator-Lizenz, Premium 2. Wird sie erreicht, folgt 403 mit dem Code session_limit. Beende einen Raum in Studio (oder per POST /api/v1/sessions/{id}/control mit end), bevor du einen weiteren öffnest.
Ratenlimit-Header
JSON-Antworten führen Metadaten-Header zum Ratenlimit mit:
X-RateLimit-Limit: 120
X-RateLimit-Window: 60sEin überschrittenes Limit liefert 429 mit dem Fehlercode rate_limited. Warte, bevor du es erneut versuchst. Einen Retry-After-Header gibt es nicht.
Format der Fehlerantwort
Alle API-Fehler liefern einen JSON-Body mit einem verschachtelten error-Objekt, das einen maschinenlesbaren code und eine lesbare message enthält:
HTTP/1.1 404 Not Found
Content-Type: application/json
{
"error": {
"code": "not_found",
"message": "Poll not found."
}
}Validierungsfehler liefern 422 mit einem Feld details im Fehlerobjekt:
{
"error": {
"code": "validation_failed",
"message": "Request validation failed.",
"details": {
"fieldErrors": { "title": ["String must contain at least 1 character(s)"] },
"formErrors": []
}
}
}OAuth-Token-Fehler folgen stattdessen dem Format RFC 6749 §5.2:
{
"error": "invalid_client",
"error_description": "Invalid client credentials."
}Fehlercodes
| HTTP-Status | Code | Bedeutung |
|---|---|---|
| 400 | invalid_json | Der Request-Body ist kein gültiges JSON |
| 401 | missing_authorization | Kein Bearer-Token übergeben |
| 401 | invalid_api_key | Unbekannter oder falscher API-Schlüssel |
| 401 | revoked_api_key | Der Schlüssel wurde widerrufen |
| 401 | expired_api_key | Der Schlüssel ist nach der Rotation abgelaufen |
| 401 | invalid_oauth_token | OAuth-Token ungültig oder abgelaufen |
| 402 | upgrade_required | Die Aktion erfordert einen kostenpflichtigen Tarif (Pro und höher) oder eine Funktion, die der Tarif nicht enthält (z. B. PDF-Export) |
| 403 | insufficient_scope | Der Zugangsdatei fehlt der Scope, den dieser Endpunkt verlangt |
| 403 | session_limit | Der Workspace hat bereits so viele Live-Sitzungen offen, wie sein Tarif erlaubt (POST /sessions) |
| 404 | not_found | Ressource nicht gefunden |
| 409 | already_voted | Diese voterId hat bereits an der Umfrage abgestimmt (POST /votes) |
| 409 | already_responded | Diese Person hat die Folie bereits beantwortet (POST /responses) |
| 422 | validation_failed | Der Request-Body hat die Schemavalidierung nicht bestanden |
| 429 | rate_limited | Zu viele Anfragen. Nach dem Zurücksetzen des Fensters erneut versuchen |
| 500 | internal_error | Unerwarteter Serverfehler |
Wiederholungen & Backoff
Für Produktionsintegrationen empfehlen wir exponentielles Backoff mit Jitter:
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");
}Wiederhole nicht bei 4xx-Fehlern (außer 429). Sie weisen auf ein Problem in deiner Anfrage hin, das sich durch Wiederholen nicht löst.
OAuth-Fehlerformat
Der Token-Endpunkt (POST /api/oauth/token) liefert Fehler im RFC-6749-Format:
| Fehler | Bedeutung |
|---|---|
invalid_request | Fehlende oder fehlerhafte Parameter |
invalid_client | Unbekannte client_id oder falsches client_secret |
access_denied | Client widerrufen, ratenbegrenzt (429), oder der Workspace ist im Free-Tarif (402) |
unsupported_grant_type | Nur client_credentials wird unterstützt |
Hast du noch Fragen?
Unser Team hilft dir gerne weiter.