Skip to main content

Error catalogue

Every error the API returns is an RFC 9457 problem document with the media type application/problem+json. Its type member is the address of the page that describes it, so an agent can follow the error straight to its own documentation.

{
"type": "https://docs.co-relayer.com/errors/quota-exhausted",
"title": "The plan’s included Relay Units are used up.",
"status": 429,
"detail": "Cap of 1000 RU reached for the period ending 2026-10-19T00:00:00Z.",
"instance": "req_01JB…",
"code": "QUOTA_EXHAUSTED",
"retryable": false,
"resign": "NONE",
"details": {
"reason": "CAP_REACHED_PAYG_OFF"
},
"hint": "Turn on pay-as-you-go or upgrade the tier."
}

The members you should branch on​

MemberAlways presentWhat it is for
codeyesThe stable machine name. Branch on this, not on title or detail.
statusyesThe HTTP status. Use it when code is one your client does not know.
retryableyesWhether sending the same request again can succeed.
resignrelay pathNONE, SAME_BYTES or NEW_SIGNATURE_SAME_NONCE. Never ask for a signature unless it says so.
hintusuallyOne sentence naming the next action, written for an agent.
instanceyesThe request id. Quote it to support.
detailssome codesMachine-readable specifics, listed on each code’s page.
intentrelay pathsender, nonce, state and, once it exists, txHash.

The enum is open​

New codes are added without a breaking change, so treat an unknown code by its status and retryable members rather than failing. Additions are announced in the changelog.

The names some other documents use

A few names that appear in our own specs are not codes of this API: NO_SUBSCRIPTION is NO_ENTITLEMENT, SERVICE_HALTED is QUOTA_EXHAUSTED (or ACCOUNT_SUSPENDED), and GAS_PRICE_TOO_HIGH / GAS_PRICE_TOO_LOW are both GAS_PRICE_OUT_OF_RANGE with details.bound set to max or min.

Every code​

The machine-readable version of this table is /errors.json.

Relay path​

CodeHTTPRetryableMeaning
MALFORMED_REQUEST400noThe request body did not match the schema of the endpoint.
VARIANTS_NOT_SUPPORTED400noThe request carried several signed variants of the same transaction.
RELAYER_SIGNATURE_PRESENT400noThe transaction already had a relayerSignature.
CHAIN_ID_MISMATCH400noThe transaction was signed for a different network than this host serves.
TX_VERSION_UNSUPPORTED400noThe transaction version is not one CoRelayer relays.
TX_OPTIONS_UNSUPPORTED400noThe transaction options field has a bit CoRelayer does not relay.
LEASE_MISSING400noThe relay request arrived without the lease returned by the assign call.
LEASE_INVALID403noThe lease did not verify.
LEASE_MISMATCH409noThe lease does not belong to this transaction.
LEASE_EXPIRED409yesThe lease was older than its validity window when the transaction arrived.
NONCE_PIN_MISMATCH409noThe transaction nonce is not the nonce the assignment pinned.
RESIGN_REQUIRED409noThe assigned relayer can no longer be used, so the transaction must be signed once more.
RESIGN_SAME_NONCE409noA replacement for the same nonce is needed, at a higher gas price.
REPLACEMENT_UNDERPRICED422noThe replacement transaction does not pay enough to displace the one in the pool.
INTENT_ALREADY_EXECUTED409noThat nonce has already executed on chain.
NOTHING_TO_CANCEL409noThere is no in-flight intent to cancel.
NONCE_TOO_LOW409noThe transaction nonce is below the account nonce on chain.
NONCE_IN_FLIGHT409yesAnother intent already holds this nonce.
NONCE_GAP409noThe nonce skips ahead of the account nonce and the pool.
TOO_MANY_IN_FLIGHT429yesThis sender has as many unsettled intents as it may have at once.
RELAYER_UNKNOWN422noThe relayer address in the transaction is not one of ours.
RELAYER_SHARD_MISMATCH422noThe relayer is not in the sender’s shard.
RELAYER_RETIRED410noThe relayer in the transaction has been retired.
GAS_PRICE_OUT_OF_RANGE422noThe gas price is below the network minimum or above the cap CoRelayer relays.
GAS_LIMIT_TOO_LOW422noThe gas limit is below the movement gas of the transaction.
GAS_LIMIT_TOO_HIGH422noThe gas limit is above the ceiling of your rate class.
GAS_OVERPROVISIONED422noThe gas limit is far above what simulation says the transaction needs.
DATA_TOO_LARGE422noThe transaction data field is larger than self-serve accounts may send.
RECEIVER_NOT_ALLOWED403noThe receiver of the transaction is not allowed on this path.
SENDER_SIGNATURE_INVALID422noThe sender signature does not verify against the transaction bytes.
GUARDIAN_SIGNATURE_INVALID422noThe guardian signature does not verify.
GUARDIAN_REQUIRED422noThe sender is guarded but the transaction is not.
GUARDIAN_MISMATCH422noThe guardian in the transaction is not the sender’s active guardian.
GUARDIAN_IS_RELAYER422noThe guardian and the relayer are the same address.
INSUFFICIENT_SENDER_BALANCE422noThe sender cannot cover the value it is trying to move.
SIMULATION_FAILED422noPre-flight simulation says the transaction would fail on chain.
SWAP_VENUE_PAUSED503yesThe exchange venue used to convert USDC is paused.
CONTRACT_PAUSED503yesThe CoRelayer contract is paused for this kind of call.
ASSIGN_PROOF_REQUIRED401noThe assign call needs a proof that the sender is present.
ASSIGN_PROOF_INVALID401noThe presence proof did not verify.
FREE_FLOW_BUSY409yesThis sender already has a free transaction in flight.
FREE_FLOW_BARRED403noThis sender is temporarily barred from the free flow.
FREE_FLOW_UNAVAILABLE503yesThe free-transaction budget for this period is spent.
INTENT_ALREADY_SUBMITTED409noThis idempotency key was already used.
HOURLY_BURN_EXCEEDED429yesThe account passed the Relay Units per hour of its rate class.
SIGNER_TIMEOUT503yesThe signer did not commit before the deadline.
NO_ENTITLEMENT402noThe account has no plan that can pay for this transaction.
SENDER_NOT_AUTHORIZED403noThis sender is not authorised to spend the paying account’s plan.
QUOTA_EXHAUSTED429noThe plan’s included Relay Units are used up.
RATE_LIMITED429yesYou are sending faster than your rate class allows.
GAS_BUDGET_EXCEEDED429yesThe gas-per-second budget of your rate class in this shard is spent.
NO_RELAYER_AVAILABLE503yesNo healthy relayer can be assigned in that shard right now.
UPSTREAM_UNAVAILABLE503yesA dependency (chain gateway, node) was unavailable before anything was committed.
SIGNER_UNAVAILABLE503yesThe signer process could not be reached.
SIGNER_FENCED503yesThe signer fenced itself and refuses to sign.
INTERNAL500yesAn unexpected failure before the commit point.

