Codes d’erreur.
Chaque erreur de subkit et shopkit a un code et renvoie ici – dans docsUrl de l’erreur levée et dans le champ docs des réponses HTTP. Cherchez le code, lisez la cause, appliquez la solution.
Agents de code : le serveur MCP de documentation à l’adresse https://agentkit.ch/mcp explique un code avec explain_error.
subkit
Abonnements, factures et API libre-service.
- CUSTOMER_NOT_FOUNDHTTP 404
Cause: Aucun client de facturation avec cet
externalId– il est créé au premier abonnement ou avecupsertCustomer().Solution: Appelez d’abord
upsertCustomer({ externalId, email, name }), ou vérifiez l’identifiant.- PLAN_NOT_FOUNDHTTP 404
Cause: Le
planIdne figure pas parmi lesplanspassés àsubkit().Solution: Utilisez un identifiant des plans configurés (l’outil MCP
list_plansles liste).- PLAN_NOT_PURCHASABLEHTTP 400
Cause: Le plan n’a pas de prix pour cet intervalle, ou il est masqué (plus en vente).
Solution: Proposez seulement les intervalles de
plan.prices. Un plan masqué reste chez ses abonnés mais ne peut plus être acheté.- SUBSCRIPTION_EXISTSHTTP 400
Cause: Le client a déjà un abonnement en cours.
Solution: Changez de plan avec
changePlan()au lieu d’appelersubscribe().- NO_SUBSCRIPTIONHTTP 400
Cause: L’action nécessite un abonnement en cours, et le client n’en a pas (jamais abonné, ou abonnement terminé).
Solution: Démarrez-en un avec
subscribe().getOverview()montre l’état actuel.- INVALID_STATEHTTP 400
Cause: Impossible dans l’état actuel : le paiement de l’abonnement n’est pas terminé, ou une facture ouverte doit être réglée avant un changement de plan.
Solution: Terminez ou annulez le paiement, ou payez la facture ouverte, puis réessayez.
- PAYMENT_METHOD_REQUIREDHTTP 400
Cause: Une montée en gamme est débitée immédiatement et nécessite une carte ou TWINT enregistré – il n’y en a pas.
Solution: Laissez le client en ajouter un (
POST …/payment-method) ou passez à la facture.- PAYMENT_FAILEDHTTP 400
Cause: Le débit d’une montée en gamme a été refusé (carte refusée, solde insuffisant, TWINT refusé). Le plan reste inchangé.
Solution: Demandez au client de mettre à jour son moyen de paiement, puis réessayez.
- PROVIDER_UNAVAILABLEHTTP 503
Cause: Le prestataire de paiement était injoignable ou a répondu par une erreur (il ne s’agit pas d’une carte refusée).
Solution: Réessayez plus tard. Vérifiez l’état du prestataire et la clé d’API (zahls.ch : instance et clé).
- INVOICE_NOT_FOUNDHTTP 404
Cause: Aucune facture avec cet identifiant pour ce client – ou, lors du paiement, aucune facture ouverte.
Solution: Vérifiez l’identifiant et que la facture appartient au client connecté.
- OVERDUE_INVOICEHTTP 402
Cause: Une facture du client est en retard ou passée en perte ; rien de nouveau n’est vendu tant qu’elle n’est pas payée.
Solution: Payez-la d’abord (
POST …/invoices/:id/payou par facture QR), puis réessayez.- COLLECTION_METHOD_UNAVAILABLEHTTP 400
Cause: Ce mode de paiement (carte / TWINT ou facture) n’est pas activé dans
collectionMethodsdu handler.Solution: Ajoutez-le à
collectionMethods, ou ne proposez que les modes activés.- BUSYHTTP 409
Cause: Une autre requête modifie au même moment le même abonnement, la même commande, le même panier ou le même stock (p. ex. un renouvellement ou un webhook).
Solution: Réessayez dans un instant – rien n’est perdu.
- RATE_LIMITEDHTTP 429
Cause: Votre callback
rateLimita refusé la requête, ou trop de webhooks sont arrivés pour un paiement.Solution: Attendez les secondes indiquées dans
Retry-After. Si de vrais clients atteignent la limite, augmentez-la.- WEBHOOK_INVALIDHTTP 400
Cause: Un webhook n’a pas pu être vérifié : transaction inconnue, montant ou devise différents, ou corps qui n’est pas du JSON.
Solution: Faites pointer le webhook du prestataire (format JSON) vers
…/webhooket utilisez la même instance et la même clé d’API que le kit. Les requêtes falsifiées s’arrêtent ici volontairement.- UNAUTHORIZEDHTTP 401
Cause: Le callback
authorize(ouidentify) du handler n’a pas accepté la requête – pas de session ou pas d’accès.Solution: Envoyez le cookie de session ou le jeton avec la requête et vérifiez le callback.
- UNSUPPORTED_MEDIA_TYPEHTTP 415
Cause: Un POST sans
Content-Type: application/json. Les handlers l’exigent comme protection CSRF.Solution: Envoyez du JSON avec exactement ce content type – les clients React des kits le font déjà.
- INVALID_JSONHTTP 400
Cause: Le corps de la requête n’est pas du JSON valide.
Solution: Envoyez un objet JSON comme corps.
- INVALID_INPUTHTTP 400
Cause: Un champ manque, a un mauvais type ou sort de la plage permise (p. ex. intervalle inconnu, montant négatif, lien qui n’est pas en http(s)).
Solution: Comparez le champ indiqué dans le message avec le README du kit.
- NOT_FOUNDHTTP 404
Cause: Aucune route pour cette méthode et ce chemin sous le
basePathdu handler.Solution: Vérifiez que
basePathcorrespond à l’emplacement de la route, ainsi que la méthode HTTP.- INTERNAL_ERRORHTTP 500
Cause: Une erreur inattendue (base de données, bug). Les détails ne sont pas envoyés au client.
Solution: Consultez
onErroret le journal du serveur. Un bug dans un kit : signalez-le avec la stack trace.
shopkit
Catalogue, panier, paiement, commandes et API de back-office.
- PRODUCT_NOT_FOUNDHTTP 404
Cause: Aucun produit avec cet identifiant ou ce slug.
Solution: Vérifiez l’identifiant ou le slug. Les produits archivés ne sont que dans le back-office.
- VARIANT_NOT_FOUNDHTTP 404
Cause: Aucune variante avec cet identifiant.
Solution: Utilisez un identifiant de
product.variants.- NOT_FOR_SALEHTTP 400
Cause: Le produit ou la variante est un brouillon ou archivé.
Solution: Activez-le dans le back-office, ou retirez-le du panier.
- OUT_OF_STOCKHTTP 409
Cause: Moins d’articles en stock que demandé (le stock est réservé au paiement).
Solution: Réduisez la quantité – le message indique combien il en reste.
- INVALID_QUANTITYHTTP 400
Cause: Une quantité inférieure à 1 ou supérieure au maximum par ligne, ou trop d’articles dans le panier.
Solution: Utilisez un nombre entier dans la limite indiquée par le message.
- CART_NOT_FOUNDHTTP 404
Cause: Aucun panier avec ce jeton (jeton erroné, ou ancien panier abandonné).
Solution: Créez un nouveau panier – le provider React le fait tout seul.
- CART_EMPTYHTTP 400
Cause: Paiement d’un panier sans articles.
Solution: Ajoutez d’abord des articles.
- CART_CLOSEDHTTP 409
Cause: Le panier a déjà été transformé en commande.
Solution: Affichez la commande, ou commencez un nouveau panier.
- DISCOUNT_INVALIDHTTP 400
Cause: Code de réduction inconnu, expiré, inactif ou épuisé.
Solution: Vérifiez le code dans le back-office (
list_discounts).- DISCOUNT_NOT_APPLICABLEHTTP 400
Cause: Le code est valable, mais ce panier ne remplit pas les conditions (montant minimum, produits).
Solution: Remplissez les conditions, ou retirez le code.
- GIFT_CARD_INVALIDHTTP 400 · 404
Cause: Carte cadeau inconnue, bloquée ou expirée, ou solde insuffisant.
Solution: Vérifiez le code (les tirets et la casse n’ont pas d’importance) et le solde.
- EMAIL_REQUIREDHTTP 400
Cause: Paiement sans adresse e-mail.
Solution: Renseignez
emaildans les détails du panier (updateCartDetails()).- ADDRESS_REQUIREDHTTP 400
Cause: Les articles physiques nécessitent une adresse de livraison.
Solution: Renseignez
shippingAddressdans les détails du panier.- SHIPPING_RATE_REQUIREDHTTP 400
Cause: Des articles physiques, mais aucun mode d’envoi choisi.
Solution: Définissez
shippingRateIdsur l’un des tarifs proposés.- SHIPPING_RATE_UNAVAILABLEHTTP 400
Cause: Le mode d’envoi choisi n’existe pas ou ne convient pas à ce panier.
Solution: Choisissez l’une des
shippingOptionsdu panier.- FULFILLMENT_DATE_REQUIREDHTTP 400
Cause: Le mode d’envoi choisi a un calendrier (
schedule), mais le panier n’a pas encore de jour de retrait ou de livraison – ou pas de créneau alors qu’il y en a.Solution: Définissez un jour de
shippingOptions[].schedule.dates(et un créneau detimeWindows) avecupdateCartDetails({ fulfillmentDate, fulfillmentWindow }).- FULFILLMENT_DATE_UNAVAILABLEHTTP 400
Cause: Le jour ou le créneau n’est pas (plus) proposé : avant le délai, après l’heure limite, un jour de fermeture ou au-delà de
maxDays.Solution: Choisissez un jour des
schedule.datesactuelles du mode d’envoi – la liste change avec le temps et les produits du panier.- PAYMENT_METHOD_UNAVAILABLEHTTP 400
Cause: Le mode de paiement (en ligne ou facture) n’est pas proposé pour cette boutique ou cette commande, ou aucun prestataire n’est configuré.
Solution: Configurez le prestataire et les modes de paiement dans
createShop(), ou choisissez un autre mode.- PAYMENT_METHOD_NOT_FOUNDHTTP 404
Cause: Le client n’a pas (ce) mode de paiement enregistré : aucun enregistré, supprimé, refusé par le prestataire et désactivé, ou il appartient à un autre client.
Solution: Commandez sans
useSavedPaymentMethod(lien de paiement) et laissez le client en enregistrer un avecsavePaymentMethod: true.- AMOUNT_CHANGEDHTTP 409
Cause: Le montant dû diffère de celui confirmé par le client (
expectedAmount), par exemple parce qu’un prix, un rabais ou la livraison a changé. Rien n’a été débité.Solution: Recalculez la commande (
quoteOrder/quote_order), montrez le nouveau montant au client et commandez à nouveau avec le montant confirmé.- ORDER_NOT_FOUNDHTTP 404
Cause: Aucune commande avec cet identifiant, ou le jeton du lien de commande ne correspond pas.
Solution: Vérifiez l’identifiant et le
tokendu lien de commande.- INVALID_STATEHTTP 409
Cause: Impossible dans l’état de la commande : déjà payée, impossible à payer, pas encore payée (remboursement), annulée.
Solution: Lisez d’abord
status,paymentStatusetfulfillmentStatusde la commande.- REFUND_TOO_HIGHHTTP 400
Cause: Le remboursement dépasse le montant restant à rembourser, ou les cartes cadeaux de la commande ont déjà été utilisées.
Solution: Remboursez au plus le montant indiqué dans le message.
- DUPLICATEHTTP 409
Cause: Un slug de produit, un SKU ou un code de réduction avec cette valeur existe déjà.
Solution: Choisissez-en un autre, ou modifiez l’entrée existante.
- PROVIDER_UNAVAILABLEHTTP 503
Cause: Le prestataire de paiement était injoignable ou a répondu par une erreur (il ne s’agit pas d’une carte refusée).
Solution: Réessayez plus tard. Vérifiez l’état du prestataire et la clé d’API (zahls.ch : instance et clé).
- BUSYHTTP 409
Cause: Une autre requête modifie au même moment le même abonnement, la même commande, le même panier ou le même stock (p. ex. un renouvellement ou un webhook).
Solution: Réessayez dans un instant – rien n’est perdu.
- RATE_LIMITEDHTTP 429
Cause: Votre callback
rateLimita refusé la requête, ou trop de webhooks sont arrivés pour un paiement.Solution: Attendez les secondes indiquées dans
Retry-After. Si de vrais clients atteignent la limite, augmentez-la.- WEBHOOK_INVALIDHTTP 400
Cause: Un webhook n’a pas pu être vérifié : transaction inconnue, montant ou devise différents, ou corps qui n’est pas du JSON.
Solution: Faites pointer le webhook du prestataire (format JSON) vers
…/webhooket utilisez la même instance et la même clé d’API que le kit. Les requêtes falsifiées s’arrêtent ici volontairement.- NO_PAYMENT_SLIPHTTP 400
Cause: Un import bancaire, mais le handler de back-office n’a pas de bulletin de versement pour calculer les références.
Solution: Passez
receipts.paymentSlip(p. ex.swissQrBill()) àcreateShopAdminHandler().- INVALID_CAMTHTTP 400
Cause: Le fichier bancaire n’est pas un document XML camt.053 ou camt.054.
Solution: Exportez le camt.054 (ou camt.053) en XML depuis l’e-banking et envoyez-le sous la forme
{ "camt": "<?xml …" }.- HSSOFT_REJECTEDHTTP 502
Cause: HS-Soft (WaWiAssist) a refusé la requête : clé API invalide, canal que la clé ne peut pas écrire, date de commande verrouillée, commande déjà facturée ou article inconnu.
error.details.typeen donne la raison.Solution: Corrigez la cause (vérifiez la clé API auprès de HS-Soft, corrigez la date ou l’article) et renvoyez la commande avec
syncOrder(id, { force: true }). Répéter sans changement ne sert à rien.- HSSOFT_UNAVAILABLEHTTP 503
Cause: HS-Soft n’était pas joignable ou était temporairement en panne (503, délai dépassé, erreur de passerelle).
Solution:
syncOrders()réessaie lui-même aprèsretryMinutes. Si la commande estuncertain, vérifiez d’abord dans WaWiAssist si elle est arrivée – ne la renvoyez qu’ensuite.- HSSOFT_UNMAPPEDHTTP 422
Cause: Une position ou les frais d’envoi de la commande n’ont pas d’article HS-Soft – le produit ne provient pas de l’import.
Solution: Importez le produit depuis HS-Soft, définissez
orders.articleIdouorders.shippingArticleId, ou excluez la commande avecorders.filter.- SWISSPOST_REJECTEDHTTP 502
Cause: La Poste a refusé la requête : client ou scopes de la Digital Commerce API, licence d’affranchissement, combinaison de prestations impossible pour l’envoi, adresse où La Poste ne peut pas distribuer – ou envoi à l’étranger (les étiquettes sont pour la Suisse et le Liechtenstein).
error.details.errorsdonne les codes de La Poste (E2001…).Solution: Corrigez la cause (vérifiez le client et les scopes auprès de La Poste, la licence, les prestations du mode d’envoi ou l’adresse) et créez l’étiquette à nouveau. Répéter sans changement ne sert à rien.
- SWISSPOST_UNAVAILABLEHTTP 503
Cause: La Poste n’était pas joignable ou était temporairement en panne (délai dépassé, 5xx, E9999).
Solution: Créez l’étiquette plus tard. Les propositions et la vérification d’adresse du checkout n’échouent pas pour autant – la commande continue sans elles.
- UNAUTHORIZEDHTTP 401
Cause: Le callback
authorize(ouidentify) du handler n’a pas accepté la requête – pas de session ou pas d’accès.Solution: Envoyez le cookie de session ou le jeton avec la requête et vérifiez le callback.
- UNSUPPORTED_MEDIA_TYPEHTTP 415
Cause: Un POST sans
Content-Type: application/json. Les handlers l’exigent comme protection CSRF.Solution: Envoyez du JSON avec exactement ce content type – les clients React des kits le font déjà.
- INVALID_JSONHTTP 400
Cause: Le corps de la requête n’est pas du JSON valide.
Solution: Envoyez un objet JSON comme corps.
- INVALID_INPUTHTTP 400
Cause: Un champ manque, a un mauvais type ou sort de la plage permise (p. ex. intervalle inconnu, montant négatif, lien qui n’est pas en http(s)).
Solution: Comparez le champ indiqué dans le message avec le README du kit.
- NOT_FOUNDHTTP 404
Cause: Aucune route pour cette méthode et ce chemin sous le
basePathdu handler.Solution: Vérifiez que
basePathcorrespond à l’emplacement de la route, ainsi que la méthode HTTP.- METHOD_NOT_ALLOWEDHTTP 405
Cause: L’API de back-office n’accepte que GET et POST.
Solution: Utilisez POST pour les modifications.
- TOO_LARGEHTTP 413
Cause: Le corps de la requête est trop volumineux (100 kB ; fichiers bancaires 20 MB).
Solution: Envoyez moins – divisez par exemple un gros fichier bancaire.
- INTERNAL_ERRORHTTP 500
Cause: Une erreur inattendue (base de données, bug). Les détails ne sont pas envoyés au client.
Solution: Consultez
onErroret le journal du serveur. Un bug dans un kit : signalez-le avec la stack trace.