Skip to content

Explore Zenq Pay

Sections of the home page, pricing and developer docs.

Sign in

Merchant dashboard

Error codes

Every error the API raises itself has the same JSON shape and a stable machine-readable code. Switch on code, not on message: messages are for people and may be reworded.

{ "error": { "code": "idempotency_conflict", "message": "…" } }
  • A 429 carries a Retry-After header (seconds).
  • Objects that belong to another account return 404 not_found, never 403, so an ID cannot be probed.
  • Malformed request bodies (a missing field, a wrong type) are rejected by the framework's own validation with 422 and a detail array instead of the error object.

How this page is generated

This page is generated, not written by hand. uv run python -m scripts.gen_errors_doc parses the API source (services/api/app) without running it: it collects every DomainError subclass in app/core/errors.py and elsewhere with its HTTP status and default code, the MANAGEMENT_ERROR_CODES table, and every call that raises one of those classes with an explicit literal code. The meaning column is the API's own message from one place the code is raised (… marks a value filled in at run time); generic codes get a short description instead.

The table covers every API surface, including the dashboard and platform administration. Merchant integrations using an API key mostly see unauthorized, api_key_expired, forbidden, merchant_suspended, not_found, invalid, conflict, idempotency_conflict, order_conflict, rate_limited, pricing_unavailable and platform_paused.

3 raise sites compute their code at run time (a variable rather than a literal); a static scan cannot name those, so they are not listed separately.

All codes

