Aller au contenu
Préproduction : l'API répond sur https://api.visiobank.com/v1, avec une clé de test. Les exemples gardent l'adresse de production, api.vizalia.ai, qui ouvrira à la mise en production.

Erreurs

Une erreur a un vrai code HTTP et un corps application/problem+json au format de la RFC 9457 :

{
"type": "https://docs.vizalia.ai/errors/invalid_phone",
"title": "Numéro de téléphone invalide",
"status": 422,
"detail": "Le numéro doit être au format E.164, par exemple +33612345678.",
"instance": "/v1/sessions",
"code": "invalid_phone",
"param": "to",
"request_id": "req_01JC3W9A2B7K"
}

Testez code dans votre code : il est stable, comme type, qui se termine par lui et mène à la page de l’erreur. title et detail sont faits pour être lus : ils suivent Accept-Language (français par défaut, anglais avec en) et peuvent changer. request_id, repris dans l’en-tête X-Request-Id, est à donner au support.

Chaque code a sa page, à l’adresse que donne le champ type de l’erreur.

  • Une route ou une méthode inconnue répond 404 not_found, en application/problem+json, jamais 405.
  • Un champ inconnu, une valeur hors bornes ou une action inconnue répondent 400 invalid_request, avec param : par exemple une Idempotency-Key de plus de 255 caractères, un message de plus de 108 ou plus de 20 paires metadata. Un champ inconnu est refusé, pas ignoré.
HTTPcodeQue faire
400invalid_requestCorriger la requête : JSON illisible, paramètre inconnu ou mal formé.
401unauthorizedVérifier la clé : absente, inconnue, révoquée ou expirée.
403insufficient_scopeDonner à la clé la portée qui manque.
403test_mode_onlyUtiliser une clé de test : simulate n'existe qu'en mode test.
403report_download_disabledRien à corriger : l'espace interdit le téléchargement du rapport.
404not_foundVérifier l'identifiant : ressource inconnue ou d'un autre espace.
409idempotency_conflictMême Idempotency-Key avec un autre corps : changer de clé.
409session_endedLa session est terminée : en créer une autre.
409report_not_readyAttendre le webhook report.ready.
422phone_requiredCorriger le destinataire.
422invalid_phoneCorriger le destinataire.
422invalid_emailCorriger le destinataire.
422channel_disabledChoisir une valeur active de l'espace ; param dit laquelle.
422unknown_brandChoisir une valeur active de l'espace ; param dit laquelle.
422unknown_advisorChoisir une valeur active de l'espace ; param dit laquelle.
422unknown_scenarioChoisir une valeur active de l'espace ; param dit laquelle.
422invalid_report_optionsCorriger l'option ou l'URL désignée par param.
422invalid_webhook_urlCorriger l'option ou l'URL désignée par param.
429quota_exceededRéessayer après Retry-After secondes.
500internal_errorRéessayer plus tard ; donner request_id au support.
503report_renderer_unavailableRéessayer après Retry-After secondes.
503report_attachment_unavailableRéessayer après Retry-After secondes.

Branchez-vous sur le statut HTTP pour la famille d’erreur, et sur code pour la cause précise. Réessayez seulement ce qui peut l’être : 429 et 503 après Retry-After secondes, 500 plus tard, et une requête rejouée garde son Idempotency-Key.

const reponse = await fetch('https://api.vizalia.ai/v1/sessions', requete);
if (!reponse.ok) {
const type = reponse.headers.get('content-type') ?? '';
const erreur = type.includes('json') ? await reponse.json() : { code: null };
switch (erreur.code) {
case 'invalid_phone':
// Le numéro saisi est refusé : `param` nomme le champ, `detail` s'affiche tel quel.
return demanderUnAutreNumero(erreur.detail);
case 'quota_exceeded':
return reessayerDans(Number(reponse.headers.get('retry-after') ?? 60));
default:
throw new Error(`${reponse.status} ${erreur.code} (${erreur.request_id})`);
}
}