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ête | Signification |
|---|---|
RateLimit-Limit | Requêtes par fenêtre : 120. |
RateLimit-Remaining | Requêtes restantes dans la fenêtre en cours. |
RateLimit-Reset | Secondes avant le début de la prochaine fenêtre. |
Retry-After | Uniquement en cas de 429 : secondes avant la prochaine tentative. |
HTTP/1.1 200 OK
RateLimit-Limit: 120
RateLimit-Remaining: 3
RateLimit-Reset: 17Attendre 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_sinceplutôt que de récupérer à nouveau toute la liste.PUT /menuetPOST /menu/availability(jusqu'à 500 entrées) plutôt que des centaines d'appelsPATCHisolé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.