Aller au contenu principal

Rate Limiting

L'API MyTelevision applique un rate limiting par profil (et non par compte) pour proteger la plateforme et garantir une qualite de service equitable. Le rate limiting est base sur Redis et est distribue (cluster-safe).

Limites par defaut

L'API utilise trois tiers de rate limiting :

TierLimiteFenetreUtilisation
Short3 requetes1 secondeEndpoints sensibles (login, register)
Medium20 requetes10 secondesEndpoints d'ecriture (POST, PATCH, DELETE)
Long100 requetes1 minuteEndpoints de lecture (GET)

Limites par categorie d'endpoint

CategorieTierLimiteDetails
POST /auth/loginShort5 tentatives / 15 minAnti brute-force
POST /auth/registerShort3 req / 1 secAnti-spam
POST /auth/refreshMedium20 req / 10 secRefresh token
GET /movies, GET /seriesLong100 req / 1 minLecture de contenu
POST /reactionsMedium20 req / 10 secEngagement
POST /viewsMedium20 req / 10 secTracking de vues
POST /signalsSpecifique60 req / 1 minSignaux unitaires
POST /signals/batchSpecifique10 req / 1 minSignaux en batch
POST /streaming/tokenMedium20 req / 10 secTokens de streaming
POST /account/2fa/verify-2faSpecifique5 req / 1 minVerification 2FA
Endpoints de lecture generauxLong100 req / 1 minTous les GET

Headers de reponse

Chaque reponse de l'API inclut des headers de rate limiting :

X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1702800000
HeaderDescription
X-RateLimit-LimitNombre total de requetes autorisees dans la fenetre
X-RateLimit-RemainingNombre de requetes restantes
X-RateLimit-ResetTimestamp UNIX de la reinitialisation du compteur

En cas de depassement (429)

Quand la limite est atteinte, l'API retourne un code 429 Too Many Requests avec le header supplementaire :

HTTP/1.1 429 Too Many Requests
Retry-After: 60
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1702800060
{
"statusCode": 429,
"message": "Rate limit exceeded",
"error": "Too Many Requests"
}

Cle de rate limiting

Le rate limiting est applique par combinaison de :

(tenant_id, profile_id, tier)
Important

Le rate limiting est par profil et non par compte. Changer de profil, de device ou de session ne permet pas de contourner les limites.

Bonnes pratiques

Implementer un retry avec backoff exponentiel

async function fetchWithRetry(url: string, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
return await api.get(url);
} catch (error) {
if (error.response?.status === 429) {
const retryAfter = error.response.headers['retry-after'];
const delay = retryAfter
? parseInt(retryAfter) * 1000
: Math.pow(2, i) * 1000;
await new Promise((resolve) => setTimeout(resolve, delay));
} else {
throw error;
}
}
}
throw new Error('Max retries exceeded');
}

Surveiller les headers

function checkRateLimit(response: AxiosResponse) {
const remaining = parseInt(response.headers['x-ratelimit-remaining']);
const limit = parseInt(response.headers['x-ratelimit-limit']);

if (remaining < limit * 0.1) {
console.warn(`Rate limit warning: ${remaining}/${limit} remaining`);
}
}

Strategies de reduction des appels

  1. Mise en cache cote client -- Cacher les reponses qui changent peu (genres, categories, plans)
  2. Batching -- Utiliser les endpoints batch quand disponibles (POST /signals/batch)
  3. Debouncing -- Limiter les appels sur les champs de recherche
  4. Pagination raisonnable -- Ne pas demander plus de 50 items par page
  5. Conditional requests -- Utiliser les headers If-None-Match / If-Modified-Since quand supportes