Docs
API https://api.orblivion.com Home

Errors

Every refusal is JSON with a stable code and a readable message:

JSON
{"error": {"code": "NOT_AS_BUILT", "message": "this transaction isn't one Orblivion built for this API key: its calldata differs from the latest swap built 0 s ago", "diffs": ["calldata"]}}

Branch on code, never on message. Some errors carry more fields beside them: unaccepted, blocked and policy (risk refusals), policy (the checks that ran), diffs (NOT_AS_BUILT), checks (session checks), signer_checks (the co-signer's failed checks), sent (what a two-step submit already sent), retry_after_s. A 429 and most 503s carry a Retry-After header.

Retrying. 429, 502 and 503 are worth retrying after a pause (Retry-After when there is one; after SIGNUP_CAPPED or KEYS_CAPPED it can be hours), and so are TOKEN_CHANGED, QUOTE_SIM_MISMATCH, ROUTE_VS_MID and ROUTE_VS_REF with a fresh plan. A 400 or 422 needs a different request. After SEQUENCER_UNREACHABLE, look for the transaction's receipt before you sign another with the same nonce.

Requests and authentication#

CodeStatusMeaning
BAD_REQUEST400a field is missing or malformed, the body isn't a JSON object, or it is over 64 KB (413)
UNKNOWN_FIELD400a hosted-agent request named a field that route doesn't take
ADDRESS_REQUIRED400a token named by a symbol that isn't a core asset: use its address
LENGTH_REQUIRED411a body sent without a plain Content-Length (chunked bodies aren't accepted)
METHOD_NOT_ALLOWED405the wrong HTTP method for the route
NOT_FOUND404no such route, or no such object for this key
UNAUTHORIZED401no API key, or an unknown, expired or revoked one
CHALLENGE_EXPIRED401no open sign-in challenge for the address: it expired (5 minutes) or was used
BAD_SIGNATURE400, 401, 422a signature that doesn't recover to the wallet: sign-in, a session's delegation or authorization
NOT_ORBIO_AGENT403this server signs in only Orbio agents' wallets and owners
WALLET_MISMATCH403the key is bound to another wallet than the request, the transaction or the session names
WALLET_NOT_BOUND403a key bound to no wallet, on a route that needs one (trading, sessions, hosted agents, your account): sign in with the wallet
FORBIDDEN403another wallet's hosted agent
CSRF_REFUSED403a browser request from another origin, or with cookies but without JSON and X-Pit-Client
DEV_DISABLED403a development-only field (fee_recipient, assume_state) on a server where they are off
RATE_LIMITED429too many requests (from this address, or from everyone at once on the public API), failed authentications or new-token screens: wait for Retry-After
SIGNUP_CAPPED429wallet sign-in would create a new account past the cap for this address today or for the whole service this hour: wait for Retry-After (it can be hours), or sign in with a wallet that already has an account
KEYS_CAPPED429wallet sign-in would issue a new API key past the cap for this address today or for the whole service this hour: keep using the keys you have, or wait for Retry-After
UNKNOWN_HOST421the request named a host this server doesn't answer for: check the base URL
SANCTIONED451an address the request involves is on the US Treasury's sanctions list (OFAC's SDN list): the wallet signing in, the wallet an API key is bound to, the trading wallet, a transaction's signer, a session's wallet or executor, a hosted agent's owner, or a league entry's owner, agent wallet or beneficiary. field names which. Orblivion serves it nothing; a key bound to it can still revoke itself and end what it started (revoke a session, pause, stop or delete a hosted agent, leave the league)
COUNTRY_BLOCKED451the request comes from a country or region under comprehensive US sanctions (Cuba, Iran, North Korea, Syria, and Ukraine's Crimea, Donetsk and Luhansk regions), which the Terms exclude
ENGINE_UNAVAILABLE503the service is starting or down: retry shortly
AUTH_DOMAIN_UNSET503the server has no sign-in domain configured, so wallet sign-in is off
ORBIO_UNAVAILABLE503Orbio's agent list couldn't be read, on a server that signs in only agents

Tokens#

CodeStatusMeaning
NO_ROUTE422no venue Orblivion can build a trade through: the only refusal about a token itself
TOKEN_NOT_ALLOWED422a symbol that isn't a core asset (name other tokens by address), or a token outside a session's list
TOKEN_UNKNOWN, UNKNOWN_TOKEN422, 404the address isn't in the registry, or isn't a token
NOT_A_TOKEN404the address isn't an ERC-20 contract on Robinhood Chain
SAME_TOKEN422the input and the output are the same token
TOKEN_CHANGED409the token's proxy now runs other code than its screen read; it is being screened again: retry shortly
SCREEN_UNAVAILABLE503the token couldn't be screened right now (every screening slot is busy): retry after Retry-After
REGISTRY_UNAVAILABLE503the token registry didn't answer
STATS_PENDING503the registry's first count is still running
DOSSIER_UNAVAILABLE503a Shield request whose Dossier verdict couldn't be read: never treated as verified. Retry after 15 seconds, or trade without Shield.

Risk and policy#

CodeStatusMeaning
RISK_NOT_ACCEPTED422severe risks the request (or the session's binding) doesn't accept; listed in unaccepted
RISK_BLOCKED422a Dossier Shield policy refuses the trade; the codes in blocked, the policy in policy
MAX_NOTIONAL422above the most one trade may be ($10,000)
MIN_NOTIONAL422below the least one trade may be ($1)
MAX_SLIPPAGE422slippage_bps over the pair's cap for the size
MAX_FEE422a fee above the server's maximum
FEE_FIXED422the request named a fee (fee_bps): the server sets it from the trade's class, the wallet's volume tier and Shield, or a session's binding. Cap it with max_fee_bps instead.
FEE_BPS422the plan's fee isn't one the schedule allows for its class and Shield, or is above the request's max_fee_bps
FEE_RECIPIENT_NOT_ALLOWED422a request for another fee recipient
FEE_MISMATCH422the fee in the calldata isn't the one the plan's class, tier and Shield (or a session's binding) set
ROUTE_VS_MID422the route lands too far under the pair's reference pool mid
ROUTE_VS_REF422the route's price sits too far from the token's independent reference
NO_REFERENCE_MID422the pair's reference mid couldn't be read, so the route can't be checked
LIMIT_NOT_REACHABLE422min_amount_out can't be met at this size now
QUOTE_ONLY422the route can be quoted but not built for signing (an aggregator)
QUOTE_SIM_MISMATCH422the plan's exact simulation delivers less than its quote (a hook or token that treats the router differently)
SIMULATION_FAILED422the plan's own simulation reverted or didn't deliver what was asked
DRY_RUN_UNFUNDABLE422a dry run of a sale couldn't pretend the wallet holds the token (its balance storage isn't a standard mapping): simulate from a wallet that holds it (fund: false), or trade a small real amount
ROUTER_NOT_ALLOWED422a transaction to a contract, or a call, that Orblivion doesn't build
PARTICIPANT_TOKEN422a token that a trading league's rules exclude for this account
TOKEN_TIERa policy check that reports a token's tier; informational
APPROVAL_MODE422approval_mode isn't budget, exact or unlimited
APPROVAL_BUDGET422the approval budget isn't a positive amount within the maximum
UNLIMITED_APPROVAL422an unlimited approval without allow_unlimited_approval: true
UNLIMITED_APPROVAL_IN_PLACEa warning check: the wallet already has an unlimited approval; revoke it
GEOFENCE422a stock token without owner_attests_non_us: true: stock tokens aren't for US persons
STOCK_PAUSED422the stock token is paused
WALLET_BLOCKED422the stock token's registry blocks this wallet
NO_MARK503no price for a token, so a dollar size can't be converted

Curve trades#

CodeStatusMeaning
CURVE_PAIR422a Pons curve trades only against its own pair token
CURVE_GRADUATED422the curve has graduated, or this buy would take it to graduation and be only partly filled: buy less, or trade the pool
SNIPE_TAX422the curve charges a snipe tax in a launch's first seconds: try again a few seconds later
FEE_MODE422the curve fee mode doesn't fit the wallet (batch needs a delegated wallet)
FEE_TOO_SMALL422the fee would round to zero: trade more
FEE_FIRST422a curve trade's fee must go first, with its trade: send them together in raw_txs

Relay#

CodeStatusMeaning
SUBMIT_DISABLED403this server doesn't relay: send the signed transaction through any RPC
NOT_AS_BUILT422the transaction isn't one Orblivion built for this key, or the fee differs; the fields in diffs
SUBMIT_REJECTED422the sequencer, or the relay's own decoding, refused the transaction
SEQUENCER_UNREACHABLE502the sequencer didn't answer: the transaction may or may not have arrived
RPC_UNAVAILABLE502the chain's RPC didn't answer, or couldn't tell whether a token by address is a Robinhood stock token, so the trade's fee class can't be read; retry shortly
VENUE_FAILED502a venue's quote or curve read failed
LIVE_UNAVAILABLE503the trading layer isn't running on this server

Fast mode#

POST /api/v1/live/fast checks a signed transaction against the rules below, in this order, and answers the first that fails; failures lists every one that failed. Each is also a rule the SDKs' own verify_fast / verifyFast report. Every code down to SIMULATION_FAILED and FAST_FUNDS is answered before anything is relayed. NONCE, SUBMIT_REJECTED, SEQUENCER_UNREACHABLE and IN_FLIGHT come after the relay may have reached the sequencer: never sign another transaction for the same trade until the chain shows the hash, or shows the nonce taken by something else (the SDKs do this themselves).

CodeStatusMeaning
FAST_DISABLED403fast mode is off on this server (it is opt-in); use prepare and submit
BAD_REQUEST400the body or raw_tx can't be read (field names it): not hex, not RLP, not a transaction
TX_ENCODING422raw_tx isn't in the one encoding fast mode takes: canonical RLP, a low-s signature, an empty access list
FAST_PAIR422the pair and direction have no pinned fast route (cbBTC, ORBIO, launchpad, Pons and long-tail tokens never do)
MARKET_CLOSED422a stock token outside the US stock-token session (Sunday 20:00 to Friday 20:00, New York)
PRICE_STALE503Orblivion's own Chainlink mark for an end is missing or stale; retry shortly
TX_TYPE422not an EIP-1559 (type 2) transaction
CHAIN_ID422not signed for chain 4663
ROUTER422not to the pinned Universal Router
VALUE422the ETH sent isn't the ETH input (or 0 for a token input)
WALLET_MISMATCH403signed by another key than this API key's wallet
NOTIONAL422under $1 or over the server's maximum notional
ROUTE_CAP422over the pinned route's own size cap (max_usd in the routes table, at Orblivion's marks): above it the pinned pool trails the normal path's best route, so the trade goes through prepare (the SDKs take the normal path themselves, before signing)
DEADLINE422the deadline has passed or is more than 60 s away
GAS422the gas limit is under the pinned route's or over 1,000,000; maxFeePerGas under the base fee or over 10 times it; the tip over the fee cap; or the most the transaction can cost over 0.0002 ETH. terms.base_fee_wei is the server's
FEE_BPS422the declared fee_bps or the calldata's fee (an input-side TRANSFER of exactly the bps of the input, an output-side PAY_PORTION) isn't this wallet's fee; terms.fee is the right one
MIN_OUT422min_out is more than the pair's cap under what the trade delivers now (by the simulation), or further under Orblivion's own Chainlink marks than the cap, the pool's fee and the pair's band (75 bps against USDG, 125 for a cross pair) together; terms.floor is the least it takes: quote again
AMOUNT_USD422amount_in is worth more than 3% away from the amount_usd the trade was sized for, at Orblivion's own Chainlink marks: the sizing marks are wrong
CLIENT_CAP422amount_in is worth more than the request's own max_notional_usd at Orblivion's marks
PERMIT422the Permit2 permit isn't for exactly this trade, expires too late, or rides on an ETH input
NOT_AS_BUILT422the calldata isn't byte for byte what Orblivion builds from the request; diffs names what differs (CALLDATA, FEE_RECIPIENT, FEE_COUNT, FEE_TOKEN, FEE_SIDE, RECIPIENT, ROUTE, COMMANDS, AS_BUILT)
GEOFENCE, STOCK_PAUSED, WALLET_BLOCKED422a stock token: as for prepare
SIMULATION_FAILED422the exact signed transaction failed its simulation (it would revert, deliver under min_out, or pay the fee wrongly); simulation.checks says which
POOL_FAR422the pinned pool delivers further under Orblivion's Chainlink marks than its fee and the pair's band: a pool pushed off the market isn't traded fast
ROUTE_VS_MID, NO_REFERENCE_MID422on an NVDA or SPY pair, the delivery (or, without the simulation, the minimum) lands too far under the reference pools' mid, or the mid can't be read
FAST_FUNDS422with simulate: false, the wallet doesn't hold what the transaction spends
NONCE422the sequencer refused the nonce and the chain doesn't show these bytes; chain.spent true means another transaction took the nonce, so this one can never land. Otherwise it may still land: look the hash up before signing anything else
SUBMIT_REJECTED, SEQUENCER_UNREACHABLE422, 502the sequencer refused it, or its answer was lost; it may have arrived
IN_FLIGHT409the same signed bytes are still being relayed by another call: wait for it, and look the hash up

Sessions#

CodeStatusMeaning
NO_SESSION404, 409no such session for this key, or (hosted agents) none attached
SESSION_LIMIT422a grant's limits are out of range
BAD_EXECUTOR422the executor is the wallet or the co-signer
EXECUTOR_OWNER403the executor is a hosted agent's: only that agent's owner can grant it a session
WALLET_CODE422the wallet runs other code than EIP7702StatelessDeleGator v1.3.0; changing it is the owner's decision
SESSION_PENDING, SESSION_REVOKED, SESSION_EXPIRED409the session isn't switched on, was revoked, or has ended
SESSION_EXPIRY409the session ends in the next few seconds
SESSION_BOUND409the stored binding doesn't hash to the root's salt; grant again
SESSION_TERMS400a trade asked for other risk terms than the session's binding
SESSION_TOKENS422a token outside the session
SESSION_TRADES_LEFT422the session's trades are used up
SESSION_MAX_TRADE422over the per-trade cap
SESSION_MAX_DAY422over the 24-hour cap (every co-signed trade counts, sent or not)
SESSION_TARGET, SESSION_RECIPIENTS, SESSION_EXECUTION422the swap isn't a router call the root allows, or pays someone other than the wallet, the router or the fee recipient
SESSION_SETUP422a token input without the session's Permit2 setup in place
SESSION_CURVE, SESSION_CURVE_ROOTS, SESSION_CURVE_STEPS, SESSION_ROOT_ALLOWS422a curve token's trade the session's curve roots don't allow
TOKEN_UNVERIFIED422a session granted before binding version 3 trading a token Dossier hasn't verified and the session didn't list
SESSIONS_UNAVAILABLE, SIGNER_REQUIRED, SIGNER_UNAVAILABLE503sessions can't be co-signed on this server right now
SIGNER_MISMATCH502the co-signer's answer wasn't the leaf asked for; nothing was co-signed

The co-signer's refusals#

When the co-signer refuses a session trade, the error's code is its own (REFUSED when the trade fails its checks) and signer_checks lists the checks that failed, each by its rule. The usual codes and rules:

Code or ruleMeaning
REFUSEDthe session trade failed the co-signer's checks; signer_checks names them
SIGNER_FROZENthe co-signer is frozen by its operator: it signs nothing
PRICE, PRICE_UNAVAILABLEthe minimum output is too far under the input at the co-signer's own price, or it has no fresh price
SIGNED_MARK_PRICEa token without a feed, priced too far under the mark the owner signed
FEE_REQUIREDthe leaf doesn't pay a fee its binding allows for the leaf's class to the fee recipient: a major leaf one of the pinned tiers between major_min_bps and major_max_bps, any other leaf exactly other_bps
FEE_CLASSthe co-signer couldn't read the leaf's fee class itself (whether a token by address is on the Robinhood stock tokens' beacon); it reads the class from the leaf's two tokens and never takes Orblivion's
SESSION_FEE, FEE_DECLAREDno fee is allowed for the leaf (its class couldn't be read), or the fee Orblivion states for it isn't one the session's binding allows for its class
SLIPPAGEthe slippage asked is over the co-signer's maximum
ROOT_BINDS_LIMITS, BINDING_NONCE, BINDING_TERMSthe root's salt isn't the hash of the limits, or the binding is malformed
ROOT_DAY_CAPa hosted executor's root without the on-chain ETH day cap
CAP_PRICEa registered cap far from the co-signer's own price
NO_FEED_SESSIONa session with a token without a feed that lasts over 24 hours
ROOT_REUSEDthe same signed root registered twice
TRADE_REFUSED, TX_REFUSEDthe trade, or an executor's transaction, failed the co-signer's checks
REFUND_REFUSEDan executor's gas can't go back yet: a session for it can still be co-signed, something it signed can still execute, or nothing is left above the refund's own gas (checks says which)
REFUND_OWNERthe executor's owner on record isn't one the co-signer can stand on (none, or not the wallet that signed its sessions): nothing is refunded
REFUND_IN_FLIGHTan earlier refund is ahead of what the chain shows: try again shortly
SANCTIONEDthe session's wallet or executor, or an executor's owner, is on the sanctions list: the co-signer registers, co-signs and refunds nothing for it (it reads its own copy of the list)
REFUND_GASa plain transfer to the owner can't be estimated (the wallet's code refuses it)
EXECUTOR_CLOSEDthe executor's gas was refunded: it trades, signs and registers sessions no more
CHAIN_UNAVAILABLEthe co-signer couldn't read the chain itself: nothing was signed
BUSYtoo many requests at once: retry

Hosted agents#

CodeStatusMeaning
TOO_MANY_AGENTS429at most 20 hosted agents per wallet
BAD_TERMS422the agent's risk terms contradict themselves
BAD_SESSION422the session can't drive this agent; every reason is in the message
OUTSIDE_SESSION422the agent's limits or terms are wider than its session's
PAPER_AGENT409a paper agent has no session or executor
STOPPED409a stopped agent can't change or resume
STOP_FIRST409stop a live agent before deleting it, or before its executor's gas goes back
KILLED409the kill switch is engaged
LIVE_DISABLED409live trading is off on this server
SESSION_NOT_ACTIVE409the attached session isn't active
NO_EXECUTOR409paper agents have no executor
SESSION_ACTIVE409a session for the agent's executor can still be co-signed: revoke it before its gas goes back
STOCK_ATTESTATION422the stock attestation isn't the agent's owner's signature over exactly this agent, executor, session, issue time and expiry, or it was issued more than an hour ago (or the signing service refused it)
STOCK_ATTESTATION_OLD409the stock attestation wasn't issued after the agent's last one or last revocation: sign a new one (stock_attestation_not_before on the agent says from when)
BAD_EXPIRY422the stock attestation must end at least 5 minutes from now, no later than the session and at most 30 days away
SESSION_MISMATCH409the stock attestation names another session than the one attached
TOKEN_STOCK422a stock token for a paper agent: only a live agent trades stock tokens, under your attestation
SIGNED_MISMATCH502the signing service's refund isn't exactly a plain transfer from the executor to you: nothing was relayed
NOT_A_REFUND422the relay refuses anything but a signed plain transfer from the executor to its owner
NOT_WEBHOOK409the agent's brain isn't a webhook
EXECUTOR_ATTESTATION503the executor's attestation couldn't be had from the signing service
HOSTED_UNAVAILABLE503hosted agents aren't running on this server
NOT_AI409the agent's brain isn't an AI model (no spend to show)

Inside a running agent, a held order is logged with its own code rather than answered as an error: for example STOCK_ATTESTATION (a stock token, and no valid attestation from you for this session), MARKET_CLOSED (a stock token outside the US stock-token session), STOCK_UNREAD (whether a token is a stock token couldn't be read), RISKS_MISSING, FEE_CLASS (the plan's fee class isn't the agent's own reading), FEE_MISMATCH (a fee its terms don't allow), SHIELD_MISMATCH, MIN_OUT_QUOTE, MIN_OUT_FLOOR, HELD_IMPERSONATOR, TOKEN_STALE, TOKEN_BLOCKED, SESSION_TOO_LONG, PAIR and LIVE_OFF. They are in the agent's logs.

An AI agent's tick that makes no call logs a hold: AI_BUDGET (its day's budget is spent), AI_OFF (the server can't call a model), AI_SHARE_SPENT or AI_POOL_SPENT (your share of Orblivion's credits, or the day's pool, is used and you haven't signed in with Orbio to continue on your own balance), AI_NOT_ELIGIBLE (a paper agent past its owner's trial, or a wallet the trial isn't open to), AI_NOT_LIVE (a live agent whose wallet hasn't yet traded the live share's minimum through Orblivion over the last days, or paid no trading fees on those trades, which back the share), AI_POOL_MODEL or AI_POOL_INTERVAL (Orblivion's credits pay only for the cheap models and 15-minute ticks, and a few of a wallet's calls each 15 minutes), AI_POOL_OFF, AI_POOL_UNAVAILABLE, POOL_AGENT or POOL_NOT_LIVE (the co-signer has no record of the agent yet, or no active trading session for the wallet), NOT_CONNECTED or DISCONNECTED (sign in with Orbio again), CONNECT_ERROR (Orbio refused Orblivion's app for a moment; your sign-in is kept), OWN_DAY_CAP, ORBIO_BALANCE, ORBIO_BUSY, ORBIO_RATE or AI_LATE (too little of the tick's time was left for a model call). Decisions paid by your own balance carry pool_hold with the reason Orblivion's credits didn't pay. An answer it refuses logs an error, and nothing trades that tick: AI_MALFORMED (not one JSON object), AI_SCHEMA (other fields than asked), AI_TOKEN (a token outside the agent's pairs), AI_PAIR (not one of its pairs), AI_SIZE (outside 1 to the per-trade limit) or AI_TOO_MANY (more orders than allowed); so does a call that failed (ORBIO_TIMEOUT, ORBIO_GATEWAY_ERROR, ORBIO_UNREACHABLE, ORBIO_UNAVAILABLE, ORBIO_REJECTED, MODEL_NOT_ALLOWED, COST_BOUND). A call that may have run without an answer (ORBIO_TIMEOUT, ORBIO_GATEWAY_ERROR, or the co-signer's answer lost) counts its worst-case cost against the agent's budget.

The league#

CodeStatusMeaning
NOT_AN_AGENT404the Orbio vault has no agent with that id
NOT_OWNER403the signed-in wallet isn't the agent's owner and no valid statement signed by the owner came with the entry
STATEMENT_EXPIRED400the statement's nonce is unknown, used or older than 10 minutes: ask for a new one
STATEMENT_MISMATCH400the statement was made for another wallet, agent, board or entrant
AGENT_ENTERED409the Orbio agent is already on that board (one entry per agent on each board)
ALREADY_ENTERED409this trading wallet, account or hosted agent already plays on that board for an agent: leave first
PRIZE_IS_LIVE409the prize league counts a trading wallet's real trades: a hosted paper agent plays the practice board, and a hosted live agent's trades count through its owner's wallet
LEAGUE_DIVISION409the account trades another division than the practice board's
LEAGUE_PAPER_ONLY409only paper hosted agents play the practice board
LEAGUE_PAIRS409on the practice board a hosted agent trades only ETH, cbBTC and ORBIO against USDG
LEAGUE_INTERVAL409a hosted practice entrant ticks at most every 300 seconds, the board's division limit
NOT_ENTERED404that entrant isn't in the league
NO_SEASON404no such season on record
LEAGUE_UNAVAILABLE503the league isn't running here, or the Orbio vault couldn't be read: retry shortly

A prize entry made without the owner's eligibility confirmation (its owner entered by signing in, or entered before the prize statement carried it) answers confirmed: false: it plays, and its CONFIRMED rule keeps it from a prize until the owner signs the prize statement and the entrant sends it to POST /api/v1/league/confirm. No refusal code goes with it. An entry with an address on the sanctions list fails its SANCTIONS rule, and can't be made at all (SANCTIONED).

A practice entrant's paper order between seasons is refused as SEASON_CLOSED, with why (a prize entrant's real trades are never held by the league). A hosted practice entrant's tick logs a hold rather than an error when its season's book isn't open: SEASON_CLOSED, LEAGUE_BOOK_PENDING, LEAGUE_UNAVAILABLE, or LEAGUE_PAIR for an order that isn't against USDG.

Raised by the SDKs#

The SDKs check every answer before anything is signed, and raise their own errors without calling the server:

ErrorCodeMeaning
Verification errorVERIFICATION_FAILEDsomething the server returned failed a local check; rule names it (for example RECIPIENT, FEE_CLASS, FEE_BPS, MIN_OUT, PRICE, QUOTE_OWN, IMPACT_OWN, RISK_CODES, RISK_NOT_ACCEPTED, V4_HOOKS, GRANT_BINDING, GRANT_CAPS, EXECUTOR_ATTESTATION). Nothing was signed.
Fast mode can't take itthe reasonwith fallback off, a fast trade that would fall back raises instead: FAST_PAIR, STALE (the warm state is older than its bounds), APPROVAL (no ERC-20 approval to Permit2 yet), POOL_FAR (the pool trades further under the SDK's Chainlink marks than its fee and the pair's band, 75 or 125 bps), ROUTE_CAP (the trade is over the pinned route's own size cap), MARKS_DIFFER (the SDK's RPC's marks are more than 3% from Orblivion's), COOLDOWN (the pair was refused on price moments ago), CONFIG_MISMATCH, or the server's refusal
Hash mismatchHASH_MISMATCHthe server answered another hash than the signed transaction's
Config mismatchCONFIG_MISMATCHthe server's config disagrees with what the SDK pins, or doesn't publish the disclosure contract
Mined mismatchMINED_MISMATCHthe mined transaction, its output or the fee isn't what was signed
RevertedTX_REVERTEDthe transaction was mined and reverted; only gas was spent
Consent requiredCONSENT_REQUIREDa session grant that changes the wallet's code needs allow7702
Insufficient fundsINSUFFICIENT_FUNDSthe wallet can't pay the value and the gas
API errorthe server's codethe server refused; code is one of the codes above, HTTP_<status> when the answer had none
Account answerACCOUNT_SHAPEan answer of client.me (GET /api/v1/me/*) isn't of the shape the SDK expects: a field missing, of another type or out of its bounds
Account walletACCOUNT_WALLETan answer of client.me is for another wallet than the client's: it is ignored
League statementLEAGUE_STATEMENTthe league statement the server asks to have signed isn't the SDK's own rebuild of it (the agent, the entrant, the wallet, the eligibility confirmation): nothing was signed
Signing mismatchSIGNING_MISMATCHthe client was asked to sign a text that isn't this wallet's own prize league statement (or, in TypeScript, its stock attestation): nothing was signed