Pricing and purchase​

CodeHTTPRetryableMeaning
PRICE_ABOVE_MAX409noThe price at execution time is above the maximum you signed for.
TIER_NOT_PURCHASABLE422noThat tier cannot be bought right now.
QUEUED_BLOCK_EXISTS409noA plan is already queued to start after the current one.
DOWNGRADE_NOT_IMMEDIATE409noA plan without a period cannot start while a period plan is running.
INSUFFICIENT_CREDITS402noThe account does not hold enough credits for this purchase.
DEPOSIT_BELOW_MIN422noThe deposit is below the minimum the contract accepts.
DEPOSIT_ABOVE_MAX422noThe deposit is above the configured maximum.
SWAP_BUDGET_EXHAUSTED503yesThe rolling swap budget for deposits is used up.
PAYG_PRICE_ABOVE_MAX409noThe pay-as-you-go price is above the maximum this account accepts.
DEPLOY_NOT_ALLOWED403noContract deployments and upgrades are not relayed for this account.
UNSUPPORTED_TX_FIELD422noThe transaction carries a fee-relevant field this Relay-Unit schedule does not price.
QUOTE_EXPIRED409noThe quote presented with the payment has expired.
RENEW_NOT_APPLICABLE409no“Renew now” would do nothing.

Platform​

CodeHTTPRetryableMeaning
UNAUTHENTICATED401noThe endpoint needs credentials and none were presented.
TOKEN_INVALID401noThe token did not verify.
TOKEN_EXPIRED401noThe token is past its validity.
ORIGIN_NOT_ALLOWED403noThe browser origin is not allowed for this route.
CHALLENGE_INVALID401noThe signed challenge did not verify.
API_KEY_INVALID401noThe API key is unknown, revoked, or from another environment.
API_KEY_SCOPE403noThe API key is valid but not allowed to do this.
STREAM_TICKET_INVALID401noThe ticket presented to the event stream did not verify.
FORBIDDEN403noAuthenticated, but not permitted to do this.
ACCOUNT_SUSPENDED403noThe account is suspended.
NOT_FOUND404noNo such resource.
PAYLOAD_TOO_LARGE413noThe request body is larger than the endpoint accepts.
CURSOR_INVALID400noThe pagination cursor is malformed or no longer valid.
IDEMPOTENCY_KEY_REUSED422noThat idempotency key was used for a different request body.
IDEMPOTENCY_IN_PROGRESS409yesThe first request with this key is still running.
LIMIT_REACHED409noA per-account limit is full.
WEBHOOK_URL_NOT_ALLOWED422noThat webhook URL cannot be registered.

x402​

CodeHTTPRetryableMeaning
PAYMENT_REQUIRED402noThe resource needs payment; the response describes how.
PAYMENT_INVALID402noThe payment presented did not verify.
PAYMENT_FAILED402noThe payment verified but could not be settled.