DRAFTThe sandbox is not live yet. Every example here was returned by the platform's code in a test run on 2026-10-28, priced with example fees: no fee amount in them is an SMP price. Paths and fields can change before launch. Live keys are issued only after our bank program is approved.Sandbox not live yet · examples from a test run on 2026-10-28 · example fees

Guide

Errors

One error shape everywhere, and every error code the API can return, read from the code that returns it.

One shape

Every error is JSON with two keys: error, a stable code to branch on, and message, a sentence for people. A few errors add a key, such as retry_after_seconds on 429 rate_limited. Branch on error, never on message: messages can change.

Same Idempotency-Key, different body

The response · 409
Response · 409
HTTP 409
Cache-Control: no-store

{
  "error": "idempotency_conflict",
  "message": "This Idempotency-Key was used with a different request body"
}

What the status tells you

HTTPMeaningRetry?
400The request is malformed: a missing or invalid field, header or JSON body. The message names the field.No. Fix the request.
401No credentials, or they are not valid here (for example a sandbox key on the live API).No.
403The credentials are valid but this action is not allowed, for example while a merchant account is not active.No.
404The object does not exist, or it is not yours. The two are not told apart.No.
409The request conflicts with the object's current state, or reuses an idempotency key with a different body.Not as is.
422Well formed, but a rule refuses it: a refund larger than what remains, a payout with nothing to pay, a payout hold.Only after the condition changes.
429Too many requests, or too many failed sign-ins.Yes, after Retry-After seconds.
500Our fault.Yes, with the same idempotency key.
502The bank did not confirm the request.Yes, with the same idempotency key: it never moves money twice.
503A service this call needs is not configured on this deployment.Later.

Every code

176 codes, generated by scanning every Worker's source for the codes it answers with, under the lowest HTTP status each one uses.

