TrustyData Docs
Site Tarifs Contact

Codes d'erreur

L'API utilise les codes HTTP standards. Tous les corps de réponse en erreur suivent le format {"detail": "<description>"} (ou un tableau pour les erreurs de validation).

Vue d'ensemble

CodeFamilleCause typique
200OKSuccès, lire le corps
400ClientRequête malformée (query trop courte, JSON invalide)
401AuthClé manquante ou invalide
403AuthPlan insuffisant pour cet endpoint
404ClientRessource inexistante (identifiant BAN inconnu)
422ClientValidation Pydantic (paramètres incohérents)
429QuotaQuota mensuel dépassé
500ServeurErreur interne (parser, Meilisearch, moteur de traitement)
503ServeurService d'authentification temporairement indisponible

Réussite particulière : 200 OK sans match

Une recherche qui ne retourne aucun résultat reste un succès HTTP. Le champ status du corps signale la situation :

{
  "status": "no_results",
  "message": "No verified match found",
  "matches": []
}

De même pour une requête trop courte sur /address/autocomplete :

{
  "status": "TOO_SHORT",
  "message": "The request is too short, complete your input",
  "suggestions": []
}

Côté code client : testez systématiquement status avant de consommer suggestions / matches / results.

400 Bad Request

La requête est malformée : query q manquante, JSON corps non valide, paramètre obligatoire absent.

{ "detail": "Request too short or invalid" }

Action : corriger la requête côté client. Ces erreurs ne sont pas comptées dans le quota.

401 Unauthorized

Le header Authorization est absent, mal formé, ou la clé n'est plus valide (révoquée, compte fermé).

{ "detail": "API key required. Please provide a valid API key in the Authorization header." }
{ "detail": "Invalid API key" }

Action : vérifier le header (préfixe Bearer obligatoire, sans guillemets autour de la clé), vérifier que la clé n'a pas été révoquée dans l'espace client.

403 Forbidden

La clé est valide mais son plan ne donne pas accès à l'endpoint appelé. Cas typique : appel de /route/compute avec une clé Growth (réservé Business).

{ "detail": "Your plan (GROWTH) does not have access to this service. Please upgrade your plan." }

Action : upgrader le plan, ou utiliser un endpoint accessible — voir Plans & quotas.

404 Not Found

L'identifiant fourni (typiquement à GET /address/view/{id}) ne correspond à aucune adresse de la base BAN.

Action : vérifier l'identifiant. Les IDs peuvent évoluer entre deux millésimes BAN si une voie est renommée — préférer toujours id_ban au champ id interne pour le stockage long terme.

422 Unprocessable Entity

Validation Pydantic — les paramètres passent le format mais violent une règle métier. Le corps liste les erreurs en détail.

{
  "detail": [
    {
      "type": "value_error",
      "loc": [],
      "msg": "Value error, population_min must be less than or equal to population_max",
      "input": { "population_min": 1500, "population_max": 150 }
    }
  ]
}

Côté /route/*, un 422 peut aussi signifier qu'une adresse fournie en bornes n'a pas pu être résolue contre la BAN.

Action : lire msg et loc, corriger le payload.

429 Too Many Requests

Le quota mensuel est dépassé. Concerne d'abord le plan Discovery (5 000 requêtes / mois — hard cap) ; les autres plans suivent les volumes contractuels.

{ "detail": "Rate limit exceeded. Max allowed usage for plan DISCOVERY is 5000 requests." }
{ "detail": "Your plan (STARTER) has exceeded the rate limit for this service. Please upgrade your plan." }

Action : attendre la prochaine période de facturation, ou upgrader. Il n'y a pas de header Retry-After pour l'instant — le quota se réinitialise au début de la période mensuelle de votre abonnement.

500 Internal Server Error

Erreur côté API : parser d'adresses indisponible, Meilisearch en surcharge, moteur de traitement injoignable sur les endpoints de routage.

Action : retry avec un backoff exponentiel (1s, 3s, 9s, 27s…). Si les 500 persistent au-delà de quelques minutes, contactez-nous avec les X-Request-ID des appels concernés (à venir).

503 Service Unavailable

Le service d'authentification (validation de votre clé) est temporairement injoignable. L'API préfère échouer explicitement plutôt que de servir des requêtes sans vérifier l'identité.

{ "detail": "Authentication service unavailable" }

Action : retry avec backoff exponentiel. La durée typique d'indisponibilité est de l'ordre de la seconde — si ça persiste, contactez-nous.

Pattern de retry recommandé

Pour les codes 500, 502, 503, 504 : backoff exponentiel avec jitter. Pour 429 : pas de retry — c'est une erreur structurelle, attendez le reset. Pour 4xx (autre que 429) : pas de retry — corrigez la requête.

import time, random, requests

def call_with_retry(url, headers, params=None, json=None, max_attempts=4):
    for attempt in range(max_attempts):
        r = requests.get(url, headers=headers, params=params, timeout=10) \
            if json is None else \
            requests.post(url, headers=headers, json=json, timeout=10)
        if r.status_code < 500 and r.status_code != 429:
            return r          # succès ou erreur cliente, on rend
        if r.status_code == 429 or attempt == max_attempts - 1:
            return r          # quota: pas de retry. Dernier essai: rend.
        sleep = (2 ** attempt) + random.random()
        time.sleep(sleep)     # 1s, 3s, 7s, ... avec jitter

Prochains pas