Fehlercodes.
Jeder Fehler von subkit und shopkit hat einen Code und verlinkt hierher – als docsUrl des geworfenen Fehlers und im Feld docs der HTTP-Antwort. Code suchen, Ursache lesen, Lösung anwenden.
Coding-Agents: Der Doku-MCP-Server unter https://agentkit.ch/mcp erklärt einen Code mit explain_error.
subkit
Abos, Rechnungen und die Self-Service-API.
- CUSTOMER_NOT_FOUNDHTTP 404
Ursache: Kein Billing-Kunde mit dieser
externalId– er entsteht beim ersten Abo oder mitupsertCustomer().Lösung: Zuerst
upsertCustomer({ externalId, email, name })aufrufen oder die Id prüfen.- PLAN_NOT_FOUNDHTTP 404
Ursache: Die
planIdist nicht unter denplans, die dusubkit()übergibst.Lösung: Eine Id aus den konfigurierten Plänen verwenden (das MCP-Tool
list_planslistet sie).- PLAN_NOT_PURCHASABLEHTTP 400
Ursache: Der Plan hat für dieses Intervall keinen Preis, oder er ist versteckt (wird nicht mehr verkauft).
Lösung: Nur die Intervalle aus
plan.pricesanbieten. Ein versteckter Plan bleibt bei seinen Abonnenten, ist aber nicht mehr kaufbar.- SUBSCRIPTION_EXISTSHTTP 400
Ursache: Der Kunde hat schon ein laufendes Abo.
Lösung: Den Plan mit
changePlan()wechseln stattsubscribe()aufzurufen.- NO_SUBSCRIPTIONHTTP 400
Ursache: Die Aktion braucht ein laufendes Abo, und der Kunde hat keines (nie abonniert, oder es ist abgelaufen).
Lösung: Mit
subscribe()eines starten.getOverview()zeigt den aktuellen Stand.- INVALID_STATEHTTP 400
Ursache: Im aktuellen Zustand nicht möglich: Der Checkout des Abos ist nicht abgeschlossen, oder eine offene Rechnung muss vor dem Planwechsel beglichen werden.
Lösung: Checkout abschliessen oder abbrechen, oder die offene Rechnung bezahlen, dann nochmals versuchen.
- PAYMENT_METHOD_REQUIREDHTTP 400
Ursache: Ein Upgrade wird sofort belastet und braucht eine gespeicherte Karte oder TWINT – es ist keine hinterlegt.
Lösung: Den Kunden eine hinterlegen lassen (
POST …/payment-method) oder auf Rechnung umstellen.- PAYMENT_FAILEDHTTP 400
Ursache: Die Belastung eines Upgrades wurde abgelehnt (Karte abgelehnt, zu wenig Guthaben, TWINT verweigert). Der Plan bleibt, wie er war.
Lösung: Den Kunden bitten, das Zahlungsmittel zu aktualisieren, dann nochmals versuchen.
- PROVIDER_UNAVAILABLEHTTP 503
Ursache: Der Zahlungsanbieter war nicht erreichbar oder hat mit einem Fehler geantwortet (keine abgelehnte Karte).
Lösung: Später nochmals versuchen. Status des Anbieters und API-Key prüfen (zahls.ch: Instanz und Key).
- INVOICE_NOT_FOUNDHTTP 404
Ursache: Keine Rechnung mit dieser Id für diesen Kunden – oder beim Bezahlen keine offene.
Lösung: Die Id prüfen und ob die Rechnung zum angemeldeten Kunden gehört.
- OVERDUE_INVOICEHTTP 402
Ursache: Eine Rechnung des Kunden ist überfällig oder abgeschrieben; bis sie bezahlt ist, wird nichts Neues verkauft.
Lösung: Zuerst sie bezahlen (
POST …/invoices/:id/payoder per QR-Rechnung), dann nochmals versuchen.- COLLECTION_METHOD_UNAVAILABLEHTTP 400
Ursache: Diese Zahlungsart (Karte / TWINT oder Rechnung) ist in
collectionMethodsdes Handlers nicht aktiviert.Lösung: Sie in
collectionMethodsaufnehmen oder nur die aktivierten anbieten.- BUSYHTTP 409
Ursache: Eine andere Anfrage ändert gerade dasselbe Abo, dieselbe Bestellung, denselben Warenkorb oder Lagerbestand (z. B. eine Verlängerung oder ein Webhook).
Lösung: Gleich nochmals versuchen – es geht nichts verloren.
- RATE_LIMITEDHTTP 429
Ursache: Dein Callback
rateLimithat die Anfrage abgelehnt, oder zu viele Webhooks für eine Zahlung kamen an.Lösung: Die Sekunden aus
Retry-Afterwarten. Stossen echte Kundinnen und Kunden an das Limit, es erhöhen.- WEBHOOK_INVALIDHTTP 400
Ursache: Ein Webhook liess sich nicht prüfen: unbekannte Transaktion, Betrag oder Währung weichen ab, oder der Body ist kein JSON.
Lösung: Den Webhook des Anbieters (Format JSON) auf
…/webhookzeigen lassen und dieselbe Instanz und denselben API-Key wie im Kit verwenden. Gefälschte Anfragen enden absichtlich hier.- UNAUTHORIZEDHTTP 401
Ursache: Der Callback
authorize(oderidentify) des Handlers hat die Anfrage nicht akzeptiert – keine Session oder kein Zugriff.Lösung: Session-Cookie oder Token mitschicken und den Callback prüfen.
- UNSUPPORTED_MEDIA_TYPEHTTP 415
Ursache: Ein POST ohne
Content-Type: application/json. Die Handler verlangen ihn als CSRF-Schutz.Lösung: JSON mit genau diesem Content-Type senden – die React-Clients der Kits tun das bereits.
- INVALID_JSONHTTP 400
Ursache: Der Body der Anfrage ist kein gültiges JSON.
Lösung: Ein JSON-Objekt als Body senden.
- INVALID_INPUTHTTP 400
Ursache: Ein Feld fehlt, hat den falschen Typ oder liegt ausserhalb des erlaubten Bereichs (z. B. unbekanntes Intervall, negativer Betrag, Link ohne http(s)).
Lösung: Das Feld aus der Meldung mit dem README des Kits abgleichen.
- NOT_FOUNDHTTP 404
Ursache: Keine Route für diese Methode und diesen Pfad unter dem
basePathdes Handlers.Lösung: Prüfen, ob
basePathdem Ort der Route entspricht, und die HTTP-Methode prüfen.- INTERNAL_ERRORHTTP 500
Ursache: Ein unerwarteter Fehler (Datenbank, Bug). Die Details gehen nicht an den Client.
Lösung:
onErrorund das Server-Log ansehen. Ein Bug in einem Kit: mit Stacktrace melden.
shopkit
Katalog, Warenkorb, Checkout, Bestellungen und die Backoffice-API.
- PRODUCT_NOT_FOUNDHTTP 404
Ursache: Kein Produkt mit dieser Id oder diesem Slug.
Lösung: Id oder Slug prüfen. Archivierte Produkte gibt es nur im Backoffice.
- VARIANT_NOT_FOUNDHTTP 404
Ursache: Keine Variante mit dieser Id.
Lösung: Eine Id aus
product.variantsverwenden.- NOT_FOR_SALEHTTP 400
Ursache: Das Produkt oder die Variante ist ein Entwurf oder archiviert.
Lösung: Im Backoffice aktivieren oder aus dem Warenkorb entfernen.
- OUT_OF_STOCKHTTP 409
Ursache: Weniger an Lager als verlangt (der Bestand wird beim Checkout reserviert).
Lösung: Die Menge verringern – die Meldung nennt, wie viele noch da sind.
- INVALID_QUANTITYHTTP 400
Ursache: Eine Menge unter 1 oder über dem Maximum pro Position, oder zu viele Artikel im Warenkorb.
Lösung: Eine ganze Zahl innerhalb der Grenze aus der Meldung verwenden.
- CART_NOT_FOUNDHTTP 404
Ursache: Kein Warenkorb mit diesem Token (falscher Token oder ein alter, aufgegebener Warenkorb).
Lösung: Einen neuen Warenkorb anlegen – der React-Provider tut das selbst.
- CART_EMPTYHTTP 400
Ursache: Checkout eines Warenkorbs ohne Artikel.
Lösung: Zuerst Artikel hinzufügen.
- CART_CLOSEDHTTP 409
Ursache: Aus dem Warenkorb wurde schon eine Bestellung.
Lösung: Die Bestellung zeigen oder einen neuen Warenkorb beginnen.
- DISCOUNT_INVALIDHTTP 400
Ursache: Unbekannter, abgelaufener, inaktiver oder aufgebrauchter Rabattcode.
Lösung: Den Code im Backoffice prüfen (
list_discounts).- DISCOUNT_NOT_APPLICABLEHTTP 400
Ursache: Der Code ist gültig, aber dieser Warenkorb erfüllt die Bedingungen nicht (Mindestbestellwert, Produkte).
Lösung: Die Bedingungen erfüllen oder den Code entfernen.
- GIFT_CARD_INVALIDHTTP 400 · 404
Ursache: Unbekannte, gesperrte oder abgelaufene Geschenkkarte, oder das Guthaben reicht nicht.
Lösung: Code (Bindestriche und Gross-/Kleinschreibung spielen keine Rolle) und Guthaben prüfen.
- EMAIL_REQUIREDHTTP 400
Ursache: Checkout ohne E-Mail-Adresse.
Lösung:
emailin den Warenkorbdetails setzen (updateCartDetails()).- ADDRESS_REQUIREDHTTP 400
Ursache: Physische Artikel brauchen eine Lieferadresse.
Lösung:
shippingAddressin den Warenkorbdetails setzen.- SHIPPING_RATE_REQUIREDHTTP 400
Ursache: Physische Artikel, aber keine Versandart gewählt.
Lösung:
shippingRateIdauf eine der angebotenen Versandarten setzen.- SHIPPING_RATE_UNAVAILABLEHTTP 400
Ursache: Die gewählte Versandart gibt es nicht, oder sie passt nicht zu diesem Warenkorb.
Lösung: Eine der
shippingOptionsdes Warenkorbs wählen.- FULFILLMENT_DATE_REQUIREDHTTP 400
Ursache: Die gewählte Versandart hat einen Zeitplan (
schedule), aber der Warenkorb hat noch keinen Abhol- oder Liefertag – oder kein Zeitfenster, obwohl es welche gibt.Lösung: Einen Tag aus
shippingOptions[].schedule.dates(und ein Zeitfenster austimeWindows) mitupdateCartDetails({ fulfillmentDate, fulfillmentWindow })setzen.- FULFILLMENT_DATE_UNAVAILABLEHTTP 400
Ursache: Der Tag oder das Zeitfenster wird nicht (mehr) angeboten: vor der Vorlaufzeit, nach dem Bestellschluss, an einem geschlossenen Tag oder ausserhalb von
maxDays.Lösung: Einen Tag aus den aktuellen
schedule.datesder Versandart wählen – die Liste ändert sich mit der Zeit und den Produkten im Warenkorb.- PAYMENT_METHOD_UNAVAILABLEHTTP 400
Ursache: Die Zahlungsart (online oder Rechnung) wird für diesen Shop oder diese Bestellung nicht angeboten, oder es ist kein Anbieter konfiguriert.
Lösung: Anbieter und Zahlungsarten in
createShop()konfigurieren oder eine andere Zahlungsart wählen.- PAYMENT_METHOD_NOT_FOUNDHTTP 404
Ursache: Der Kunde hat keine (solche) gespeicherte Zahlungsart: noch keine gespeichert, entfernt, vom Anbieter abgelehnt und deaktiviert, oder sie gehört einem anderen Kunden.
Lösung: Ohne
useSavedPaymentMethodbestellen (Zahlungslink) und dabei mitsavePaymentMethod: trueeine Zahlungsart speichern lassen.- AMOUNT_CHANGEDHTTP 409
Ursache: Der zu zahlende Betrag weicht vom Betrag ab, den der Kunde bestätigt hat (
expectedAmount) – etwa weil sich Preis, Rabatt oder Versand geändert hat. Es wurde nichts belastet.Lösung: Die Bestellung neu berechnen (
quoteOrder/quote_order), dem Kunden den neuen Betrag zeigen und mit dem bestätigten Betrag erneut bestellen.- ORDER_NOT_FOUNDHTTP 404
Ursache: Keine Bestellung mit dieser Id, oder der Token des Bestelllinks passt nicht.
Lösung: Id und
tokendes Bestelllinks prüfen.- INVALID_STATEHTTP 409
Ursache: Im Zustand der Bestellung nicht möglich: schon bezahlt, nicht bezahlbar, noch nicht bezahlt (Rückerstattung), storniert.
Lösung: Zuerst
status,paymentStatusundfulfillmentStatusder Bestellung lesen.- REFUND_TOO_HIGHHTTP 400
Ursache: Die Rückerstattung ist höher als der noch offene Betrag, oder die Geschenkkarten der Bestellung wurden schon eingelöst.
Lösung: Höchstens den Betrag aus der Meldung zurückerstatten.
- DUPLICATEHTTP 409
Ursache: Ein Produkt-Slug, eine SKU oder ein Rabattcode mit diesem Wert existiert schon.
Lösung: Einen anderen wählen oder den bestehenden Eintrag ändern.
- PROVIDER_UNAVAILABLEHTTP 503
Ursache: Der Zahlungsanbieter war nicht erreichbar oder hat mit einem Fehler geantwortet (keine abgelehnte Karte).
Lösung: Später nochmals versuchen. Status des Anbieters und API-Key prüfen (zahls.ch: Instanz und Key).
- BUSYHTTP 409
Ursache: Eine andere Anfrage ändert gerade dasselbe Abo, dieselbe Bestellung, denselben Warenkorb oder Lagerbestand (z. B. eine Verlängerung oder ein Webhook).
Lösung: Gleich nochmals versuchen – es geht nichts verloren.
- RATE_LIMITEDHTTP 429
Ursache: Dein Callback
rateLimithat die Anfrage abgelehnt, oder zu viele Webhooks für eine Zahlung kamen an.Lösung: Die Sekunden aus
Retry-Afterwarten. Stossen echte Kundinnen und Kunden an das Limit, es erhöhen.- WEBHOOK_INVALIDHTTP 400
Ursache: Ein Webhook liess sich nicht prüfen: unbekannte Transaktion, Betrag oder Währung weichen ab, oder der Body ist kein JSON.
Lösung: Den Webhook des Anbieters (Format JSON) auf
…/webhookzeigen lassen und dieselbe Instanz und denselben API-Key wie im Kit verwenden. Gefälschte Anfragen enden absichtlich hier.- NO_PAYMENT_SLIPHTTP 400
Ursache: Ein Bankimport, aber der Backoffice-Handler hat keinen Einzahlungsschein, um die Referenzen zu berechnen.
Lösung:
receipts.paymentSlip(z. B.swissQrBill()) ancreateShopAdminHandler()übergeben.- INVALID_CAMTHTTP 400
Ursache: Die Bankdatei ist kein camt.053- oder camt.054-XML-Dokument.
Lösung: camt.054 (oder camt.053) im E-Banking als XML exportieren und als
{ "camt": "<?xml …" }senden.- HSSOFT_REJECTEDHTTP 502
Ursache: HS-Soft (WaWiAssist) hat die Anfrage abgelehnt: ungültiger API-Key, ein Kanal, den der Key nicht schreiben darf, ein gesperrtes Bestelldatum, eine schon fakturierte Bestellung oder ein unbekannter Artikel.
error.details.typenennt den Grund.Lösung: Den Grund beheben (API-Key bei HS-Soft prüfen, Datum oder Artikel korrigieren) und die Bestellung mit
syncOrder(id, { force: true })erneut senden. Unverändert wiederholen hilft nicht.- HSSOFT_UNAVAILABLEHTTP 503
Ursache: HS-Soft war nicht erreichbar oder vorübergehend gestört (503, Zeitüberschreitung, Gateway-Fehler).
Lösung:
syncOrders()versucht es nachretryMinutesselbst wieder. Steht die Bestellung aufuncertain, zuerst in WaWiAssist nachsehen, ob sie angekommen ist – erst dann erneut senden.- HSSOFT_UNMAPPEDHTTP 422
Ursache: Eine Position oder die Versandkosten der Bestellung haben keinen HS-Soft-Artikel – das Produkt stammt nicht aus dem Import.
Lösung: Das Produkt aus HS-Soft importieren,
orders.articleIdbzw.orders.shippingArticleIdsetzen oder die Bestellung mitorders.filterausnehmen.- SWISSPOST_REJECTEDHTTP 502
Ursache: Die Post hat die Anfrage abgelehnt: Client oder Scopes der Digital Commerce API, die Frankierlizenz, eine Kombination von Leistungen, die die Sendung nicht haben kann, eine Adresse, an die die Post nicht zustellen kann – oder eine Sendung ins Ausland (Etiketten gibt es für die Schweiz und Liechtenstein).
error.details.errorsnennt die Codes der Post (E2001…).Lösung: Den Grund beheben (Client und Scopes bei der Post prüfen, Lizenz, Leistungen der Versandart oder Adresse korrigieren) und das Etikett erneut erstellen. Unverändert wiederholen hilft nicht.
- SWISSPOST_UNAVAILABLEHTTP 503
Ursache: Die Post war nicht erreichbar oder vorübergehend gestört (Zeitüberschreitung, 5xx, E9999).
Lösung: Das Etikett später erneut erstellen. Adressvorschläge und Adressprüfung im Checkout scheitern nicht daran – die Bestellung geht ohne sie weiter.
- UNAUTHORIZEDHTTP 401
Ursache: Der Callback
authorize(oderidentify) des Handlers hat die Anfrage nicht akzeptiert – keine Session oder kein Zugriff.Lösung: Session-Cookie oder Token mitschicken und den Callback prüfen.
- UNSUPPORTED_MEDIA_TYPEHTTP 415
Ursache: Ein POST ohne
Content-Type: application/json. Die Handler verlangen ihn als CSRF-Schutz.Lösung: JSON mit genau diesem Content-Type senden – die React-Clients der Kits tun das bereits.
- INVALID_JSONHTTP 400
Ursache: Der Body der Anfrage ist kein gültiges JSON.
Lösung: Ein JSON-Objekt als Body senden.
- INVALID_INPUTHTTP 400
Ursache: Ein Feld fehlt, hat den falschen Typ oder liegt ausserhalb des erlaubten Bereichs (z. B. unbekanntes Intervall, negativer Betrag, Link ohne http(s)).
Lösung: Das Feld aus der Meldung mit dem README des Kits abgleichen.
- NOT_FOUNDHTTP 404
Ursache: Keine Route für diese Methode und diesen Pfad unter dem
basePathdes Handlers.Lösung: Prüfen, ob
basePathdem Ort der Route entspricht, und die HTTP-Methode prüfen.- METHOD_NOT_ALLOWEDHTTP 405
Ursache: Die Backoffice-API nimmt nur GET und POST an.
Lösung: Für Änderungen POST verwenden.
- TOO_LARGEHTTP 413
Ursache: Der Body der Anfrage ist zu gross (100 kB; Bankdateien 20 MB).
Lösung: Weniger senden – zum Beispiel eine grosse Bankdatei aufteilen.
- INTERNAL_ERRORHTTP 500
Ursache: Ein unerwarteter Fehler (Datenbank, Bug). Die Details gehen nicht an den Client.
Lösung:
onErrorund das Server-Log ansehen. Ein Bug in einem Kit: mit Stacktrace melden.