HTTP 400 · 20 codes
CodeHTTPReturned byExample message
account_not_found400onboardThat account isn’t in the bank connection. Choose it again.
account_type400onboardChoose a checking or savings account.
below_floor400onboard, partnersThe proposed … … below SMP’s floor of ….
business_first400onboardAdd your business’s legal name before connecting its bank account.
consent_needed400, 409onboardAgree to the face match, or decline it, first.
customer_data_refused400gatewayOnly email and name are accepted for each customer; refused: …. Never upload customer or account IDs, bank details or tokens from another provider.
ignored400onboardNot an Identity Verification webhook
invalid_json400onboard, partners, adminRequest body must be a JSON object
invalid_link400onboardThat link isn’t valid.
no_hit400adminThat screening is …: there is nothing to decide.
no_proposal400adminThere is no partner proposal to accept.
not_a_merchant_fee400onboard… is charged to partners, not merchants
not_available400partners, portalThe test bank exists only in the sandbox
photos_missing400onboardAdd … first.
plaid_error400, 502onboard, partners, portalPlaid said: …
reason_required400adminThis price is below the floor (…) in its …: write why.
screening_has_no_hit400onboardScreening … is …
validation_error400gateway, connect, onboard, partners, portal, adminallowed_origin must be the https origin of your checkout page, e.g. https://shop.example.com
weak_password400adminmessage set at runtime
wrong_code400onboard, adminThat code isn’t right. Check the email and try again.
HTTP 401 · 8 codes
CodeHTTPReturned byExample message
challenge_expired401partners, portalThat sign-in expired. Enter your email and password again.
invalid_code401, 403partners, portalThat code is not right
invalid_credentials401partners, portalEmail or password is incorrect
invalid_signature401partnersThe webhook signature or timestamp did not verify
signed_out401adminSign in to the CRM.
unauthorized401gateway, connect, onboard, partners, portalAdmin token required
unverified_webhook401onboardThis webhook’s signature could not be verified.
wrong_credentials401adminThat email and password don’t match a CRM login.
HTTP 403 · 14 codes
CodeHTTPReturned byExample message
account_closed403portalThis account is closed. Its records stay here to read; nothing can be changed.
account_suspended403portalThis merchant account is suspended. Contact work@socialmatters.pro.
agent_inactive403partnersThis agent is not active
consent_is_personal403onboardOnly … can agree to or decline …’s face match. Email … their own link, or add their ID photos here and a person at SMP reviews them without a face match.
csrf403adminThis page is out of date. Reload it and try again.
forbidden403gateway, connect, onboard, partners, portalThis page is not allowed to use this checkout session
invalid_password403partners, portalPassword is incorrect
login_disabled403partnersThis login is disabled
migration_excluded403gatewayThis account's customers can't be migrated.
not_allowed403adminThis login can’t use the CRM.
owner_session403onboardThis link is for adding your own ID only.
partner_inactive403partnersThis partner account is not active
partner_pending403partnersmessage set at runtime
selfie_is_personal403onboardA selfie is taken by the person themself, after they agree to the face match. Email … their own link.
HTTP 404 · 6 codes
CodeHTTPReturned byExample message
invite_not_found404partnersThis invite is invalid or has expired
no_integration404, 409onboard, adminName your website or app on the first page first.
not_enabled404portal… is not enabled for this account
not_found404gateway, connect, onboard, partners, portal, adminCheckout session not found
screening_not_found404onboardNo screening … for this merchant
unknown_fee_code404onboardNo fee schedule entry for …
HTTP 409 · gateway · 21 codes
CodeHTTPReturned byExample message
authorization_text_changed409gateway, partners, portalThe words changed. Read the new ones and sign again.
bank_not_linked409gatewayLink a bank account first
conflict409gateway, portalAnother change landed at the same instant; send it again
hold_exists409gateway, partnersA manual reserve hold is already on
idempotency_conflict409gatewayThis Idempotency-Key was used with a different request body
invalid_state409, 422gateway, connect, onboard, partners, adminBank account is …; link it again
last_merchant_key409gatewayThis is the last working merchant key; create or rotate in a replacement first
merchant_not_provisioned409gatewayThe merchant has no bank sub-account yet
no_release_delay409gatewayThis merchant has no release delay to clear
one_site_per_account409gatewayAn account is for one website or one app. A second one is a new application, and applying is free.
payment_not_pending409gatewayThe payment is …
payout_rejected409gatewayThe bank rejected the payout: …
pricing_not_configured409, 503gateway, onboard, partners, adminNo active price for …; the payment was not taken
quote_changed409gateway, portalThe payable balance (… cents) or its fee changed since it was shown; confirm the new figures
refund_rejected409gatewayThe bank rejected the refund: …
reserve_not_available409gatewayThe bank has no reserve account set up yet
review_decided409gatewayThis review was already …
session_busy409gatewayThis payment is already being processed. Wait a moment.
site_change_needs_review409gatewayYour website or app is the one we reviewed. Ask us to change it and we review the new one.
too_late_to_void409gatewayThe bank has settled this debit; refund it once it settles
too_many_keys409gatewayA merchant holds at most … working keys; revoke one first
HTTP 409 · connect · 1 code
CodeHTTPReturned byExample message
plaid_not_configured409, 503connect, onboard, partners, portalPlaid credentials are not configured on this deployment
HTTP 409 · onboard · 25 codes
CodeHTTPReturned byExample message
agreements_changed409onboardThe documents changed since you opened them. Read them again, then sign.
agreements_not_final409onboardmessage set at runtime
already_recorded409onboard… is already recorded
already_signed409onboardThis signature was already stored. Reload the page.
already_submitted409onboardYour integration is in review.
applicant_locked409onboardYou already answered the face match as …, so “This is me” can’t move to someone else.
application_exists409onboardThis merchant already has an application in progress.
bank_first409onboardConnect your payout bank account first: the Fee Debit Authorization names it.
category_not_bank_approved409onboardHigh-risk pricing needs a category a bank approved in writing
certification_incomplete409onboard, admin… certification case… still to pass: ….
consent_locked409onboardThe ID check has already run, so the face match answer can’t be changed here. Email work@socialmatters.pro.
consent_text_changed409onboardThe notice changed while you were reading it. Read it again and agree.
duplicate_review_open409onboard, adminThis application matches an existing merchant; approve it with duplicate_acknowledged: true if it is a separate business
integration_in_review409onboardYour website or app is in review: ask us to change it.
no_referral_link409onboard, adminYour referral link isn’t active, so this merchant can’t be attributed to you. Ask SMP.
no_sandbox409onboardYour sandbox account isn’t ready yet: open the first page again to get it.
no_webhook409onboardSubscribe a webhook endpoint first: the check sends it one event with a wrong signature.
not_editable409onboardmessage set at runtime
not_sandbox409onboardSandbox accounts are made in the sandbox.
sanctions_lists_unavailable409onboardSanctions lists are not loaded; screening could not run
sanctions_review_open409onboardSanctions hits need a disposition first
sanctions_true_match409onboardA sanctions match was confirmed
screening_already_decided409onboardA disposition already exists for that screening
tick_not_recorded409onboardWe haven’t recorded your tick on the … box. Untick it, tick it again, then submit.
version_exists409onboard, admin… already has a version effective …
HTTP 409 · partners · 8 codes
CodeHTTPReturned byExample message
agent_exists409partnersThis partner already has an agent with that email
already_ending409partnersThis partnership already ends on …
already_suspended409partnersThis agent is already suspended
application_fee_unpaid409partnersThis application is reviewed once its application fee is paid
email_in_use409partnersAn application or login already uses this email
intent_used409partners, portalThat bank connection is already confirmed
not_pending409partnersOnly a pending application can be decided
partnership_ending409partnersThis partnership has an end date: no new agents or referral links
HTTP 409 · portal · 2 codes
CodeHTTPReturned byExample message
already_active409portalThis teammate already set a password
not_enrolled409portalTwo-step sign-in is not set up
HTTP 409 · admin · 12 codes
CodeHTTPReturned byExample message
already_decided409adminThat screening already has a decision.
already_open409adminThis merchant’s sub-balance is already open.
decision_in_progress409adminSomeone else is deciding this application. Reload.
invalid_transition409adminA … merchant can’t be set ….
no_bank409adminThere is no payout account to review.
no_check409admin…’s ID hasn’t been checked yet.
no_enrollment409adminStart the setup again.
no_sub_account409adminOpen the merchant’s sub-balance at the bank first.
not_live409adminOnly an approved integration can be switched off.
not_submitted409adminOnly a submitted integration can be approved (this one is …).
not_switched_off409adminOnly a switched-off integration can be switched back on.
reconciliation_hold409adminA reconciliation hold lifts when the ledger and the bank agree again.
HTTP 410 · 5 codes
CodeHTTPReturned byExample message
code_expired410onboardThat code has expired. Ask for a new one.
intent_expired410partners, portalThat bank connection expired. Start again.
link_expired410onboard, partners, portalThis link has expired. Start again with your email.
link_used410onboardThis link was already used. Sign in with your email to continue.
setup_expired410adminThis setup link has expired. Ask for a new one from the sign-in page.
HTTP 413 · 1 code
CodeHTTPReturned byExample message
too_large413onboardFiles can be up to 10 MB. Take the photo again or save the PDF smaller.
HTTP 415 · 2 codes
CodeHTTPReturned byExample message
photo_required415onboardUse a photo (JPEG, PNG, WebP or HEIC) taken of the ID itself, not a scan or a PDF.
unsupported_file415onboardUpload a PDF or a photo (JPEG, PNG, WebP or HEIC).
HTTP 422 · 20 codes
CodeHTTPReturned byExample message
agent_deactivated422partnersA deactivated agent has no cut
authorization_mismatch422gatewayThe payment details changed. Review them again before you pay; nothing was charged.
authorization_not_in_force422gatewayNo standing authorization is in force for this account and amount
authorization_required422gateway… schedules need authorization_text_sha256: fetch the words with POST /v1/debit-schedules/authorization-text, show them to the payer before they agree, and send the SHA-256 of exactly what was shown.
early_payouts_off422gatewayPay me now (early payouts) is off for this account; only Social Matter Payments turns it on
ends_on_in_past422partnersAn end date cannot be before today (UTC)
incomplete422onboardmessage set at runtime
landing_url_not_yours422gatewaylanding_url must be on your own site (…)
no_ach_numbers422connectThe bank didn't give an account and routing number for this account, so it can't be debited. Choose a checking or savings account, or pay with routing and account number.
no_payout_account422gateway, portalThe merchant has no payout bank account on file
not_on_hold_schedule422gatewayPayout requests are for merchants on the Hold schedule
nothing_to_pay422gatewayPayable balance is … cents
over_limit422gatewayEach debit would be over this account's per-payment limit of $…
payday_aware_off422gatewayPayday-aware debits are off for this account: turn them on (PUT /v1/account/payday-aware-debits) or send payday_window_days 0
payment_not_confirmed422partnersThe provider's record does not confirm this payment: …
payout_below_fee422gatewayThe early payout fee (… cents) is not less than the payable balance (… cents)
payout_held422gatewayPayouts are on hold (…): …
refund_exceeds_payment422gatewayThe refund is more than what remains refundable on this payment
signature422onboardmessage set at runtime
unsupported_account422partners, portalmessage set at runtime
HTTP 423 · 1 code
CodeHTTPReturned byExample message
locked423, 429partners, portal, adminToo many failed attempts; try again later
HTTP 429 · 5 codes
CodeHTTPReturned byExample message
rate_limited429gatewayRate limit exceeded. Maximum … requests per minute.
too_many_attempts429onboardToo many tries. Ask for a new code.
too_many_events429onboardToo many ticks have been recorded for this application. Reload the page and sign.
too_many_invites429portalThis account has sent … team invitations in the last 24 hours, the most it can. Try again after … UTC.
too_soon429onboardWe just sent a code. Wait 30 seconds before asking for another.
HTTP 500 · 2 codes
CodeHTTPReturned byExample message
code_generation_failed500partnersCould not generate a unique referral code
internal_error500gateway, connect, onboard, partners, portal, adminAn internal error occurred
HTTP 502 · 5 codes
CodeHTTPReturned byExample message
bank_link_failed502gatewayWe couldn't confirm that bank account, and nothing was charged. Try again.
bank_link_unavailable502gatewayYour bank's sign-in couldn't start. Try again.
bank_unavailable502gatewayThe bank did not confirm the debit. Retry with the same Idempotency-Key.
micro_deposits_failed502connectThe bank did not accept the micro-deposits: …
unavailable502, 503portalWebhook delivery is not configured here
HTTP 503 · 11 codes
CodeHTTPReturned byExample message
admin_unavailable503partnersADMIN_API_TOKEN is not configured
application_fee_unavailable503partnersPartner applications are closed until the application fee checkout is configured
engine_pending503adminBounce Protection isn’t in the engine yet (…). Nothing was changed.
not_configured503gateway, onboardBank linking is not available here
not_connected503partners, adminMerchant submissions are not connected (ONBOARD service binding).
plaid_unreachable503onboardWe couldn’t reach Plaid. Try again, or upload a voided check, a bank letter or a bank document.
provider_unavailable503partners… could not be read; retry
referral_redirect_unconfigured503partnersMERCHANT_APPLY_URL is not set
sandbox_unavailable503onboardSandbox accounts are not connected yet. Your application is saved; try again shortly.
vault_unavailable503partners, portalVault public key is not configured
webhook_not_configured503partnersWhop is not configured on this deployment
Status set at runtime · 7 codes
CodeHTTPReturned byExample message
ach_company_config_invalid—gatewaymessage set at runtime
bad_response—gatewaymessage set at runtime
funding_refused—gatewayThe bank refused the transfer: …
onboard_unavailable—partnersThe application service did not answer.
payments_paused—gatewayNew payments are paused: … returns in the last … days. They resume on their own
relink_required—gatewaymessage set at runtime
reserve_released—gatewayThis reserve was already released by … on …