Tổng Kho eSIM
Erreurs · 91 codes publiés

Codes d’erreur

Les erreurs utilisent { ok: false, error: { code, message, field?, meta?, request_id } } avec un statut HTTP adapté, jamais 200. La liste /v1 et embed suit le registre backend.

Structure d’une erreur

http
HTTP/1.1 402 Payment Required
Content-Type: application/json
X-Request-Id: 018f2b00-0000-7000-8000-0000000000ff

{
  "ok": false,
  "error": {
    "code": "wallet.insufficient_balance",
    "message": "Số dư ví không đủ để thực hiện giao dịch.",
    "field": null,
    "meta": null,
    "request_id": "018f2b00-0000-7000-8000-0000000000ff"
  }
}
Pourquoi domain.reason plutôt que 0000

HTTP natif : Les proxys, outils de supervision et clients REST interprètent déjà les statuts HTTP standard.

Explicite : wallet.insufficient_balance se comprend sans tableau ; de nouveaux codes ne cassent pas le traitement existant.

Le système attend un nombre ? Le code immuable sert de clé de traduction stable.

4 bonnes pratiques de gestion des erreurs

Statut HTTP d’abord, code ensuite
Le statut guide les tentatives, alertes et coupe-circuits ; error.code guide le message utilisateur. Les statuts sont plus stables.
Un code inconnu ne doit pas interrompre le flux
Sur code inconnu, utilisez le statut HTTP, journalisez code et request_id et affichez un message de repli. Évitez les exceptions non gérées.
Toujours journaliser request_id
X-Request-Id figure dans chaque réponse et dans l’erreur. Transmettez-le au support pour retrouver la requête.
Respecter Retry-After sur 429 et 503
Lisez Retry-After au lieu de fixer un délai. 429 fournit aussi X-RateLimit-Limit / Remaining / Reset.

Table code ↔ HTTP

Classement par domaine. Consultez aussi les erreurs propres à chaque endpoint dans la référence API.

91 / 91 codes affichés

Authentification, clés et limites partner.*

codeHTTPSignificationNouvelle tentative ?
partner.invalid_key401Clé API invalide.Non : elle échouerait encore
partner.invalid_signature401Signature de requête invalide.Non : elle échouerait encore
partner.timestamp_expired401L'horodatage de la requête est trop éloigné de l'heure du serveur.Non : elle échouerait encore
partner.nonce_reused401Ce nonce a déjà été utilisé.Non : elle échouerait encore
partner.ip_not_allowed403Cette adresse IP ne figure pas dans la liste autorisée.Non : elle échouerait encore
partner.scope_denied403Cette clé API n'a pas le droit d'appeler cet endpoint.Non : elle échouerait encore
partner.key_suspended403Cette clé API est suspendue.Non : elle échouerait encore
partner.key_revoked403Cette clé API a été révoquée.Non : elle échouerait encore
partner.endpoint_disabled503Ce groupe d'endpoints est temporairement hors service.Oui : requête identique
partner.rate_limited429La limite de requêtes est dépassée. Réessayez plus tard.Oui : requête identique
partner.package_not_visible404Ce code de forfait ne peut pas être acheté avec votre clé.Non : elle échouerait encore
partner.daily_quota_exceeded429Le quota quotidien de requêtes est épuisé. Réessayez demain.Oui : requête identique
partner.wrong_host403Cette clé ne correspond pas à cet hôte. Utilisez `https://api-testing.tongkhoesim.com` pour `tke_test_` et `https://api.tongkhoesim.com` pour `tke_live_`.Non : elle échouerait encore

Erreurs générales de l’API internal.*

codeHTTPSignificationNouvelle tentative ?
internal.validation_failed400Les données envoyées sont invalides.Non : elle échouerait encore
internal.invalid_filter400Condition de filtre invalide.Non : elle échouerait encore
internal.invalid_sort_field400Champ de tri invalide.Non : elle échouerait encore
internal.unauthenticated401Connectez-vous à nouveau : la session est absente ou expirée.Non : elle échouerait encore
internal.forbidden403Vous n'avez pas le droit d'effectuer cette action.Non : elle échouerait encore
internal.not_found404La ressource demandée est introuvable.Non : elle échouerait encore
internal.route_not_found404Ce chemin n'existe pas. Vérifiez la méthode et le chemin dans la documentation.Non : elle échouerait encore
internal.method_not_allowed405Cette méthode HTTP n'est pas prise en charge.Non : elle échouerait encore
internal.conflict409Un conflit d'état empêche cette action.Non : elle échouerait encore
internal.unsupported_media_type415Ce type de contenu n'est pas pris en charge.Non : elle échouerait encore
internal.rate_limited429Trop de requêtes. Réessayez plus tard.Oui : requête identique
internal.server_error500Une erreur système est survenue. Réessayez plus tard.Oui : requête identique
internal.service_unavailable503Le service est temporairement indisponible. Réessayez plus tard.Oui : requête identique
internal.limit_exceeded422La limite autorisée est atteinte. Supprimez des éléments et réessayez.Non : elle échouerait encore
internal.money_frozen503Les opérations financières sont suspendues pour vérifier le grand livre. Réessayez plus tard.Oui : requête identique

