Erreurs

Format RFC 7807 des erreurs, codes métier les plus fréquents et conduite à tenir.

Format

Toute erreur métier est renvoyée au format Problem Details (RFC 7807), type application/problem+json :

{
  "status": 400,
  "title": "Action impossible",
  "detail": "Proposition verrouillée : un lien de paiement est en cours",
  "exception": "PROPOSAL_LOCKED_FOR_PAYMENT",
  "instance": "/api/v1/provider/contracts/1273be1c-.../duration",
  "details": {
    "PÉRIODE DEMANDÉE": "07/11/2026 → 06/02/2027"
  }
}
ChampDescription
statusCode HTTP
titleTitre lisible, dérivé du statut (voir ci-dessous)
detailMessage métier, en français
exceptionCode d'erreur stable, à utiliser dans votre code
instanceChemin appelé
detailsPaires libellé / valeur complémentaires (optionnel)
autres clésPropriétés spécifiques, par exemple endorsementId
statustitle
400Action impossible
401Connexion requise
403Accès refusé
404Élément introuvable
409Opération en conflit
502, 503, 504Service momentanément indisponible
autreUne erreur est survenue

Les erreurs de validation de corps (champ obligatoire manquant, format de châssis invalide…) renvoient 400 avec le message de la contrainte, par exemple « Champ obligatoire » ou « Le format du numéro de châssis est invalide ».

Codes fréquents

Authentification

exceptionHTTPSens
IDENTITY_AUTHENTICATION_FAILED401 / 502Identifiants refusés ou service d'authentification en erreur
IDENTITY_SERVICE_UNAVAILABLE503Service d'authentification injoignable

Souscription

exceptionSensQue faire
CONTRACT_NOT_FOUNDContrat inconnu ou hors périmètreVérifier l'identifiant et le rattachement du compte
CONTRACT_NOT_MODIFIABLELa proposition n'est plus en DRAFTLes modifications (durée, véhicules, parties) ne sont possibles qu'avant paiement
PROPOSAL_LOCKED_FOR_PAYMENTUn lien de paiement est en coursAnnuler les liens (…/payment/cancel) avant de modifier
PENDING_PAYMENT_LINK_ON_SHARED_VEHICLEUn véhicule est déjà dans une proposition en attente de paiementAttendre ou annuler ce paiement
VEHICLE_NOT_FOUNDvehicleId inconnu ou invisibleCréer le véhicule ou vérifier son rattachement
VEHICLE_ALREADY_INSURED, VEHICLE_NOT_ELIGIBLEVéhicule déjà couvert ou non éligibleVérifier le parc du souscripteur
VEHICLE_SEAT_ERRORnumberOfSeats absent ou nulRenseigner le nombre de places
TARIFF_NOT_FOUND, TARIFF_CALCULATION_ERRORPas de grille pour la durée / le nombre de placesVérifier durée et caractéristiques du véhicule
DURATION_NOT_FOUND, DURATION_NOT_ACTIVE, INACTIVE_DURATIONdurationCode inconnu ou inactifRelire GET /provider/durations
EFFECTIVE_DATE_IN_PAST, EFFECTIVE_DATE_TOO_FAR, INVALID_EFFECTIVE_DATEDate d'effet hors bornesCorriger effectiveDate
SUBSCRIBER_NOT_FOUND, INSURED_NOT_FOUND, REFERRER_NOT_FOUNDPartie inconnueCréer la partie ou corriger l'identifiant
LNK_BROKER_COMPANY_NOT_FOUNDPartenariat inconnu ou non autoriséRelire GET /provider/lnk-broker-companies
ENDORSEMENT_NOT_FOUNDAvenant inconnu, ou aucun avenant QUOTE à payerVérifier l'identifiant ou recalculer la prime
ENDORSEMENT_NOT_ALLOWED, INVALID_CONTRACT_STATUSAvenant impossible dans l'état du contratConsulter le statut du contrat
REF_VEHICLE_BRAND_ALREADY_EXISTS, REF_VEHICLE_MODEL_ALREADY_EXISTSCode référentiel déjà prisRéutiliser l'existant
DOCUMENTS_FOLDER_NOT_SETLe contrat n'a pas encore de dossier documentaireRéessayer après émission
GENERIC_ERRORRègle métier détaillée dans detailLire detail

États

Les erreurs du moteur d'états portent le code GENERIC_ERROR avec un detail explicite :

detailCause
Source inconnue : XsourceCode n'est pas l'un des 9 codes de source
Définition inconnue : XdefinitionCode absent du catalogue
Colonne inexistante : RECEIPTS.foofieldName inconnu pour la source
Champ de filtre inconnu, Champ non filtrableFiltre sur un champ inexistant ou filterable=false
Champ de regroupement inconnu, Champ non groupablegrouping sur un champ groupable=false
Champ de tri inconnu, Champ non triablesorting.fieldName invalide
Opérateur manquant sur le filtreoperator absent
Valeur de filtre invalide pour X : vValeur non convertible dans le type du champ
Ancre temporelle inconnue : Xscope.basedOn n'est pas une ancre de la source
Le mode récapitulatif nécessite au moins un champ de regroupementoptions.aggregated=true sans grouping
Une colonne calculée doit porter un nom, Colonne calculée sans formuleColonne CALCULATED incomplète
Aucune colonne sélectionnéeSpécification vide
Format non autorisé pour cet étatformat hors de formats de la définition
PDF limité à 25000 lignes (…)Trop de lignes pour un PDF : réduire la période ou passer en XLSX/CSV
Génération : fournir modelId, definitionCode ou une spécificationCorps de génération vide
Modèle introuvable, Exécution introuvable, Aucun fichier archivé pour l'exécutionIdentifiant inconnu ou fichier purgé
Un modèle avec ce nom existe déjàNom de modèle en doublon
Jour du mois invalide, endDate requis pour le mode UNTIL_DATE, occurrences requis pour le mode AFTER_OCCURRENCESPlanification incohérente

Gérer les erreurs dans le code

lib/pooltpv-client.ts
async function call(path: string, init: RequestInit = {}) {
  const res = await fetch(`${API}${path}`, {
    ...init,
    headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json', ...init.headers },
  });

  if (res.ok) return res.status === 204 ? null : res.json();

  const problem = await res.json().catch(() => ({}));
  switch (res.status) {
    case 401: await refreshToken(); return call(path, init);          // [!code highlight]
    case 400: throw new Error(`${problem.exception}: ${problem.detail}`); // [!code highlight]
    case 404: throw new Error(`Introuvable: ${problem.detail}`);
    default:  throw new Error(`HTTP ${res.status} ${problem.title ?? ''}`);
  }
}

Journalisez toujours exception, detail et instance : ce sont les trois informations que le support ASACI demande en premier.

On this page