Error reference

Every error code Arcora returns, what triggers it, and how to recover.

API errors

HTTPCodeMeaningRecovery
400bad_body / bad_paramsRequest shape rejected by Zod.Fix payload; details has the violations.
400permit_expiredPermit2 deadline past at checkout submit.Refresh quote, re-sign.
401missing_api_keyX-Arcora-Api-Key header missing.Add the header.
401invalid_api_keyHeader present but unrecognised.Rotate key at /m/settings.
401unauthorizedSIWE session missing or expired (merchant routes).Re-auth at /m/login.
403MERCHANT_PAYOUT_BLOCKEDMerchant's payout address flagged sanctions/high in Plan-5 screen.Resolve via compliance@arcorapay.xyz.
404invoice_not_foundinvoiceId not in DB.Check id; create the invoice first.
409invoice_not_payableStatus is paid, expired, refunded, or failed.Don't retry. Refund needs a different path.
410invoice_expiredexpiresAt past at submit.Create a new invoice.
412delegate_not_authorizedServer hot wallet's authorization expired. Ops must re-authorize.Contact ops.
502chain_errorOn-chain tx reverted.Read detail for the short revert reason.
503compliance_unavailable / PROVIDER_UNAVAILABLEProvider returned 5xx, fail-closed config.Wait, retry.

Compliance decisions (/api/checkout/authorize)

DecisionCodeUI behavior
allown/aPay button enabled
reviewn/aPay button disabled, show review banner with ticketId
rejectSANCTIONED_WALLETPay button disabled, neutral copy
rejectHIGH_RISK_WALLETPay button disabled, neutral copy
rejectPROVIDER_UNAVAILABLETreated as transient — UI shows "try again shortly"

On-chain errors (gateway reverts)

These show up in chain_error.detail and in the explorer. ABI-decoded names:

SelectorTrigger
MerchantAlreadyRegisteredregisterMerchant called twice from the same wallet.
MerchantInactiveMerchant deactivated; new invoices reject.
InvalidPayoutTokenToken not in supportedTokens.
InvalidPayoutAddressZero address in registerMerchant / constructor.
InvalidPayInTokenToken not whitelisted; createInvoice reverts.
InvoiceAlreadyExists(globalId)Duplicate merchantInvoiceId for the same merchant.
InvoiceAlreadyPaid(globalId)settleInvoice re-attempted after settlement.
InvoiceExpired(globalId)settleInvoice past expiresAt.
InvoiceNotFound(globalId)Invoice doesn't exist.
InvoiceNotInCreatedState(globalId)recordPayerRefund after settle.
InvoiceNotRefundable(globalId)refundInvoice on a non-Paid invoice.
PayoutShortfall(supplied, required)App Kit returned less than amountOut.
DelegateNotAuthorizedcreateInvoiceFor from an unauthorized address.
InsufficientFeesForRefund(required, accrued)Fee bucket drained before refund.