Catalogue des forfaits catalog.*

codeHTTPSignificationNouvelle tentative ?
catalog.cursor_mismatch400Ce curseur ne correspond pas aux filtres actuels. Repartez de la première page sans le paramètre cursor.Non : elle échouerait encore

Devis et commandes order.*

codeHTTPSignificationNouvelle tentative ?
order.quote_not_found404Devis introuvable.Non : elle échouerait encore
order.quote_expired409Ce devis a expiré. Créez-en un nouveau.Non : elle échouerait encore
order.quote_already_committed409Ce devis a déjà été converti en commande.Non : elle échouerait encore
order.package_not_allowed400Ce forfait n'existe pas ou n'est pas disponible à l'achat.Non : elle échouerait encore
order.not_deliverable409Cette commande n'est pas encore terminée ; cette action est indisponible.Non : elle échouerait encore
order.quantity_limit_exceeded400Le nombre d'eSIM dépasse la limite par commande.Non : elle échouerait encore
order.fulfillment_config_changed409La configuration de livraison du forfait a changé. Créez un nouveau devis.Non : elle échouerait encore
order.refund_suggestion_pending409Une proposition de remboursement attend une approbation pour cette commande. Traitez-la d'abord.Non : elle échouerait encore

eSIM esim.*

codeHTTPSignificationNouvelle tentative ?
esim.out_of_stock409Le stock de ce forfait est insuffisant.Non : elle échouerait encore
esim.not_cancellable409L'état de cette eSIM ne permet pas son annulation.Non : elle échouerait encore
esim.lpa_not_available409Cette eSIM n'a pas encore de code LPA (pas encore activée ou enregistrée).Non : elle échouerait encore
esim.not_eligible409Cette eSIM n'est pas admissible à une recharge.Non : elle échouerait encore
esim.not_activated409Cette eSIM n'est pas installée. Installez-la et activez-la avant de la recharger.Non : elle échouerait encore
esim.topup_not_supported409Ce forfait ne permet pas les recharges.Non : elle échouerait encore
esim.topup_provider_mismatch409Ce forfait de recharge appartient à un autre fournisseur. Choisissez un forfait proposé pour cette eSIM.Non : elle échouerait encore
esim.refund_not_eligible409Cette eSIM n'est pas admissible à une demande de remboursement.Non : elle échouerait encore
esim.refund_request_pending409Une demande de remboursement est déjà en attente pour cette eSIM.Non : elle échouerait encore
esim.suspended409Cette eSIM est suspendue. Réactivez-la avant cette action.Non : elle échouerait encore

Portefeuille wallet.*

codeHTTPSignificationNouvelle tentative ?
wallet.frozen409Ce portefeuille est gelé et ne permet aucun paiement.Non : elle échouerait encore
wallet.velocity_hold409Ce portefeuille est bloqué pour vérification. Contactez l'assistance.Non : elle échouerait encore
wallet.insufficient_balance402Le solde du portefeuille est insuffisant pour cette transaction.Non : elle échouerait encore
wallet.deleted409Le portefeuille destinataire est invalide (supprimé).Non : elle échouerait encore
wallet.velocity_exceeded429Le seuil de transactions a été dépassé sur une courte période. Le portefeuille est bloqué pour vérification.Non : elle échouerait encore

Demandes de remboursement refund.*

codeHTTPSignificationNouvelle tentative ?
refund.note_required400Indiquez le motif du refus de remboursement.Non : elle échouerait encore

Prix de vente pricing.*

codeHTTPSignificationNouvelle tentative ?
pricing.no_price_for_buyer409Aucun prix de vente n'est encore défini pour vous sur ce forfait.Non : elle échouerait encore

Fournisseur eSIM provider.*