CodeHTTP statusMeaningRaised in
account_disabled401, 409This account is disabledadmin, auth, content, operations
addressing_unavailable503No receive key configured for …addresses
admin_mfa_required403Enable and verify MFA to use platform administrationadmin
admin_session_expired401Your administrator session was idle for too long; sign in againadmin
already_acknowledged409This amount was already acknowledged.admin, exceptions
already_disabled409This wallet is already disabled.settlement
already_frozen409These funds are already frozen; acknowledging would change nothing.admin
already_live409Live mode is already enabledcompliance
already_member409Already a memberauth
already_recovered409Case is already recoveredpayments
already_reviewed409Refund is already …refunds
already_staff409This person is already platform staffadmin
already_submitted409Application already submitted and awaiting reviewcompliance
amount_mismatch422This payment link has a fixed amountinvoices
amount_out_of_range422Amount must be between … and … USDinvoices
amount_required422Enter an amount for this paymentinvoices
api_key_expired401This API key has expiredauth
api_key_inactive409Only an active key can be rotateddashboard
approval_required409… needs a second approver: submit it through POST /admin/commandsadmin
approval_stale409This approval expired before executionadmin
artifact_expired404This export has expired and can no longer be downloadeddashboard, operations
artifact_unavailable404This job has no downloadable artifactoperations
asset_not_allowed422This asset is not accepted by this payment linkinvoices
asset_not_available422Assets not available in …: …billing, checkout, invoices
asset_rail_decimals_mismatch409This native asset declares … decimals but its … rail uses …; correct the row with app.correct_native_decimals, then verify it againadmin
asset_verification_failed409On-chain verification did not match this asset's configurationadmin
asset_verification_unavailable422Verification was unavailable; activating anyway requires force and a reasonadmin
attestation_required422Accept the attestation before submittingcompliance
audience_empty409No eligible recipient matches this audiencecontent
audience_too_large409More than … recipientscontent
below_minimum422Amount below minimum for …checkout
billing_credit_review409Your purchase credit covers this price; support must review the upgradebilling
billing_live_not_enabled503Live plan purchases are not enabled yetbilling
billing_purchase_pending409Finish the existing plan payment or contact support for its reviewbilling
billing_review409A previous plan payment requires verified recoverybilling
billing_test_only403Test payments cannot upgrade a live organizationbilling
billing_treasury_unavailable503The treasury must not be a deposit addressbilling
billing_unavailable503Platform billing store configuration is invalidbilling
binance_ipn_amount409IPN amount does not match the orderbinance
binance_ipn_malformed422malformed IPNbinance
binance_ipn_signature403invalid IPN signaturebinance
binance_pay_error503Binance Pay refused the order: …binance
binance_pay_unavailable403Binance Pay is not enabled for this storebinance
campaign_missing409The campaign no longer existscontent
campaign_not_cancellable409A … campaign can no longer be cancelledcontent
campaign_not_scheduled409The campaign is …, not scheduledcontent
campaign_not_sendable409A … campaign cannot be sentcontent
campaign_stale409The campaign changed after the send was queuedcontent
change_request_not_found404Change request not foundadmin
channel_unsupported422Campaigns are email only in this release; unsupported: …content
client_address_unavailable503Client address unavailable; try againauth
command_result_unsafe500The command result could not be recorded safely; the change was rolled back.admin
concurrent_decision409Another decision on this item was recorded at the same moment. Reload and check.admin
config_block_page_kind422A '…' block belongs on the '…' configuration pagecontent
config_page_sections422A '…' page carries exactly one '…' blockcontent
configuration_required409, 422, 503… jobs are not availableadmin, content, dashboard, operations
conflict409The request conflicts with the current state of the object.core/errors
connection_disabled409This connection is disabledoperations
connection_exists409An enabled connection already exists for this scopeoperations
content_page_missing409The scheduled page no longer existscontent
content_review_missing409Legal content needs a recorded review of this exact revision before publicationcontent
content_schedule_stale409The pinned revision is no longer this page's scheduled revisioncontent
country_not_supported422Zenq Pay does not currently offer live payments in that countrycompliance
credentials_not_allowed422Credentials must not be sent in command parameters; reference a candidate revision insteadadmin
csrf_rejected403A cookie-session request came from an origin that is not allowed.core
destination_changed409This payout is bound to a wallet that is no longer valid (…). It cannot be released to that wallet.settlement
destination_confirmation_required409, 422An authenticated attesting actor is requiredrefunds
destination_is_sender422The destination is the address that paid this invoice. Refunds are never returned to an identified paying sender, even when the address is said to be confirmed.refunds
destination_not_pending409Only a pending (enabled, not yet effective) payout-wallet change can be blockedadmin
destination_unverified422Confirm the destination address with the customer before requesting a refund; the sending address is never assumed to be a valid destination (§14)refunds
direct_route_required409announcement.send is applied through POST /admin/announcements/{id}/send; the command facade executes it only from an approved change requestcontent
email_taken409An account with this email already existsauth
email_unavailable503Email delivery is not configured on this servercore
email_unverified403, 409, 422Verify your email address before acceptingadmin, auth, billing, content, dashboard, operations
environment_invalid422environment must be live or testexceptions
evidence_changed409The amount changed since you reviewed it (now … …). Reload the page and decide again.admin, exceptions
evidence_configuration_mismatch409This evidence describes a configuration this asset no longer has: …admin
evidence_expired409This verification evidence has expired; verify the asset againadmin
evidence_missing409No verification evidence with that id exists for this asset; verify it firstadmin
evidence_required409Activation now requires recorded verification evidence. POST /admin/assets/…/verify, then submit the asset.activate command through POST /admin/commands with that evidence_id.admin
expected_version_not_applicable422… has no versioned target; omit expected_versionadmin
expected_version_required428expected_version is required for this commandadmin, operations
export_too_large422export exceeds the row limit; narrow the filtersoperations
facade_required409Resolving an alert now requires an audited reason. Submit the alert.resolve command through POST /admin/commands.admin, compliance, notifications, status
field_not_editable422Not editable by an administrator: …dashboard
forbidden403Authenticated, but this action is not allowed for this account or role.auth, support
forbidden_webhook_destination422Webhook URL host is not allowedwebhooks
gas_reconciliation_required409Gas funding requires on-chain reconciliationsettlement
idempotency_conflict409Could not reserve the Idempotency-Keybilling, invoices, operations
idempotency_key_invalid422Idempotency-Key is too longoperations
idempotency_key_required422, 428Express invoices require Idempotency-Keyinvoices, operations
incomplete422Complete these fields first: …compliance
insufficient_approvers409Enabling two-person approval for … needs … active staff who can approve it; … exist.admin
insufficient_scope403This API key does not have the … scopeauth
internal_error500A server-side check failed and the change was rolled back.core/errors
invalid400, 409, 422The request was understood but a value is not acceptable.content, core
invalid_action422Unknown actionadmin, exceptions
invalid_address422Treasury must not be the platform gas walletadmin, core
invalid_amount422… must be a decimal stringdashboard, invoices, refunds
invalid_amount_mode422amount_mode must be 'fixed' or 'customer'invoices
invalid_asset422That asset is not available for this invoicedashboard
invalid_assignee422The assignee must be active platform staff with support permissionsupport
invalid_audience422Unknown sign-in audienceauth
invalid_body422Message body must be textsupport
invalid_category422Category must be textcompliance, support
invalid_channel422Unknown channel for …notifications
invalid_columns422Duplicate column '…'dashboard
invalid_country422Country must be an ISO 3166-1 alpha-2 code (e.g. AE)compliance
invalid_credentials401Password is incorrectauth
invalid_cursor422Invalid cursor; restart from the first pageadmin, core, dashboard, operations, platform, webhooks
invalid_decision422decision must be one of …compliance
invalid_email422Invalid email: …admin, auth, notifications
invalid_environment422environment must be live or testadmin
invalid_event422Unknown events: …notifications
invalid_event_type422Unknown event types: …webhooks
invalid_filter422Filter '…' …admin, dashboard, platform
invalid_follow_up422Only a closed ticket is continued by a follow-upsupport
invalid_group422group must be day or monthadmin
invalid_idempotency_key422A 1–128 character Idempotency-Key is requiredbilling, invoices
invalid_limit422limit must be between 1 and …admin, platform
invalid_link_amounts422min_usd must not exceed max_usdinvoices
invalid_mfa_code401Invalid codeadmin, auth
invalid_month422month must be YYYY-MMadmin
invalid_name422name must be a stringauth, dashboard
invalid_network422Unknown networkadmin
invalid_parameters422Provide either a plan to set or restore_purchased, not both or neitheradmin
invalid_passkey401, 422Passkey verification failedauth
invalid_plan422Choose Pro or Eliteadmin, billing
invalid_plan_prices422Elite must cost more than Proadmin
invalid_policy422settlement_review_above must not be below settlement_min_amountadmin
invalid_precision422Amount exceeds the asset decimal precisioncheckout
invalid_priority422Unknown priority: …support
invalid_range422from must be before toadmin, dashboard, webhooks
invalid_reauth_action409Unknown reauthorization actionauth
invalid_reauth_params422invoice_id must be a UUIDauth
invalid_reference422The referenced invoice does not belong to the referenced storesupport
invalid_report422Unknown report. Choose one of …admin
invalid_resource422Unsupported saved-view resource; use one of …admin, dashboard
invalid_role422Invalid roleadmin, auth
invalid_scopes422Unknown or empty scopes: …dashboard
invalid_screening_date422The screening date cannot be in the futurecompliance
invalid_screening_list422Unknown screening list: …compliance
invalid_screening_result422result must be one of …compliance
invalid_slack_url422Slack URL must be at most … charactersnotifications, operations
invalid_sort422Unsupported sortdashboard
invalid_status422Unknown incident statusadmin, support
invalid_subject422Subject must be 1-… characterssupport
invalid_title422title must not be blankinvoices
invalid_token401, 422Invalid metrics tokenauth, ops
invalid_transition409a … job cannot become …admin, content, operations, support
invalid_visibility422Unknown message visibility: …support
invalid_volume_band422Unknown volume bandcompliance
invalid_webhook_url422Webhook URL must use httpswebhooks
invite_expired422This invitation has expiredadmin
invite_not_found404Invitation not foundadmin
invite_pending409An invitation for this email is already pendingadmin
invite_pending_limit409Too many invitations are waiting to be accepted; wait for them to be accepted or expire before inviting more peopleauth
invite_rate_limited429Too many invitations were sent today; try again tomorrowauth
invite_revoked422This invitation was revokedadmin
invite_used409This invitation was already acceptedadmin
inviter_revoked403The person who invited you no longer has authority to add staffadmin
invoice_expired422Invoice has expiredbinance
invoice_not_pending409, 422Invoice is …binance, checkout, dashboard
invoice_simulated422This test payment was simulated: no funds exist to refundrefunds
ip_not_allowed403Platform administration is not available from this network addressadmin
job_not_retryable409This job cannot be retried safelyoperations
last_approver409… needs … approvers; this change would leave …. Relax the approval policy first.admin
last_owner409The platform needs at least one active owneradmin, organizations
legal_review_required409Legal content needs a recorded review of this exact revision before publicationcontent
live_not_enabled403Live mode is not enabled for this merchant (§6 step 8)dashboard, invoices
media_busy429Too many uploads are being processed. Try again shortly.content
media_referenced409This asset is used by … and cannot be deletedcontent
media_rejected422An uploaded file is not an accepted image.content
merchant_daily_volume_limit422This account's daily live volume limit (… USD) would be exceeded; try again tomorrow (UTC) or contact supportinvoices
merchant_invoice_limit422Live invoices for this account are limited to … USD eachinvoices
merchant_limit_open_amount422Open-amount live invoices are not available while this account has invoice limits; set a fixed amountinvoices
merchant_message_required422A merchant-facing merchant_message of 10-500 characters is required; the internal reason is never sent to the merchantrefunds
merchant_monthly_volume_limit422This account's monthly live volume limit (… USD) would be exceeded; contact supportinvoices
merchant_suspended403This organization is suspendedbilling, invoices
message_not_plain_text422The message must be plain text (no HTML tags or entities)compliance
message_too_short422Write at least 10 characters for the merchantcompliance
mfa_already_enabled409Two-factor authentication is already enabledauth
mfa_enabled409MFA is already enabledauth
mfa_not_enabled409Enable two-factor authentication firstauth
mfa_required401, 403, 409Second factor requiredadmin, auth, compliance, dashboard, settlement
mfa_required_for_live403This organization processes live payments: turn on two-factor authentication for your account to continueauth
module_disabled403This part of the product is turned off for the account or deployment.core
module_unknown422Unknown module: …platform
network_not_found404Network not foundauth, settlement
no_asset422No active test asset to simulate withdashboard
no_fields422Provide a status or body to changeadmin
no_organization403You are not a member of any organizationauth
no_passkeys409No passkey is registered on this accountauth
not_admin403Platform administrator access requiredadmin, content
not_authenticated401Not signed inauth
not_cancellable409Only pending invoices can be cancelled (this one is …)exceptions
not_editable409Application is …; it cannot be editedcompliance
not_failed409Transfer is …settlement
not_found404The object does not exist, or it belongs to another account (never 403).admin, auth, billing, binance, checkout, compliance, content, dashboard, exceptions, invoices, notifications, operations, ops, refunds, settlement, support, webhooks
not_frozen409These funds are not frozen; there is no hold to release.admin
not_in_review409Transfer is …settlement
not_reviewable409Invoice is …exceptions
not_submitted409Application is …, not submittedcompliance
nothing_left_to_accept409Everything received on this invoice was refunded. There is nothing left to accept as paid; close the invoice instead.exceptions
nothing_to_refund409No confirmed funds on this invoice to refundrefunds
operation_unknown422Unknown operation: …admin
option_change_limit429This checkout has changed payment method too many times; create a new invoicecheckout
order_conflict409An Express invoice already exists for this orderinvoices
organization_suspended403This organization is suspended; API changes are blockedauth
owner_required403Only an owner can remove an ownerauth
page_archived409This page is archivedcontent
parameters_invalid422… must be an idadmin, audit, compliance, content, dashboard, operations, platform
passkey_challenge_invalid422This passkey request has expired or was already used; start againauth
passkey_exists409This passkey is already registeredauth
passkey_limit409You can register at most … passkeysauth
passkeys_disabled503Passkeys are not available on this serverauth
password_required422Choose a password to create your accountauth
permission_denied403You cannot manage mediaadmin, content, operations
plan_override409An administrator manages your plan. Contact support before purchasing.billing
plan_owned409You already own this plan or a higher lifetime planbilling
platform_paused503New invoices are temporarily paused by the platforminvoices
precondition_required428The request must carry a precondition header (for example If-Match).core
pricing_unavailable503No price quote could be produced; there is no fallback rate.billing, checkout
rate_limited429Too many requests; wait for the Retry-After seconds.auth, content
readiness_failed409Live readiness is not satisfied: …admin, compliance
reason_required422A reason is requiredadmin, exceptions, payments, platform, refunds
reauth_intent_mismatch403This authorization was issued for a different changeauth
reauth_required403Re-enter your authentication code to authorize this changeadmin, auth
refund_exceeds_available409This refund (… base units) exceeds what remains refundable on the payment (… base units after the platform fee, settled payouts and other refunds). Reject it; the merchant may request a smaller amount.refunds
refund_in_progress409A refund on this invoice is still waiting for review or has not completed on chain. Decide or finish it first; then accept what remains as paid.exceptions
refund_not_approved409This request is still waiting for review; reject it with refund.review insteadrefunds
refund_not_cancellable409Refund is …refunds
refund_rail_unsupported422Refunds on this rail are not supported: the paying sender cannot be compared safelyrefunds
reorg_hold409Payment is held after a chain reorganization; verified recovery is requiredpayments
resend_cooldown429A verification email was sent moments ago; please wait before asking againauth
reserved_config_slug422'…' is reserved for the '…' configuration pagecontent
reserved_slug422'…' is a reserved application path and cannot become a content slugcontent
reset_not_supported409… has no inherited value to fall back toplatform
review_message_required422A merchant-facing review_message of 10-500 characters is required; the internal reason is never sent to the merchantrefunds
revision_activated409This revision is already activeoperations
revision_conflict409This wallet list changed while you were adding. Reload and try again.settlement
revision_mismatch409That revision is no longer this page's current draftcontent
revision_not_pinned409Only the published revision or the current draft can be sent as a testcontent
revision_not_published409A campaign sends the announcement's PUBLISHED revision onlycontent
revision_not_verified409Only a verified revision can be activatedoperations
revision_superseded409That revision has been supersededcontent
revision_withdrawn409The pinned revision is no longer the published announcementcontent
role_not_found404Unknown platform roleadmin
sample_value_invalid422At most … sample valuescontent
saved_view_exists409You already have a view with this name for this resource hereadmin, dashboard
saved_view_stale409This saved view no longer matches the supported filters (…). Edit or delete it.dashboard
schedule_elapsed409The approved send time has passed; submit a new requestcontent
scheduled_at_invalid422scheduled_at must include a timezonecontent
scope_invalid422… replays a …admin, audit, content, operations, platform
scope_not_allowed403Your role (…) cannot create a key with: …auth
screening_lists_incomplete422Screening must cover OFAC, UN and EU lists; missing: …compliance
screening_note_required422Explain in the note how the possible match was shown to be someone elsecompliance
secret_clear_requires_command422Clearing a secret is a separate, explicit actionoperations
secret_required409A … connection needs its secret before activationoperations
secret_storage_error503Stored secret could not be authenticatedcore
self_target422You cannot disable your own accountadmin
sender_identity_unavailable409The paying sender could not be identified for every confirmed receipt on this invoice, so no destination can be accepted safelyrefunds
setting_locked409This platform setting is locked and cannot be changed here.platform
setting_not_editable422… declares no validatorplatform
setting_not_platform_scoped422… is applied through the … command, which names its own target and scopeplatform
setting_unknown404, 422Unknown setting keyadmin, compliance, platform
simulate_live_forbidden403Payments can only be simulated on test storesdashboard
slug_taken409A content page already uses the slug '…'content
source_already_selected409This source is already selected for this scopeoperations
source_not_configured409The selected source is not configured for this scope…operations
staff_signin_required401Sign in on the staff sign-in page to use platform administrationadmin
statement_too_large422This month has too many postings to display.admin, dashboard
store_archived403, 409An archived store cannot be editeddashboard, invoices
store_has_active_obligations409This store still has active obligations (…). They keep processing; archive once they settle.dashboard
target_invalid422target_id must be a … idadmin, content
telegram_unavailable422, 503Telegram notifications are not availablenotifications
template_block_unsupported422Emails carry no images; remove the hero mediacontent
template_placeholder_malformed422A '{{' or '}}' does not form an approved variablecontent
template_subject_missing422An email needs a hero block whose headline is the subjectcontent
template_variable_in_link422Template variables may not be used inside a linkcontent
template_variable_unknown422Only approved variables may be used; unknown: …content
template_variables_invalid409, 422The announcement uses content an email cannot carrycontent
ticket_closed409This ticket is closed and keeps its history. Create a follow-up ticket linked to it to continue the conversation.support
too_many_ids422At most … notification IDs per requestnotifications
unauthorized401Missing, invalid, or revoked credentials.auth
unavailable503A dependency needed to answer safely is unavailable; retry later.core/errors
unsafe_destination422The zero address cannot receive funds; tokens sent there are destroyedsettlement
unsupported_address422This Bitcoin address type is not supported for payoutscore
unsupported_network422Payouts are not supported on this networkcore
unsupported_parameter422Job cancellation is page-scoped; use cancel_pending_publicationscontent
version_conflict409Module policy has changed since it was readcontent, core, dashboard, operations, platform
weak_password422Password must be at least … charactersauth
would_lock_you_out409Your current address (…) is outside this allowlist; saving it would lock you out. Add your own network first.admin