Guide développeur
Limites de débit et erreurs
L'API PollsLive applique des limites de débit par clé et renvoie des objets d'erreur JSON cohérents avec des codes lisibles par machine.
Limites de débit
Les limites s'appliquent par clé d'API (ou par client OAuth) et par minute. Dépasser la limite renvoie 429 Too Many Requests.
| Groupe de points de terminaison | Limite | Fenêtre |
|---|---|---|
Tous les points de terminaison /api/v1/ | 120 requêtes | 1 minute |
POST /api/v1/polls | 20 requêtes (en plus des 120) | 1 minute par clé |
POST /api/v1/media | 30 requêtes | 1 minute |
GET /api/v1/polls/{id}/export?format=pdf | 10 requêtes | 1 heure par espace de travail |
POST /api/oauth/token | 10 requêtes | 1 minute par client_id |
Besoin de limites plus élevées pour votre intégration ? Contactez notre équipe.
Les sessions en direct ouvertes simultanément constituent un plafond distinct, et non une limite de débit : Free 1 salle, Pro 1 par licence de présentateur, Premium 2. L'atteindre renvoie 403 avec le code session_limit. Fermez une salle depuis Studio (ou via POST /api/v1/sessions/{id}/control avec end) avant d'en ouvrir une autre.
En-têtes de limite
Les réponses JSON portent des en-têtes de métadonnées de limite :
X-RateLimit-Limit: 120
X-RateLimit-Window: 60sDépasser la limite renvoie 429 avec le code rate_limited. Patientez avant de réessayer. Il n'y a pas d'en-tête Retry-After.
Format des réponses d'erreur
Toutes les erreurs de l'API renvoient un corps JSON contenant un objet error imbriqué avec un code lisible par machine et un message lisible par un humain :
HTTP/1.1 404 Not Found
Content-Type: application/json
{
"error": {
"code": "not_found",
"message": "Poll not found."
}
}Les erreurs de validation renvoient 422 avec un champ details dans l'objet d'erreur :
{
"error": {
"code": "validation_failed",
"message": "Request validation failed.",
"details": {
"fieldErrors": { "title": ["String must contain at least 1 character(s)"] },
"formErrors": []
}
}
}Les erreurs du jeton OAuth suivent en revanche le format RFC 6749 §5.2 :
{
"error": "invalid_client",
"error_description": "Invalid client credentials."
}Codes d'erreur
| Statut HTTP | code | Signification |
|---|---|---|
| 400 | invalid_json | Le corps de la requête n'est pas du JSON valide |
| 401 | missing_authorization | Aucun jeton Bearer fourni |
| 401 | invalid_api_key | Clé d'API inconnue ou incorrecte |
| 401 | revoked_api_key | La clé a été révoquée |
| 401 | expired_api_key | La clé a expiré après rotation |
| 401 | invalid_oauth_token | Jeton OAuth invalide ou expiré |
| 402 | upgrade_required | L'action requiert un forfait payant (Pro ou plus), ou une fonctionnalité absente du forfait (par ex. l'export PDF) |
| 403 | insufficient_scope | L'identifiant n'a pas la portée exigée par ce point de terminaison |
| 403 | session_limit | L'espace de travail a déjà ouvert le nombre de sessions simultanées de son forfait (POST /sessions) |
| 404 | not_found | Ressource introuvable |
| 409 | already_voted | Ce voterId a déjà voté sur ce sondage (POST /votes) |
| 409 | already_responded | Ce votant a déjà répondu à cette diapositive (POST /responses) |
| 422 | validation_failed | Le corps de la requête a échoué à la validation du schéma |
| 429 | rate_limited | Trop de requêtes. Réessayez après la réinitialisation de la fenêtre |
| 500 | internal_error | Erreur serveur inattendue |
Relances et temporisation
Nous recommandons une stratégie de temporisation exponentielle avec gigue pour les intégrations en production :
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");
}Ne relancez pas sur les erreurs 4xx (hormis 429) : elles signalent un problème dans votre requête que la relance ne résoudra pas.
Format d'erreur OAuth
Le point de terminaison de jeton (POST /api/oauth/token) renvoie les erreurs au format RFC 6749 :
| error | Signification |
|---|---|
invalid_request | Paramètres manquants ou mal formés |
invalid_client | client_id inconnu ou client_secret incorrect |
access_denied | Le client est révoqué, limité en débit (429), ou l'espace de travail est sur le forfait Free (402) |
unsupported_grant_type | Seul client_credentials est pris en charge |
Vous avez encore des questions ?
Notre équipe se fera un plaisir de vous aider.