TulipTulip Docs
Guides

Gestion des erreurs

Codes d'erreur de l'API, messages et stratégies de résolution.

L'API Tulip retourne des codes d'erreur numériques avec des messages en anglais. Chaque erreur appartient à un domaine fonctionnel identifiable par la plage de codes.

Format des erreurs

Toutes les réponses d'erreur suivent le même format JSON :

{
  "success": false,
  "error": {
    "code": 1050,
    "message": "The contract started more than 4 hours ago."
  }
}

Les messages d'erreur sont retournés en anglais par l'API, quel que soit le contexte d'appel.

Codes d'erreur par domaine


Création de contrat (1000–1022)

Ces erreurs surviennent lors de l'appel de création d'un contrat.

CodeMessage APIDescription
1000The start_date cannot be in the past.La date de début doit être dans le futur.
1001The end_date cannot be earlier than the start_date.La date de fin doit être postérieure à la date de début.
1002The duration of the contract is invalid.Vérifiez que la durée respecte les limites du type de contrat.
1003You do not have permissions to create this type of contract.Votre compte n'a pas les droits pour ce type de contrat.
1004The contract type is invalid.Le contract_type fourni n'existe pas.
1005An end_date is required.Le champ end_date est obligatoire.
1006A contract_type is required.Le champ contract_type est obligatoire.
1007At least one product is required to create the contract.Ajoutez au moins un produit dans le tableau products.
1008Options are required to create a contract.Le champ options est obligatoire.
1009Options for breakage and theft are required to create a contract, including whether the insured is a company or an individual.Spécifiez les options casse/vol et le type d'assuré (entreprise ou particulier).
1010The options for the contract are invalid.Vérifiez la structure et les valeurs du champ options.
1011The document does not exist.Le document référencé est introuvable.
1012A uid is required to create a contract.Le champ uid est obligatoire.
1013A company is required to create this contract.Ce type de contrat nécessite un objet company.
1014An individual is required to create this contract.Ce type de contrat nécessite un objet individual.
1015Options for breakage and theft are required to create a contract, specifying whether the insured is a company or an individual, and defining the use case of the product(s): home_to_work, professional, or transporter.Spécifiez les options casse/vol, le type d'assuré et le cas d'usage (home_to_work, professional ou transporter).
1016An ia is required to create this contract.Le champ ia (intermédiaire d'assurance) est obligatoire.
1017The ia is invalid.L'identifiant ia fourni n'est pas reconnu.
1018Options for breakage and theft are required to create a contract.Les options casse/vol sont manquantes.
1019Options for breakage and theft are required to create a contract.Les options casse/vol sont manquantes (variante).
1020Options for breakage and theft are required to create a contract, including whether the insured is a company or an individual.Spécifiez les options casse/vol et le type d'assuré.
1021The end_date cannot be in the past.La date de fin doit être dans le futur.
1022For special cases, please contact Tulip.Ce cas particulier nécessite une intervention manuelle de Tulip.

Modification de contrat (1050–1052)

Ces erreurs surviennent lors de la mise à jour d'un contrat existant.

CodeMessage APIDescription
1050The contract started more than 4 hours ago.Un contrat ne peut plus être modifié 4 heures après son début.
1051The contract does not exist.L'identifiant de contrat fourni est introuvable.
1052The contract is not open.Seuls les contrats au statut open peuvent être modifiés.

La fenêtre de modification d'un contrat est de 4 heures après la date de début. Passé ce délai, le code 1050 sera retourné.


Entreprise (1100–1109)

Validation des informations entreprise lors de la création d'un contrat B2B.

CodeMessage APIDescription
1100A company name is required to create this contract.Le champ name de l'entreprise est obligatoire.
1101A SIREN number is required to create this contract.Le champ siren est obligatoire.
1102The SIREN must be 9 characters for France and 11 characters for Italy.9 caractères pour la France, 11 pour l'Italie.
1103A first name is required to create this contract.Le prénom du contact est obligatoire.
1104A last name is required to create this contract.Le nom du contact est obligatoire.
1105An address is required to create this contract.L'adresse est obligatoire.
1106A zipcode is required to create this contract. / The zipcode provided is invalid.Code postal manquant ou invalide.
1107A city is required to create this contract. / The city provided is invalid.Ville manquante ou invalide.
1108A country is required to create this contract. / The country provided is invalid.Pays manquant ou invalide.
1109The company details are invalid.Vérifiez l'ensemble des informations entreprise.

Gel d'entreprise (1150)

CodeMessage APIDescription
1150The company informations is frozen.Les informations entreprise sont gelées et ne peuvent plus être modifiées.

Gel de particulier (1151)

CodeMessage APIDescription
1151The individual account is frozen.Le compte particulier est gelé et ne peut plus être modifié.

Les codes 1150 et 1151 indiquent un gel administratif. Contactez le support Tulip pour débloquer la situation.


Produits dans un contrat — Création (1200–1230)

Erreurs lors de l'ajout de produits à un contrat.

CodeMessage APIDescription
1200product_id is required to assign a product to the contractLe champ product_id est obligatoire.
1201product_id must exist to assign a product to the contractLe product_id fourni n'existe pas dans le catalogue.
1202You do not have permission to create a contract with this type of productVotre compte n'a pas les droits pour ce type de produit.
1203The document does not existLe document référencé est introuvable.
1220data is required when the product is a bike/winter sports/water sports/event/small toolLe champ data est obligatoire pour ce type de produit. Le message précise le type concerné.
1221The products are invalidVérifiez la structure du tableau products.
1222product_type is required to create this contractLe champ product_type est obligatoire (définition inline).
1223product_type is invalidLe product_type fourni n'est pas reconnu.
1224product_subtype is required to create this contractLe champ product_subtype est obligatoire (définition inline).
1225product_subtype is invalidLe product_subtype fourni n'est pas reconnu.
1226value_excl is required to create this contractLe champ value_excl (valeur HT) est obligatoire.
1227value_excl must be positiveLa valeur HT doit être strictement positive.
1228brand is required to create this contractLe champ brand (marque) est obligatoire.
1229model is required to create this contractLe champ model (modèle) est obligatoire.
1230value_excl must be less or equal to 15000La valeur HT ne doit pas dépasser 15 000.

Le code 1220 est partagé par plusieurs types de produits (vélo, sports d'hiver, sports nautiques, événement, petit outillage). Le message retourné précise le type concerné.


Produits dans un contrat — Données vélo (1300–1301)

CodeMessage APIDescription
1300user_name is required to create this contractLe nom de l'utilisateur du vélo est obligatoire dans data.
1301product_marked is required to create this contractLe marquage du produit est obligatoire dans data.

Produits dans un contrat — Données sports d'hiver (1310–1311)

CodeMessage APIDescription
1310user_name is required to create this contractLe nom de l'utilisateur est obligatoire dans data.
1311product_marked is required to create this contractLe marquage du produit est obligatoire dans data.

Produits dans un contrat — Données sports nautiques (1320–1321)

CodeMessage APIDescription
1320user_name is required to create this contractLe nom de l'utilisateur est obligatoire dans data.
1321product_marked is required to create this contractLe marquage du produit est obligatoire dans data.

Produits dans un contrat — Modification (1330–1343)

Erreurs lors de la mise à jour d'un produit rattaché à un contrat.

CodeMessage APIDescription
1330The cpid does not existL'identifiant produit-contrat (cpid) est introuvable.
1331The product status is not allowedLe statut actuel du produit ne permet pas cette modification.
1332user_name cannot be emptyLe champ user_name ne peut pas être vide.
1333internal_id cannot be emptyLe champ internal_id ne peut pas être vide.
1334product_marked cannot be emptyLe champ product_marked ne peut pas être vide.
1335product_marked must be a stringLe champ product_marked doit être une chaîne de caractères.
1336user_name must be a stringLe champ user_name doit être une chaîne de caractères.
1337internal_id must be a stringLe champ internal_id doit être une chaîne de caractères.
1338You are not authorized to update the start_date or end_dateVotre compte n'a pas les droits pour modifier les dates du produit.
1339The start_date cannot be earlier than the contract's start_dateLa date de début du produit ne peut pas précéder celle du contrat.
1340The start_date cannot be later than the contract's end_dateLa date de début du produit ne peut pas dépasser la date de fin du contrat.
1341The end_date cannot be earlier than the contract's start_dateLa date de fin du produit ne peut pas précéder la date de début du contrat.
1342The end_date cannot be later than the contract's end_dateLa date de fin du produit ne peut pas dépasser celle du contrat.
1343The start_date cannot be later than the product's start_dateLa nouvelle date de début ne peut pas être postérieure à la date de début actuelle du produit.

Produits dans un contrat — Suppression (1350–1352)

CodeMessage APIDescription
1350The product does not exist, or is closed, or has been terminatedLe produit est introuvable, déjà fermé ou résilié.
1351The end_date cannot be in the pastLa date de fin de résiliation doit être dans le futur.
1352The end_date cannot be in the future of the contractLa date de fin du produit ne peut pas dépasser celle du contrat.

Particulier (1400–1410)

Validation des informations du particulier lors de la création d'un contrat B2C.

CodeMessage APIDescription
1400A first_name is required to create this contract.Le prénom est obligatoire.
1401A last_name is required to create this contract.Le nom est obligatoire.
1402An address is required to create this contract.L'adresse est obligatoire.
1403A zipcode is required to create this contract.Le code postal est obligatoire.
1404A city is required to create this contract.La ville est obligatoire.
1405A phone_number is required to create this contract.Le numéro de téléphone est obligatoire.
1406A country is required to create this contract.Le pays est obligatoire.
1407The zipcode is invalid.Le code postal fourni n'est pas valide.
1408The city is invalid.La ville fournie n'est pas valide.
1409The country is invalid.Le pays fourni n'est pas valide.
1410The individual details are invalid.Vérifiez l'ensemble des informations du particulier.

Locataires (2000–2002)

Erreurs liées à l'ajout d'un locataire.

CodeMessage APIDescription
2000The renter_id is required.Le champ renter_id est obligatoire.
2001Invalid renter_id.L'identifiant du locataire n'est pas valide.
2002The renter_id is already registered.Ce locataire est déjà enregistré sur le contrat.

Produits — CRUD (4000–4999)

Erreurs liées aux opérations sur l'endpoint /products (création, lecture, mise à jour, suppression de produits dans le catalogue).

Création de produit (4000–4022)

CodeMessage APIDescription
4000A uid is required to create a product.Le champ uid est obligatoire.
4001A product_type is required to create a product.Le champ product_type est obligatoire.
4002A title is required to create a product.Le champ title est obligatoire.
4003Data is required to create a product.Le champ data est obligatoire.
4004A value_excl is required to create a product.Le champ value_excl (valeur HT) est obligatoire.
4005A product_subtype is required to create a product.Le champ product_subtype est obligatoire.
4006A brand is required to create a product.Le champ brand est obligatoire.
4007A model is required to create a product.Le champ model est obligatoire.
4008The provided product_type is invalid.Le product_type fourni n'est pas reconnu.
4009The provided product_subtype is invalid.Le product_subtype fourni n'est pas reconnu.
4011The uid should be a string.Le champ uid doit être une chaîne de caractères.
4012The title should be a string.Le champ title doit être une chaîne de caractères.
4013The value_excl should be a number.Le champ value_excl doit être un nombre.
4014The description should be a string.Le champ description doit être une chaîne de caractères.
4015The brand should be a string.Le champ brand doit être une chaîne de caractères.
4016The model should be a string.Le champ model doit être une chaîne de caractères.
4017The data should be an object.Le champ data doit être un objet JSON.
4018The product_type should be a string.Le champ product_type doit être une chaîne de caractères.
4019The product_subtype should be a string.Le champ product_subtype doit être une chaîne de caractères.
4020You do not have permission to create this product_type.Votre compte n'a pas les droits pour ce type de produit.
4021The value_excl must be positive.La valeur HT doit être strictement positive.
4022The purchased_date must be a date.Le champ purchased_date doit être une date valide.

Mise à jour de produit (4100–4104)

CodeMessage APIDescription
4100A product_id is required to update a product.Le champ product_id est obligatoire pour la mise à jour.
4101The value_excl must be a number.Le champ value_excl doit être un nombre.
4102The description must be a string.Le champ description doit être une chaîne de caractères.
4103The title must be a string.Le champ title doit être une chaîne de caractères.
4104The purchased_date must be a date.Le champ purchased_date doit être une date valide.

Lecture de produit (4200)

CodeMessage APIDescription
4200A product_id is required to read a product.Le champ product_id est obligatoire pour la lecture.

Suppression de produit (4300)

CodeMessage APIDescription
4300A product_id is required to delete a product.Le champ product_id est obligatoire pour la suppression.

Produit non trouvé (4999)

CodeMessage APIDescription
4999The product was not found.Le produit référencé n'existe pas dans le catalogue.

Renouvellement automatique (5000–5114)

Erreurs liées à la gestion du renouvellement automatique des contrats.

CodeMessage APIDescription
5000Automatic renewal not found.Le renouvellement automatique n'existe pas pour ce contrat.
5050This contract is locked.Le contrat est verrouillé et ne peut pas être modifié.
5100The default application is not modifiable.L'application par défaut ne peut pas être modifiée.
5101Applied status is not modifiable.Le statut d'application ne peut pas être modifié.
5102Applied date is not modifiable.La date d'application ne peut pas être modifiée.
5103Renewal scheduled date is not modifiable.La date de renouvellement planifiée ne peut pas être modifiée.
5104Notified status is not modifiable.Le statut de notification ne peut pas être modifié.
5105Notification date is not modifiable.La date de notification ne peut pas être modifiée.
5106Notification scheduled date is not modifiable.La date de notification planifiée ne peut pas être modifiée.
5107Rejection date is not modifiable.La date de rejet ne peut pas être modifiée.
5108Extension is not modifiable.L'extension ne peut pas être modifiée.
5109Next CID is not modifiable.L'identifiant du prochain contrat ne peut pas être modifié.
5110Rejection status is not modifiable.Le statut de rejet ne peut pas être modifié.
5112Not modifiable because the contract's end date is in the past.Le contrat est expiré, aucune modification n'est possible.
5113Not modifiable because the automatic renewal has already been applied.Le renouvellement a déjà été appliqué.
5114This contract is locked.Le contrat est verrouillé (variante).

Les champs du renouvellement automatique (5100–5110) sont en lecture seule une fois le processus enclenché. Seul le champ rejected peut encore être modifié tant que le renouvellement n'a pas été appliqué.


Sinistres — Validation (1000–1008)

Ces erreurs sont dans le contexte de l'API Claims (différent des codes contrats dans la même plage).

CodeMessage APIDescription
1000Validation errorErreur générique de validation du corps de la requête.
1001Questions validation failed. Missing: ... Invalid: ...Les réponses aux questions obligatoires sont incomplètes ou invalides.
1002File too largeLe fichier dépasse la taille maximale de 20 Mo.
1003Invalid MIME typeLe type de fichier n'est pas supporté. Types acceptés : PDF, JPEG, PNG, WebP, HEIC, HEIF.
1004Invalid subtype for product typeLe sous-type de sinistre n'est pas valide pour ce type de produit.
1005Invalid base64 contentLe contenu base64 fourni est invalide.
1006Unsupported content typeLe Content-Type de la requête n'est pas supporté.
1007Invalid type for subtypeLe type de sinistre n'est pas compatible avec le sous-type.
1008Unsupported product typeLe type de produit n'est pas supporté pour les sinistres.

Sinistres — Ressources introuvables (2001–2004)

CodeMessage APIDescription
2001Claim not foundLe sinistre n'existe pas ou vous n'avez pas les droits d'accès.
2002Contract not foundLe contrat référencé n'existe pas.
2003Product not found in contractLe produit n'existe pas dans le contrat.
2004Document not foundLe document n'existe pas.

Sinistres — Logique métier (3001–3007)

CodeMessage APIDescription
3001Claim can only be modified in draft statusLe sinistre ne peut être modifié qu'en statut draft.
3002Claim has already been submitted or cancelledLe sinistre a déjà été soumis ou annulé.
3003Claim is already abandonedLe sinistre est déjà abandonné/archivé.
3004Missing required documents: ...Des documents obligatoires manquent pour soumettre.
3005This document has already been validated and cannot be replacedLe document a été accepté et ne peut plus être remplacé.
3007Cannot abandon claim: payment in progressUn paiement est en cours, impossible d'abandonner.

Sinistres — Authentification (9001–9003)

CodeMessage APIDescription
9001API key is requiredLe header key est absent.
9002Invalid API keyLa clé API n'est pas valide.
9003User is not authorized for this API keyL'utilisateur (userId) n'est pas autorisé pour cette clé API.

Les codes d'erreur sinistres (1000–9003) sont dans un namespace distinct des codes contrats (1000–1052). Le contexte d'appel (endpoint /claims vs /contracts) détermine quelle plage s'applique.


Permissions et limites (98888, 99888)

CodeMessage APIDescription
98888You do not have permissions.Votre compte n'a pas les droits nécessaires pour cette action. Vérifiez les permissions associées à votre clé API.
99888The limit has been reached. You cannot perform this action. Please contact support.Vous avez atteint la limite autorisée (rate limit ou quota). Contactez le support Tulip.

Le code 99888 indique un dépassement de quota. Ce n'est pas une erreur transitoire : il faut contacter le support pour augmenter vos limites.


Stratégie de retry

Toutes les erreurs ne doivent pas être réessayées. Voici les recommandations par code HTTP :

Code HTTPTypeAction recommandée
400Erreur de validationNe pas réessayer. Corrigez le corps de la requête en vous appuyant sur le code d'erreur et le message retournés.
401AuthentificationNe pas réessayer. Vérifiez votre clé API et ses permissions.
403AutorisationNe pas réessayer. Votre compte n'a pas les droits nécessaires (code 98888).
404Ressource introuvableNe pas réessayer. Vérifiez l'identifiant de la ressource (contrat, produit, etc.).
429Rate limitRéessayer avec un backoff exponentiel. Respectez le header Retry-After si présent.
500Erreur serveurRéessayer avec un backoff exponentiel : 1s, 2s, 4s, 8s (maximum 3 tentatives).
502/503Service indisponibleRéessayer avec un backoff exponentiel. Attendez au moins 5 secondes avant la première tentative.
TimeoutPas de réponseRéessayer avec précaution. Vérifiez d'abord via un appel GET si la ressource a été créée pour éviter les doublons.

Exemple d'implémentation

async function callWithRetry<T>(
  fn: () => Promise<T>,
  maxRetries = 3
): Promise<T> {
  for (let attempt = 0; attempt <= maxRetries; attempt++) {
    try {
      return await fn();
    } catch (error: any) {
      const status = error?.response?.status;

      // Ne pas réessayer les erreurs client
      if (status && status >= 400 && status < 500) {
        throw error;
      }

      // Dernière tentative, propager l'erreur
      if (attempt === maxRetries) {
        throw error;
      }

      // Backoff exponentiel
      const delay = Math.pow(2, attempt) * 1000;
      await new Promise((resolve) => setTimeout(resolve, delay));
    }
  }
  throw new Error("Unreachable");
}

Pour les opérations de création (POST), vérifiez toujours via un GET que la ressource n'a pas été créée avant de réessayer, afin d'éviter les doublons.

Que pensez-vous de cette page ?

Sur cette page