Aller au contenu principal

Gestion des erreurs

L'API Infoparcelle utilise les codes de statut HTTP standards et retourne des messages d'erreur détaillés en JSON.

Codes de statut HTTP

Codes de succès

CodeNomDescription
200OKRequête réussie, données retournées dans le corps de la réponse
201CreatedRessource créée avec succès
204No ContentRequête réussie, pas de contenu à retourner

Codes d'erreur client (4xx)

CodeNomDescription
400Bad RequestRequête malformée ou paramètres invalides
401UnauthorizedAuthentification manquante ou invalide
403ForbiddenAccès refusé (permissions insuffisantes ou IP bloquée)
404Not FoundRessource introuvable
429Too Many RequestsTrop de requêtes (limite de débit dépassée)
432Subscription RequiredAucun abonnement API actif
433Invalid Payment MethodMoyen de paiement invalide ou manquant
434Quota ExceededQuota de crédits API épuisé
435Upgrade RequiredFonctionnalité nécessitant un plan supérieur

Codes d'erreur serveur (5xx)

CodeNomDescription
500Internal Server ErrorErreur interne du serveur
503Service UnavailableService temporairement indisponible

Format des erreurs

Toutes les erreurs retournent un objet JSON avec cette structure :

{
"error": "Nom de l'erreur",
"message": "Description détaillée de l'erreur"
}

Exemples d'erreurs

400 - Requête invalide

{
"error": "bad_request",
"message": "Le paramètre 'recherche' est requis"
}

Causes courantes :

  • Paramètre requis manquant
  • Format de paramètre invalide
  • Valeur hors limites

Solution : Vérifiez la documentation de l'endpoint et corrigez les paramètres.

401 - Non authentifié

{
"error": "invalid_api_key",
"message": "Token d'authentification invalide",
}

Causes courantes :

  • Header Authorization manquant
  • Clé API invalide ou supprimée
  • Format du token incorrect

Solution : Vérifiez votre clé API et le format du header.

404 - Ressource non trouvée

{
"error": "not_found",
"message": "Parcelle introuvable avec l'identifiant '123456789'",
}

Causes courantes :

  • Identifiant incorrect
  • Ressource supprimée ou inexistante
  • Endpoint mal formé

Solution : Vérifiez l'identifiant et l'endpoint.

429 - Trop de requêtes

{
"error": "rate_limit_exceeded",
"message": "Limite de débit dépassée. Maximum 20 requêtes par seconde.",
"retry_after": 30
}

Causes courantes :

  • Plus de 1200 requêtes en 1 minute (soit 20 requêtes par seconde)
  • Boucle infinie de requêtes

Solution : Implémentez un rate limiter et respectez le retry_after ou le header Retry-After.

432 - Abonnement requis

{
"error": "no_subscription",
"message": "Aucun abonnement API actif détecté. Veuillez souscrire à un plan.",
}

Solution : Souscrivez à un plan API depuis votre espace compte.

434 - Quota dépassé

{
"error": "quota_unavailable",
"message": "Quota mensuel de 5 000 crédits épuisé",
}

Solution : Activez les dépassements ou passez à un plan supérieur.

500 - Erreur serveur

{
"error": "server_error",
"message": "Une erreur interne s'est produite. Veuillez réessayer plus tard.",
}

Solution : Réessayez la requête. Si le problème persiste, contactez le support en fournissant l'error_id.

Gestion des erreurs par langage

async function fetchApi(url, options = {}) {
try {
const response = await fetch(url, {
...options,
headers: {
'Authorization': `Bearer ${apiKey}`,
'Accept': 'application/json',
...options.headers,
},
});

// Erreur HTTP
if (!response.ok) {
const error = await response.json();

switch (response.status) {
case 400:
throw new Error(`Requête invalide: ${error.message}`);
case 401:
throw new Error(`Authentification échouée: ${error.message}`);
case 404:
throw new Error(`Ressource introuvable: ${error.message}`);
case 429:
const retryAfter = error.retry_after || 60;
throw new Error(`Rate limit dépassé. Réessayez dans ${retryAfter}s`);
case 432:
throw new Error(`Abonnement requis: ${error.message}`);
case 434:
throw new Error(`Quota dépassé: ${error.message}`);
case 500:
case 503:
throw new Error(`Erreur serveur: ${error.message}`);
default:
throw new Error(`Erreur ${response.status}: ${error.message}`);
}
}

return await response.json();

} catch (error) {
// Erreur réseau
if (error instanceof TypeError) {
throw new Error('Erreur de connexion. Vérifiez votre connexion internet.');
}

// Rethrow les autres erreurs
throw error;
}
}

// Utilisation avec gestion d'erreur
try {
const data = await fetchApi(
'https://app.infoparcelle.fr/api/v1/geocoder/search?recherche=1+Rue+de+Rivoli'
);
console.log(data);
} catch (error) {
console.error('Erreur:', error.message);
// Logique de fallback ou notification utilisateur
}

Bonnes pratiques

1. Toujours vérifier le code de statut

// ❌ Mauvais - ne vérifie pas les erreurs
const data = await fetch(url).then(r => r.json());

// ✅ Bon - vérifie le statut HTTP
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
const data = await response.json();

2. Implémenter un retry pour les erreurs temporaires

Réessayez automatiquement pour les erreurs 429, 500, 503 :

async function fetchWithRetry(url, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
const response = await fetch(url, {
headers: { 'Authorization': `Bearer ${apiKey}` },
});

if (response.status === 429) {
const error = await response.json();
const retryAfter = error.retry_after || 60;
await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
continue;
}

if (response.status >= 500) {
if (i < maxRetries - 1) {
await new Promise(resolve => setTimeout(resolve, 2 ** i * 1000));
continue;
}
}

if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}

return await response.json();
} catch (error) {
if (i === maxRetries - 1) throw error;
}
}
}

3. Logger les erreurs avec contexte

function logError(error, context) {
console.error({
timestamp: new Date().toISOString(),
error: error.message,
context: context,
stack: error.stack,
});

// Envoyer vers un service de monitoring (Sentry, etc.)
}

try {
const data = await fetchApi(url);
} catch (error) {
logError(error, {
url: url,
user_id: userId,
operation: 'geocoding_search',
});
}

4. Fournir des messages d'erreur utiles

function getUserFriendlyErrorMessage(error, statusCode) {
const messages = {
400: "Les paramètres de recherche sont invalides. Veuillez vérifier votre saisie.",
401: "Votre session a expiré. Veuillez vous reconnecter.",
404: "Aucun résultat trouvé pour cette recherche.",
429: "Trop de requêtes. Veuillez patienter quelques secondes.",
434: "Votre quota mensuel est épuisé. Veuillez mettre à niveau votre plan.",
500: "Une erreur est survenue. Veuillez réessayer plus tard.",
};

return messages[statusCode] || "Une erreur inattendue est survenue.";
}

Support

Si vous rencontrez une erreur persistante :

  1. Vérifiez la documentation : Référence API
  2. Consultez la FAQ : Questions fréquentes
  3. Contactez le support :
    • Email : contact@infoparcelle.fr
    • En fournissant :
      • Code d'erreur HTTP
      • Message d'erreur complet
      • Exemple de requête (sans clé API !)

Prochaines étapes