Aller au contenu principal

Gestion des erreurs

L'API téo utilise les codes HTTP standards pour indiquer le succès ou l'échec d'une requête. Cette page vous aide à comprendre et résoudre les erreurs courantes.

Codes HTTP​

CodeSignificationDescription
200OKLa requête a réussi
201CreatedLa ressource a été créée avec succès
204No ContentSuccès sans contenu (suppression)
400Bad RequestRequête mal formée ou données invalides
401UnauthorizedToken manquant, expiré ou invalide
403ForbiddenAccès refusé à cette ressource
404Not FoundRessource introuvable
422Unprocessable EntityDonnées valides mais traitement impossible
429Too Many RequestsLimite de requêtes atteinte
500Internal Server ErrorErreur côté serveur

Format des erreurs​

Les erreurs sont retournées au format JSON-LD avec des détails sur le problème :

{
"@context": "/api/contexts/Error",
"@type": "hydra:Error",
"hydra:title": "An error occurred",
"hydra:description": "Description détaillée de l'erreur",
"violations": [
{
"propertyPath": "email",
"message": "Cette valeur n'est pas une adresse email valide."
}
]
}

Erreurs d'authentification (401)​

Token manquant​

Symptôme : "No authorization header found"

Solution : Ajoutez l'en-tête Authorization à votre requête :

curl -H "Authorization: Bearer VOTRE_TOKEN" https://teoapp.fr/api/...

Token expiré​

Symptôme : "Expired token" ou "Token has expired"

Solution : Obtenez un nouveau token. Les tokens expirent après 10 minutes.

// Exemple de renouvellement automatique
async function getToken() {
if (!token || isExpired(token)) {
token = await refreshToken();
}
return token;
}

Token invalide​

Symptôme : "Invalid token" ou "Signature verification failed"

Causes possibles :

  • Le token a été mal copié (caractères manquants)
  • Vous utilisez un token d'un autre environnement
  • Le token a été révoqué

Solution : Générez un nouveau token avec les bons identifiants.

Erreurs de validation (400/422)​

Données manquantes​

Symptôme : "This value should not be blank"

{
"violations": [
{
"propertyPath": "firstName",
"message": "Cette valeur ne doit pas être vide."
}
]
}

Solution : Vérifiez que tous les champs obligatoires sont renseignés.

Format invalide​

Symptôme : "This value is not valid"

Exemples courants :

  • Email mal formaté
  • Date dans un format incorrect
  • UUID invalide
{
"violations": [
{
"propertyPath": "email",
"message": "Cette valeur n'est pas une adresse email valide."
}
]
}

Solution : Vérifiez le format des données envoyées. Consultez la référence API pour les formats attendus.

Valeur non autorisée​

Symptôme : "The value you selected is not a valid choice"

{
"violations": [
{
"propertyPath": "status",
"message": "La valeur sélectionnée n'est pas un choix valide."
}
]
}

Solution : Utilisez une valeur parmi celles autorisées. Consultez le manuel de référence de l'API pour les valeurs possibles.

Erreurs d'accès (403)​

Ressource non accessible​

Symptôme : "Access Denied"

Causes possibles :

  • Votre token n'a pas les droits sur cette ressource
  • La ressource appartient à un autre téo
  • Votre compte n'a pas les permissions nécessaires

Solution : Vérifiez que :

  1. Vous utilisez le bon TEO_ID dans le scope
  2. La ressource existe dans votre périmètre
  3. Votre compte a les droits appropriés

Erreurs de ressource (404)​

Ressource introuvable​

Symptôme : "Not Found" ou "No route found"

Causes possibles :

  • L'UUID est incorrect
  • La ressource a été supprimée
  • L'endpoint n'existe pas

Solution :

# Vérifiez que l'endpoint existe
curl https://teoapp.fr/api/docs

# Vérifiez l'UUID
curl https://teoapp.fr/api/production/dossiers/UUID_CORRECT

Limite de requêtes (429)​

Trop de requêtes​

Symptôme : "Too Many Requests" avec un header Retry-After

Solution : Implémentez un système de retry avec backoff exponentiel :

async function fetchWithRetry(url, options, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
const response = await fetch(url, options);

if (response.status === 429) {
const retryAfter = response.headers.get('Retry-After') || 60;
await sleep(retryAfter * 1000);
continue;
}

return response;
}
throw new Error('Max retries exceeded');
}
Bonnes pratiques
  • Mettez en cache les données qui changent peu
  • Utilisez la pagination plutôt que de tout récupérer
  • Espacez vos requêtes en cas de traitement batch

Erreurs serveur (500)​

Erreur interne​

Symptôme : "Internal Server Error"

Solution :

  1. Réessayez dans quelques instants
  2. Si le problème persiste, contactez le support
  3. Incluez dans votre ticket :
    • L'endpoint appelé
    • Les données envoyées (sans informations sensibles)
    • L'heure exacte de l'erreur
    • L'ID de corrélation si présent dans la réponse

Debugging​

Activer les logs​

Loggez toutes vos requêtes et réponses pour faciliter le debug :

async function apiCall(endpoint, options = {}) {
console.log(`[API] ${options.method || 'GET'} ${endpoint}`);

const response = await fetch(`https://teoapp.fr/api${endpoint}`, {
...options,
headers: {
'Authorization': `Bearer ${token}`,
'Accept': 'application/ld+json',
...options.headers
}
});

const data = await response.json();

if (!response.ok) {
console.error(`[API] Error ${response.status}:`, data);
throw new ApiError(response.status, data);
}

return data;
}

Vérifier votre token​

Décodez votre token JWT pour vérifier son contenu :

# Le payload est la partie centrale (entre les deux points)
echo "VOTRE_TOKEN" | cut -d'.' -f2 | base64 -d | jq

Vérifiez notamment :

  • exp : timestamp d'expiration (doit être dans le futur)
  • scope : doit contenir votre TEO_ID

FAQ​

Mon token fonctionne une fois puis échoue​

Vérifiez que vous ne créez pas un nouveau token à chaque requête. Réutilisez le même token jusqu'à son expiration.

J'obtiens 403 sur une ressource que je viens de créer​

Il peut y avoir un léger délai de propagation. Attendez quelques secondes et réessayez.

Les accents ne s'affichent pas correctement​

Assurez-vous d'envoyer et recevoir en UTF-8 :

curl -H "Content-Type: application/json; charset=utf-8" ...

Comment tester sans données de production ?​

Utilisez l'environnement sandbox. Contactez le support pour obtenir un accès.