Codes d'erreur
Reference complete des codes d'erreur retournes par l'API MyTelevision v2.
Codes HTTP
| Code | Signification | Action recommandee |
|---|---|---|
200 | OK | Requete reussie |
201 | Created | Ressource creee avec succes |
204 | No Content | Suppression reussie / pas de contenu |
400 | Bad Request | Verifier le format de la requete |
401 | Unauthorized | Verifier le token d'authentification |
403 | Forbidden | Verifier les permissions |
404 | Not Found | Verifier l'identifiant de la ressource |
409 | Conflict | La ressource existe deja |
422 | Unprocessable Entity | Donnees invalides (validation echouee) |
429 | Too Many Requests | Rate limit atteint, attendre avant de reessayer |
500 | Internal Server Error | Erreur serveur, contacter le support |
502 | Bad Gateway | Erreur de gateway |
503 | Service Unavailable | Service temporairement indisponible |
Format d'erreur standard
Toutes les erreurs suivent le meme format :
{
"statusCode": 400,
"message": "Validation failed",
"error": "Bad Request",
"timestamp": "2025-01-15T10:30:00.000Z",
"path": "/api/v2/movies",
"details": [
{
"field": "title",
"message": "title must be a string"
}
]
}
| Champ | Type | Description |
|---|---|---|
statusCode | number | Code HTTP |
message | string | Message d'erreur lisible |
error | string | Type d'erreur |
timestamp | string | Date/heure de l'erreur (ISO 8601) |
path | string | Endpoint appele |
details | array | Details de validation (optionnel) |
Erreurs par module
Authentication (AUTH_*)
| Code | Message | Description | Solution |
|---|---|---|---|
AUTH_001 | Invalid credentials | Email ou mot de passe incorrect | Verifier les credentials |
AUTH_002 | Token expired | JWT expire | Utiliser le refresh token |
AUTH_003 | Invalid token | Token malforme ou invalide | Se reconnecter |
AUTH_004 | Account suspended | Compte suspendu par l'administration | Contacter le support |
AUTH_005 | Account locked | Trop de tentatives de connexion | Attendre 15 minutes |
AUTH_006 | Email not verified | Adresse email non verifiee | Verifier l'email |
Accounts (ACCOUNT_*)
| Code | Message | Description |
|---|---|---|
ACCOUNT_001 | Email already exists | Email deja utilise par un autre compte |
ACCOUNT_002 | Max profiles reached | Maximum de 4 profils atteint |
ACCOUNT_003 | Cannot delete default | Le profil par defaut ne peut pas etre supprime |
ACCOUNT_004 | PIN required | PIN necessaire pour acceder au profil |
ACCOUNT_005 | PIN incorrect | Code PIN invalide |
ACCOUNT_006 | PIN locked | Trop de tentatives PIN (verrouille 15 min) |
Content (CONTENT_*)
| Code | Message | Description |
|---|---|---|
CONTENT_001 | Not found | Contenu introuvable |
CONTENT_002 | Access denied | Acces refuse au contenu |
CONTENT_003 | Subscription required | Abonnement requis pour ce contenu |
CONTENT_004 | Region blocked | Contenu indisponible dans cette region |
Streaming (STREAM_*)
| Code | Message | Description |
|---|---|---|
STREAM_001 | Token expired | Token de streaming expire |
STREAM_002 | Max uses exceeded | Nombre maximum d'utilisations atteint |
STREAM_003 | IP mismatch | IP differente de celle du token |
STREAM_004 | Token revoked | Token revoque |
STREAM_005 | DRM error | Erreur de gestion DRM |
Engagement (ENGAGE_*)
| Code | Message | Description |
|---|---|---|
ENGAGE_001 | Already reacted | Reaction deja existante |
ENGAGE_002 | Already favorited | Contenu deja en favori |
ENGAGE_003 | Cooldown active | Cooldown de 30 min entre vues du meme contenu |
Devices (DEVICE_*)
| Code | HTTP | Description |
|---|---|---|
DEVICE_001 | 404 | Appareil introuvable |
DEVICE_002 | 409 | Limite d'appareils depassee |
DEVICE_003 | 403 | Impossible de revoquer l'appareil courant |
DEVICE_004 | 403 | Appareil marque comme suspect |
DEVICE_005 | 400 | Empreinte (fingerprint) invalide |
Sessions (SESSION_*)
| Code | HTTP | Description |
|---|---|---|
SESSION_001 | 404 | Session introuvable |
SESSION_002 | 403 | Impossible de revoquer la session courante |
SESSION_003 | 403 | Session appartenant a un autre compte |
SESSION_004 | 401 | Session revoquee |
SESSION_005 | 401 | Session expiree |
SESSION_006 | 403 | Re-authentification requise |
Signals (SIGNAL_*)
| Code | HTTP | Description |
|---|---|---|
SIGNAL_001 | 400 | Type de signal invalide |
SIGNAL_002 | 400 | ID de contenu invalide |
SIGNAL_003 | 400 | Batch trop volumineux (max 100 signaux) |
SIGNAL_004 | 429 | Rate limit depasse |
Subscriptions (SUB_*)
| Code | HTTP | Description |
|---|---|---|
SUB_001 | 404 | Aucun abonnement actif |
SUB_002 | 409 | Deja abonne |
SUB_003 | 409 | Periode d'essai deja utilisee |
SUB_004 | 400 | ID de plan invalide |
SUB_005 | 402 | Paiement requis |
SUB_006 | 402 | Paiement echoue |
SUB_007 | 409 | Impossible de reactiver |
Risk (RISK_*)
| Code | HTTP | Description |
|---|---|---|
RISK_001 | 404 | Evenement de risque introuvable |
RISK_002 | 400 | Evenement deja acquitte |
RISK_003 | 403 | Acces aux evenements d'un autre compte interdit |
Rate Limiting (RATE_*)
| Code | Message | Description |
|---|---|---|
RATE_001 | Rate limit exceeded | Limite de requetes atteinte |
Validation (VALID_*)
| Code | Message | Description |
|---|---|---|
VALID_001 | Required field | Champ obligatoire manquant |
VALID_002 | Invalid format | Format invalide |
VALID_003 | Too short | Valeur trop courte |
VALID_004 | Too long | Valeur trop longue |
VALID_005 | Invalid enum | Valeur non autorisee pour l'enumeration |
Gestion des erreurs cote client
JavaScript / TypeScript
import axios from 'axios';
const api = axios.create({
baseURL: 'https://api.mytelevision.app/api/v2',
});
try {
const response = await api.get('/movies');
return response.data;
} catch (error) {
if (axios.isAxiosError(error) && error.response) {
switch (error.response.status) {
case 401:
// Token expire : rafraichir le token ou rediriger vers le login
await refreshToken();
break;
case 403:
// Acces refuse : verifier les permissions ou l'abonnement
showAccessDenied();
break;
case 429:
// Rate limit : attendre et reessayer
const retryAfter = error.response.headers['retry-after'];
await delay(parseInt(retryAfter) * 1000);
break;
default:
// Afficher le message d'erreur de l'API
console.error(error.response.data.message);
}
}
}
Retry avec backoff exponentiel
async function fetchWithRetry(url: string, maxRetries = 3): Promise<any> {
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
return await api.get(url);
} catch (error) {
if (axios.isAxiosError(error) && error.response?.status === 429) {
const delay = Math.pow(2, attempt) * 1000;
await new Promise((resolve) => setTimeout(resolve, delay));
} else {
throw error;
}
}
}
throw new Error('Nombre maximum de tentatives atteint');
}