Error catalogue
One page per error code. The type URL in any problem+json response links straight here, so an error in your logs is one click from what to do about it.
116 codes
| Code | Status | Module | What to do |
|---|---|---|---|
| api.unknown_version | 400 | api | Unknown API version |
| api.versions_not_configured | 404 | api | This surface has no version registry |
| bad_body | 400 | platform | The request body could not be read |
| bad_json | 400 | platform | The request body is not valid JSON |
| bad_request | 400 | platform | The request is malformed |
| checkout.amount_out_of_range | 422 | checkout | The amount is outside the payment link's range |
| checkout.bad_cursor | 400 | checkout | The pagination cursor is not valid |
| checkout.invalid_branding | 422 | checkout | The checkout branding is not valid |
| checkout.invalid_payment_link | 422 | checkout | The payment link is not valid |
| checkout.link_not_found | 404 | checkout | No such payment link |
| checkout.link_unavailable | 409 | checkout | This payment link can no longer be used |
| checkout.logo_not_found | 404 | checkout | This checkout page has no logo |
| checkout.no_qr | 404 | checkout | This checkout has no QR to show |
| checkout.return_url_not_allowed | 422 | checkout | That return URL's host is not on the allow-list |
| checkout.session_not_found | 404 | checkout | No such checkout session |
| empty_body | 400 | platform | A JSON body is required |
| fees.assignment_not_found | 404 | fees | No fee assignment with that id |
| fees.assignment_not_proposed | 409 | fees | This assignment is not awaiting a decision |
| fees.invalid_event | 400 | fees | event must be payment, refund or payout |
| fees.invalid_method | 400 | fees | Unknown payment method |
| fees.invalid_plan | 422 | fees | The fee plan version is not valid |
| fees.invalid_status | 400 | fees | status must be draft, active or retired |
| fees.no_component | 422 | fees | The fee plan has no component for this event and method |
| fees.no_plan | 422 | fees | No fee plan is in force for this merchant |
| fees.plan_exists | 409 | fees | A fee plan with this code already exists |
| fees.plan_immutable | 409 | fees | Only a draft version can be edited |
| fees.plan_not_active | 422 | fees | The plan version is not active and cannot be proposed |
| fees.plan_not_found | 404 | fees | No fee plan with that code |
| fees.proposal_pending | 409 | fees | This merchant already has a proposal awaiting a decision |
| fees.refund_context_required | 422 | fees | Pricing a refund needs refund_of |
| fees.version_not_activatable | 409 | fees | This version cannot be activated |
| http.cross_origin | 403 | http | Cross-origin writes are refused |
| http.unknown_host | 404 | http | This host does not serve this surface |
| idempotency_in_progress | 409 | platform | A request with this key is still being processed |
| idempotency_key_required | 400 | platform | This write needs an Idempotency-Key header |
| idempotency_key_reused | 409 | platform | This Idempotency-Key was used with a different request |
| idempotency_key_too_long | 400 | platform | Idempotency-Key is longer than 255 characters |
| identity.step_up_required | 401 | identity | This action needs recent re-authentication |
| invalid_reason | 422 | platform | The reason is not one of the allowed reason codes |
| invalid_transition | 422 | platform | That state transition is not allowed |
| merchants.bank_account_in_use | 409 | merchants | That bank account cannot be removed yet |
| merchants.bank_account_not_found | 404 | merchants | This merchant has no default bank account |
| merchants.document_not_found | 404 | merchants | No such document on this merchant |
| merchants.incomplete | 409 | merchants | Onboarding is missing required information |
| merchants.invalid_bank_account | 422 | merchants | The bank account details are not valid |
| merchants.invalid_body | 400 | merchants | The request body could not be read |
| merchants.invalid_cursor | 400 | merchants | The cursor is not an RFC 3339 instant |
| merchants.invalid_document | 422 | merchants | The document is not usable |
| merchants.invalid_person | 400 | merchants | The person's details are not valid |
| merchants.invalid_profile | 422 | merchants | display_name is required |
| merchants.invalid_status | 409 | merchants | The merchant is not in a status that allows this |
| merchants.invalid_tenant | 400 | merchants | tenant_id is required |
| merchants.not_active | 403 | merchants | This merchant's live keys do not work yet |
| merchants.not_editable | 409 | merchants | The merchant profile cannot be edited in its current status |
| merchants.not_found | 404 | merchants | No merchant profile for this tenant |
| merchants.not_ready_for_live | 409 | merchants | The merchant does not yet meet the conditions for live mode |
| merchants.person_not_found | 404 | merchants | No such person on this merchant |
| merchants.too_many_persons | 422 | merchants | This merchant already has the maximum number of persons |
| module_disabled | 404 | platform | This module is not enabled for your tenant |
| not_found | 404 | platform | No such object |
| payments.amount_mismatch | 422 | payments | The provider reported a different amount than the payment |
| payments.attempt_not_allowed | 422 | payments | This payment cannot start an attempt with this method |
| payments.blocked_by_risk | 422 | payments | Risk rules blocked the payment |
| payments.cancel_not_allowed | 422 | payments | Only an open payment can be canceled |
| payments.duplicate_reference | 409 | payments | A payment with this reference is already open or paid |
| payments.evidence_required | 422 | payments | Manual resolution needs a provider reference and evidence |
| payments.invalid_amount | 422 | payments | Amount is zero, negative, or in a currency you have not enabled |
| payments.invalid_expiry | 400 | payments | expires_in_minutes is outside the allowed range |
| payments.invalid_method | 400 | payments | Unknown payment method |
| payments.invalid_outcome | 400 | payments | Unknown outcome value |
| payments.invalid_reason | 422 | payments | A reason is required for this action |
| payments.invalid_reason_code | 422 | payments | The refund reason_code is not one of the reason codes |
| payments.merchant_not_active | 409 | payments | Your merchant account is not active for live payments |
| payments.not_found | 404 | payments | No payment with that id |
| payments.provider_unavailable | 422 | payments | No provider could create an instrument |
| payments.refund_cancel_not_allowed | 409 | payments | This refund can no longer be canceled |
| payments.refund_not_allowed | 409 | payments | This payment cannot be refunded for this amount |
| payments.resolve_not_allowed | 409 | payments | This payment cannot be resolved to that outcome |
| payments.separation_of_duties | 403 | payments | The principal who requested a refund cannot decide it |
| payments.too_many_attempts | 422 | payments | This payment has used all its attempts |
| permission_denied | 403 | platform | The credential is valid but lacks the scope |
| providers.callback_kind_unsupported | 404 | providers | Unknown callback kind |
| providers.callback_rejected | 400 | providers | The callback failed verification |
| providers.credential_not_found | 404 | providers | No such credential for this provider |
| providers.declined | 422 | providers | The provider declined the instrument |
| providers.event_id_required | 400 | providers | provider_event_id is required |
| providers.invalid_provider | 422 | providers | The provider registration is not valid |
| providers.invalid_route | 422 | providers | The route is not valid |
| providers.invalid_secret_ref | 422 | providers | The credential reference is not usable |
| providers.invalid_status | 422 | providers | Unknown provider status |
| providers.no_credential | 422 | providers | No valid credential for this provider, tenant and mode |
| providers.no_route | 404 | providers | No route is configured for this method and mode |
| providers.provider_exists | 422 | providers | A provider with this code is already registered |
| providers.refund_unsupported | 422 | providers | This provider cannot refund this method |
| providers.retriable | 422 | providers | The provider is temporarily unavailable |
| providers.timeout | 504 | providers | The provider did not answer in time |
| providers.unknown_adapter | 422 | providers | No adapter of that name is registered |
| providers.unknown_provider | 404 | providers | Unknown provider |
| providers.unknown_reference | 404 | providers | No instrument or refund is registered for that provider reference |
| rate_limited | 429 | platform | Too many requests |
| ratelimit.invalid_mode | 400 | ratelimit | mode must be live or test |
| ratelimit.tenant_required | 400 | ratelimit | A tenant_id path segment is required |
| reason_required | 422 | platform | This action needs an X-Reason header |
| separation_of_duties | 403 | platform | The same principal cannot both request and approve |
| stale_version | 409 | platform | The record changed while you were editing it |
| tenant_required | 400 | platform | A tenant context is required |
| testkit.advance_out_of_range | 422 | testkit | The clock cannot be advanced by that much |
| testkit.demo_failed | 422 | testkit | The approval demo command failed on purpose |
| testkit.invalid_profile | 422 | testkit | profile must be small, month or e2e |
| testkit.not_in_live | 404 | testkit | Test-data operations are refused in live mode |
| testkit.not_simulatable | 409 | testkit | That object is already in a terminal state |
| testkit.seed_limit | — | testkit | Seeding would create more rows than the tenant allows |
| testkit.unavailable | — | testkit | A module this test operation needs is not installed |
| testkit.unknown_job_kind | 422 | testkit | No worker is registered for that job kind |
| unauthenticated | 401 | platform | No usable credential on the request |
| validation_failed | 422 | platform | One or more fields are not valid |