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 avec upsertCustomer().

Solution: Appelez d’abord upsertCustomer({ externalId, email, name }), ou vérifiez l’identifiant.

PLAN_NOT_FOUNDHTTP 404

Cause: Le planId ne figure pas parmi les plans passés à subkit().

Solution: Utilisez un identifiant des plans configurés (l’outil MCP list_plans les 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’appeler subscribe().

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/pay ou par facture QR), puis réessayez.

COLLECTION_METHOD_UNAVAILABLEHTTP 400

Cause: Ce mode de paiement (carte / TWINT ou facture) n’est pas activé dans collectionMethods du 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 rateLimit a 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 …/webhook et 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 (ou identify) 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 basePath du handler.

Solution: Vérifiez que basePath correspond à 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 onError et 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 email dans les détails du panier (updateCartDetails()).

ADDRESS_REQUIREDHTTP 400

Cause: Les articles physiques nécessitent une adresse de livraison.

Solution: Renseignez shippingAddress dans les détails du panier.

SHIPPING_RATE_REQUIREDHTTP 400

Cause: Des articles physiques, mais aucun mode d’envoi choisi.

Solution: Définissez shippingRateId sur 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 shippingOptions du 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 de timeWindows) avec updateCartDetails({ 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.dates actuelles 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 avec savePaymentMethod: 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 token du 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, paymentStatus et fulfillmentStatus de 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 rateLimit a 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 …/webhook et 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.type en 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ès retryMinutes. Si la commande est uncertain, 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.articleId ou orders.shippingArticleId, ou excluez la commande avec orders.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.errors donne 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 (ou identify) 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 basePath du handler.

Solution: Vérifiez que basePath correspond à 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 onError et le journal du serveur. Un bug dans un kit : signalez-le avec la stack trace.

← Accueil agentkit