Aller au contenu

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 terminaisonLimiteFenêtre
Tous les points de terminaison /api/v1/120 requêtes1 minute
POST /api/v1/polls20 requêtes (en plus des 120)1 minute par clé
POST /api/v1/media30 requêtes1 minute
GET /api/v1/polls/{id}/export?format=pdf10 requêtes1 heure par espace de travail
POST /api/oauth/token10 requêtes1 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 :

En-têtes de réponse
X-RateLimit-Limit: 120
X-RateLimit-Window: 60s

Dé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 :

Erreur standard
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 :

Erreur de validation
{
  "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 :

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

Codes d'erreur

Statut HTTPcodeSignification
400invalid_jsonLe corps de la requête n'est pas du JSON valide
401missing_authorizationAucun jeton Bearer fourni
401invalid_api_keyClé d'API inconnue ou incorrecte
401revoked_api_keyLa clé a été révoquée
401expired_api_keyLa clé a expiré après rotation
401invalid_oauth_tokenJeton OAuth invalide ou expiré
402upgrade_requiredL'action requiert un forfait payant (Pro ou plus), ou une fonctionnalité absente du forfait (par ex. l'export PDF)
403insufficient_scopeL'identifiant n'a pas la portée exigée par ce point de terminaison
403session_limitL'espace de travail a déjà ouvert le nombre de sessions simultanées de son forfait (POST /sessions)
404not_foundRessource introuvable
409already_votedCe voterId a déjà voté sur ce sondage (POST /votes)
409already_respondedCe votant a déjà répondu à cette diapositive (POST /responses)
422validation_failedLe corps de la requête a échoué à la validation du schéma
429rate_limitedTrop de requêtes. Réessayez après la réinitialisation de la fenêtre
500internal_errorErreur serveur inattendue

Relances et temporisation

Nous recommandons une stratégie de temporisation exponentielle avec gigue pour les intégrations en production :

Relance avec temporisation (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");
}

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 :

errorSignification
invalid_requestParamètres manquants ou mal formés
invalid_clientclient_id inconnu ou client_secret incorrect
access_deniedLe client est révoqué, limité en débit (429), ou l'espace de travail est sur le forfait Free (402)
unsupported_grant_typeSeul client_credentials est pris en charge

Vous avez encore des questions ?

Notre équipe se fera un plaisir de vous aider.

Contactez-nous

Les cookies essentiels vous gardent connecté et bloquent les votes en double. Avec votre accord, nous utilisons aussi Cloudflare Web Analytics pour compter les pages vues et le Whop Pixel pour savoir quelles visites mènent à un achat. Politique de cookies