API FlavosoFondamentauxLimites de requêtes

Limites de requêtes

120 requêtes par minute et par connexion. Chaque réponse indique ce qu'il reste ; au-delà, vous recevez un 429 avec Retry-After.

La limite

Chaque connexion peut effectuer 120 requêtes par minute. La limite s'applique par connexion, donc par établissement : une application avec de nombreux établissements dispose d'un quota propre pour chacun. La fenêtre dure 60 secondes et commence avec la première requête. GET /me indique la limite sous rate_limit.

Une caisse qui interroge les commandes toutes les dix secondes et signale des statuts entre-temps n'en approche jamais.

En-têtes

En-têteSignification
RateLimit-LimitRequêtes par fenêtre : 120.
RateLimit-RemainingRequêtes restantes dans la fenêtre en cours.
RateLimit-ResetSecondes avant le début de la prochaine fenêtre.
Retry-AfterUniquement en cas de 429 : secondes avant la prochaine tentative.
HTTP/1.1 200 OK
RateLimit-Limit: 120
RateLimit-Remaining: 3
RateLimit-Reset: 17

Attendre et réessayer

En cas de 429 rate_limited, attendez Retry-After secondes et renvoyez la même requête. Si RateLimit-Remaining vaut 0, attendez d'emblée jusqu'à RateLimit-Reset. Gérez l'attente par connexion, et non pour toute votre application.

// One queue per connection: the limit counts per connection (= per restaurant).
const pausedUntil = new Map(); // connection id → time

export async function send(conn, request) {
  const wait = (pausedUntil.get(conn.id) ?? 0) - Date.now();
  if (wait > 0) await new Promise((r) => setTimeout(r, wait));
  const res = await request();
  const remaining = Number(res.headers.get("ratelimit-remaining"));
  const reset = Number(res.headers.get("ratelimit-reset"));
  if (res.status === 429) {
    pausedUntil.set(conn.id, Date.now() + Number(res.headers.get("retry-after") ?? 1) * 1000);
    return send(conn, request); // the same request again, after the pause
  }
  if (remaining === 0 && reset > 0) pausedUntil.set(conn.id, Date.now() + reset * 1000);
  return res;
}

Économiser les requêtes

  • Des webhooks ou GET /events plutôt qu'une interrogation permanente.
  • updated_since plutôt que de récupérer à nouveau toute la liste.
  • PUT /menu et POST /menu/availability (jusqu'à 500 entrées) plutôt que des centaines d'appels PATCH isolés.
  • Lire la carte une fois, puis suivre les événements menu.*.

Authentifications échouées

Les requêtes avec un jeton inconnu de Flavoso, ou sans jeton, sont en outre comptées par adresse IP. Si plus de 30 par minute proviennent d'une même adresse, Flavoso répond 429 au lieu de 401. Un jeton expiré ou révoqué qui vous appartient ne compte pas : il reçoit toujours 401, afin que vous puissiez le rafraîchir, même pour de nombreux établissements à la fois. Si vous servez de nombreux établissements depuis un même serveur, marquez une connexion comme déconnectée dès qu'un 401 est suivi de invalid_grant au rafraîchissement, au lieu de réessayer encore et encore.

Le point de terminaison des jetons a ses propres limites ; il répond alors 429 temporarily_unavailable avec Retry-After.

Une question reste ouverte ? Écrivez à support@flavoso.com en indiquant l'identifiant de X-Request-Id. Il nous permet de retrouver votre requête dans le journal.