codeHTTPSignificationNouvelle tentative ?
provider.disabled409Le fournisseur de ce forfait est désactivé ; la vente est impossible.Non : elle échouerait encore
provider.api_group_disabled409Ce groupe de services du fournisseur est désactivé.Non : elle échouerait encore
provider.not_registered500Aucun connecteur n'est configuré pour ce fournisseur.Oui : requête identique
provider.unsupported400Ce fournisseur ne prend pas en charge cette action.Non : elle échouerait encore
provider.timeout504Le fournisseur a mis trop longtemps à répondre. Réessayez plus tard.Oui : requête identique
provider.auth_failed502L'authentification auprès du fournisseur a échoué.Oui : requête identique
provider.rate_limited429Le fournisseur limite les requêtes. Réessayez plus tard.Oui : requête identique
provider.malformed_response502Le fournisseur a renvoyé des données invalides.Oui : requête identique
provider.call_failed502L'appel au fournisseur a échoué.Oui : requête identique
provider.out_of_stock409Ce forfait est en rupture de stock chez le fournisseur.Non : elle échouerait encore
provider.msisdn_taken409Ce MSISDN appartient déjà à un autre abonné chez le fournisseur.Non : elle échouerait encore
provider.msisdn_exhausted409Aucun MSISDN utilisable ne reste chez le fournisseur.Non : elle échouerait encore

Idempotency idempotency.*

codeHTTPSignificationNouvelle tentative ?
idempotency.conflict409Cette Idempotency-Key a déjà été utilisée avec un contenu différent.Non : elle échouerait encore

Capacités du fournisseur capability.*

codeHTTPSignificationNouvelle tentative ?
capability.not_supported422Ce forfait ne prend pas en charge la fonctionnalité demandée.Non : elle échouerait encore

Mode test / simulation testmode.*

codeHTTPSignificationNouvelle tentative ?
testmode.live_key_forbidden403Cet endpoint exige une clé de test (`tke_test_`) sur api-testing. Remplacez votre clé réelle par une clé de test de la même organisation.Non : elle échouerait encore
testmode.not_test_item422Cette eSIM est réelle ; le mode test ne traite que les eSIM de test. Pour annuler une commande réelle, demandez un remboursement.Non : elle échouerait encore
testmode.invalid_scenario422Scénario invalide. Envoyez au moins un champ parmi `data_used_mb`, `status`, `expire_now`, `throttled` ; `status` accepte uniquement released|installed|enabled|disabled.Non : elle échouerait encore
testmode.no_sellable_package422Aucun forfait tarifé ne permet de créer les données d'exemple. Il faut au moins un forfait disponible avec un prix.Non : elle échouerait encore

Webhook webhook.*

codeHTTPSignificationNouvelle tentative ?
webhook.health_check_failed422L'URL du webhook n'a pas répondu correctement au contrôle de disponibilité.Non : elle échouerait encore
webhook.url_not_allowed422Cette URL de webhook n'est pas autorisée. Elle doit être publique et utiliser https.Non : elle échouerait encore
webhook.not_configured404Aucun webhook n'est configuré pour cette clé API.Non : elle échouerait encore
webhook.delivery_not_found404Envoi de webhook introuvable.Non : elle échouerait encore
webhook.already_configured409Cette clé API a déjà un webhook (un seul par clé). Modifiez-le avec `PUT /v1/webhooks/{id}`, ou supprimez-le avec `DELETE /v1/webhooks/{id}` avant d'en créer un nouveau.Non : elle échouerait encore
webhook.not_found404Cet endpoint webhook n'appartient pas à la clé API appelante.Non : elle échouerait encore

Statut de l’organisation org.*

codeHTTPSignificationNouvelle tentative ?
org.invoice_profile_incomplete422Le profil de facturation de l'organisation est incomplet (raison sociale, numéro fiscal, adresse).Non : elle échouerait encore
org.suspended403Cette organisation est suspendue.Non : elle échouerait encore
org.closed403Cette organisation est fermée.Non : elle échouerait encore

Intégration publique embed.*

codeHTTPSignificationNouvelle tentative ?
embed.invalid_token401Jeton d'intégration invalide.Non : elle échouerait encore
embed.token_revoked410Ce canal d'intégration n'est plus actif.Non : elle échouerait encore
embed.rate_limited429Ce canal d'intégration appelle trop vite. Réessayez plus tard.Oui : requête identique
embed.package_not_visible404Forfait introuvable.Non : elle échouerait encore

Factures de TVA invoice.*

codeHTTPSignificationNouvelle tentative ?
invoice.order_not_settled409La commande n'est pas soldée : un remboursement est en cours. Réessayez la facturation dans quelques minutes.Oui : requête identique
invoice.profile_incomplete422Le profil de facturation de l'organisation est incomplet. Complétez-le avant d'émettre une facture.Non : elle échouerait encore
invoice.already_requested409Cette commande possède déjà une facture.Non : elle échouerait encore
invoice.nothing_to_invoice409Après déduction des remboursements, aucun montant ne reste à facturer.Non : elle échouerait encore
invoice.amount_changed409Un remboursement vient de modifier le montant de la commande. Vérifiez-le puis relancez la facturation.Oui : requête identique
invoice.buyer_invalid422Les informations de l'entreprise destinataire sont incomplètes ou le numéro fiscal est invalide.Non : elle échouerait encore