> ## Documentation Index
> Fetch the complete documentation index at: https://tetrafi.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Error codes

> Every declared API refusal and source reason, with its meaning, remedy and retry guidance.

Use this reference to look up a refusal or a source reason. Read [Errors and refusals](https://tetrafi.mintlify.site/trade/errors.md) to parse the error body and handle retries safely.

Both tables are sorted by their first column. New codes and reasons can be added; handle values you do not recognise as described in [Errors and refusals](https://tetrafi.mintlify.site/trade/errors.md#codes-you-do-not-know).

## Refusal codes

| Code | HTTP status | Meaning | What to do | Retryable |
| :- | :- | :- | :- | :- |
| `ACCESS_FORBIDDEN` | 403 | This credential cannot perform this action. | Use a credential with the required permission. | No |
| `ACCOUNT_KEY_AUTHORITY_REQUIRED` | 403 | The request needs a current API key owned by the account with the required permission. | Use a current account-owned key that holds the permission, or ask an admin to grant it. | No |
| `ACCOUNT_NOT_AVAILABLE` | 403 | The venue account the quote names is not available to this credential. | Requote without that account, or use a credential that can trade on it. | No |
| `ACCOUNT_READING_PAUSED` | 409 | Reading this account is paused. | Resume account reads in its Controls before reading instructions. | No |
| `ADDRESS_SCREEN_UNAVAILABLE` | 503 | The sanctions address screen for the sending chain could not answer; nothing was admitted. | Retry the same request shortly, with backoff. | Yes |
| `ADVANCED_ACCOUNT_ELIGIBILITY_UNAVAILABLE` | 409 | Whether the route's venue account allows Advanced trading could not be read; nothing was placed. | Request a new quote, then place the order on it. | No |
| `ADVANCED_MODE_DISABLED` | 403 | This platform has not enabled Advanced trading; nothing was placed. | Use a Basic quote, or wait until Advanced trading is enabled. | No |
| `ADVANCED_SOURCE_ACCOUNT_UNAVAILABLE` | 409 | The selected trading source's accounts could not be read, or the selected financial account does not resolve to one wallet; no venue was asked. | Retry shortly; if it persists, choose another trading source. | Yes |
| `ADVANCED_VENUE_ACCOUNT_REQUIRED` | 409 | This route needs an Advanced venue account that the workspace does not have; nothing was placed. | Set up the venue account for Advanced trading, then request a new quote. | No |
| `AGENT_VENUE_TRADING_NOT_ELIGIBLE` | 403 | An agent service account cannot trade venues: venue quotes, desk prices, venue routes and organisation-wallet orders refuse its key. | Trade through a human-operated service account's venue-trading key, or as a member. | No |
| `AGGREGATION_ERROR` | 400 | No venue could price the request. | Change the pair, amount or filters, then request quotes again. | No |
| `AGGREGATION_TIMEOUT` | 504 | No venue returned a valid quote before the deadline. | Retry the same request shortly, with backoff. | Yes |
| `ALL_SOLVERS_FAILED` | 400 | Every venue asked refused or failed to price the request. | Change the pair, amount or filters, then request quotes again. | No |
| `AMOUNT_PRECISION_EXCEEDED` | 400 | The amount has more fractional digits than its asset allows; details names the field, decimals supplied and allowed precision. | Use at most details.allowed fractional digits for details.field, then send the request again. | No |
| `API_KEY_ORGANISATION_WALLET_AUTHORITY_UNAVAILABLE` | 503 | The API key's organisation-wallet grants or signing state could not be read, so the answer was refused rather than shown empty (GET /api/v1/me). | Retry the same request shortly, with backoff. | Yes |
| `API_KEY_ORGANISATION_WALLET_KEY_NOT_ELIGIBLE` | 409 | Only a member's own API key or a service-account key trades organisation wallets; a legacy workspace key, or another member's key, is refused. Nothing was sent. | Use your own member key or a human-operated service account's venue-trading key. | No |
| `API_KEY_ORGANISATION_WALLET_NOT_ALLOWLISTED` | 403 | This API key may not use that wallet or delivery address: the organisation wallet the request names is not in the key's grant, or the deliverTo address on POST /quotes is not an organisation wallet the key may use. | Use an organisation wallet the key is granted, or manage destinations in the app: a workspace Owner or ManageCredentials holder can add the wallet to the key's grant. | No |
| `API_KEY_ORGANISATION_WALLET_SCOPE_REQUIRED` | 409 | The API key was not granted the organisation wallet the venue would use. A quote source answers unavailable with it; an order or requote on that source is refused. | Grant the key that wallet, or bind a wallet it holds. | No |
| `API_KEY_UNAVAILABLE` | 503 | The request's API key could not be identified or confirmed as current. | Retry shortly; if it persists, check the key is still active. | Yes |
| `ASSETS_WORKSPACE_TYPE` | 403 | This workspace type cannot read taker assets. | Use a Company, Broker or Direct-user workspace, or finish taker onboarding for this workspace. | No |
| `ASSET_CATALOGUE_UNAVAILABLE` | 503 | The asset catalogue is not loaded just now. | Retry the same request shortly, with backoff. | Yes |
| `ASSET_CATALOG_UNAVAILABLE` | 503 | The asset catalogue could not be read to check the deposit network. | Retry the same request shortly, with backoff. | Yes |
| `ASSET_HAS_NO_CHAIN_DEPOSIT` | 400 | The selected asset has no on-chain deposit. | Use bank-deposit instructions for this currency, or select an asset with an on-chain token. | No |
| `ASSET_NOT_ON_CHAIN` | 400 | The asset has no deployment on the chain pinned for that side. | Pin a chain the asset is on (see GET /assets), or remove the pin. | No |
| `AUTHORIZATION_UNAVAILABLE` | 503 | Current workspace access could not be verified. | Retry the same request shortly, with backoff. | Yes |
| `AUTH_NOT_CONFIGURED` | 500 | Authentication is enabled but the token service is not configured on this server. | Contact TetraFi support with the requestId; do not retry in a loop. | No |
| `AUTH_REQUIRED` | 401 | This operation needs an authenticated caller. | Send an API key (X-API-Key) or a bearer token. | No |
| `AUTO_WITHDRAW_ROUTE_UNAVAILABLE` | 422 | Automatic withdrawal has no route for this order. | Turn off automatic withdrawal for this order, or choose another settlement wallet. | No |
| `AUTO_WITHDRAW_WALLET_REQUIRED` | 400 | Automatic withdrawal needs a settlement wallet. | Select a settlement wallet, then place the order again. | No |
| `BANK_ACCOUNTS_UNAVAILABLE` | 503 | The workspace's bank accounts could not be read. | Retry the same request shortly, with backoff. | Yes |
| `BANK_ACCOUNT_KEY_UNAVAILABLE` | 503 | The bank-account credential needed for receiving instructions is unavailable. | Retry the same request shortly, with backoff. | Yes |
| `BANK_DESTINATION_NOT_SCREENED` | 403 | The payout's bank destination has not been screened. | Screen the bank destination, then place the order again. | No |
| `BANK_DESTINATION_SCREEN_UNAVAILABLE` | 503 | The bank destination's screening could not be read; nothing was admitted. | Retry the same request shortly, with backoff. | Yes |
| `BASE_PROFILE_INCOMPLETE` | 403 | The company's base profile (legal name, country of incorporation, registration number, registered address) is incomplete, so an order it originates on a venue's own rails cannot be checked; details.capabilityBlockers names the missing fields in currentlyDue. Nothing was admitted or sent. | Complete the company details in the TetraFi app under Entity profile, then place the order again. | No |
| `BUDGET_EXHAUSTED` | 429 | This venue's quote budget is used up for now. | Wait for the Retry-After period, then requote. | Yes |
| `CAPABILITIES_UNAVAILABLE` | 503 | The workspace's verification could not be read, or changed during the read; no capability snapshot was released. | Retry the same request shortly, with backoff. | Yes |
| `CAPABILITY_BLOCKED` | 403 | The workspace cannot use this capability; each entry in details.capabilityBlockers names the state in its code (BASE\_PROFILE\_INCOMPLETE: company details missing, with the missing fields in currentlyDue; KYC\_NOT\_VERIFIED: a direct user's identity verification missing), the step that clears it in unlockStep, and where in its message. | Clear each blocker in details.capabilityBlockers: company details (legal name, country of incorporation, registration number, registered address) and a direct user's identity verification (KYC) are completed in the TetraFi app, not through the API; the request then succeeds unchanged. | No |
| `CAPABILITY_UNAVAILABLE` | 503 | Whether the workspace can use this capability could not be read (for example BASE\_PROFILE\_UNREADABLE: its company details could not be read). | Retry the same request shortly, with backoff. | Yes |
| `CHAIN_MISSING` | 400 | The quote payload is missing its execution chain. | Request a new quote, then place the order on it. | No |
| `CHAIN_PIN_NEEDS_ON_CHAIN` | 400 | A chain was pinned on a side that is not an on-chain asset. | Remove the chain pin, or name an on-chain asset. | No |
| `COMPANY_IDENTITY_CHANGED` | 409 | The company's compliance identity changed after the order was prepared. | Review the order again and place a fresh one. | No |
| `COMPANY_IDENTITY_UNAVAILABLE` | 503 | The company's compliance identity could not be read. | Retry the same request shortly, with backoff. | Yes |
| `COMPLIANCE_ATTESTATION_NOT_CONFIGURED` | 503 | On-chain compliance attestation is not configured for this route. | Choose another quote; this route cannot be traded until it is configured. | No |
| `COMPLIANCE_CREDENTIAL_UNAVAILABLE` | 503 | The compliance credential could not be published on-chain just now. | Retry the same request shortly, with backoff. | Yes |
| `COMPLIANCE_DATA_REQUIRED` | 400 | The workspace's compliance policy needs per-trade data this order did not include; details lists the missing fields. | Add the missing fields named in details, then place the order again. | No |
| `COMPLIANCE_FAILED` | 403 | The order did not pass compliance checks. | Do not retry. Contact your compliance team or TetraFi support with the requestId. | No |
| `COMPLIANCE_IDENTITY_MISMATCH` | 400 | The signed trade authorization names a compliance identity that is not the signing wallet's. | Sign the authorization again with the wallet the quote was made for. | No |
| `COMPLIANCE_MIRROR_PROPAGATING` | 503 | Compliance status is still propagating to a chain; the update has been re-sent. | Retry the same request shortly, with backoff. | Yes |
| `COMPLIANCE_POLICY_PREFLIGHT_UNAVAILABLE` | 503 | The settlement compliance policy could not be checked. | Retry the same request shortly, with backoff. | Yes |
| `COMPLIANCE_POLICY_REJECTED` | 403 | The order was refused by the settlement compliance policy. | Contact your compliance team with the requestId. | No |
| `COMPLIANCE_READINESS_UNAVAILABLE` | 503 | The wallet's compliance identity could not be prepared just now. | Retry the same request shortly, with backoff. | Yes |
| `COMPLIANCE_SERVICE_NOT_CONFIGURED` | 503 | The compliance attestation service is not configured for this route. | Choose another quote; this route cannot be traded until it is configured. | No |
| `COMPLIANCE_SETTLEMENT_UNAVAILABLE` | 503 | Compliant settlement contracts are not configured for this request. | Choose another quote or route. | No |
| `COMPLIANCE_SNAPSHOT_UNAVAILABLE` | 503 | The current compliance snapshot could not be read; nothing was admitted or sent. | Retry the same request shortly, with backoff. | Yes |
| `COMPLIANCE_SUBJECTS_UNAVAILABLE` | 503 | The parties to screen for this order could not be read. | Retry the same request shortly, with backoff. | Yes |
| `COMPLIANCE_TARGET_NOT_ATTACHED` | 503 | The settlement contract is not attached to the compliance service. | Choose another quote. | No |
| `COMPLIANCE_TARGET_UNBOUND` | 503 | The settlement contract has no compliance policy. | Choose another quote. | No |
| `CONTINUATION_ACCEPTANCE_NOT_OFFERED` | 409 | The signed acceptance does not answer the continuation's current offer. | Prepare the continuation again for a fresh offer, then sign that offer. | No |
| `CONTINUATION_ACCEPTED_BY_RETIRED_TRADER` | 409 | The continuation's trade was accepted before the client signed as trader; it is held for recovery. | Contact TetraFi support with the requestId; do not retry in a loop. | No |
| `CONTINUATION_ASSET_MISMATCH` | 409 | A trade that finishes an order must spend the asset that order left, on the same network. | Spend the asset and network the parent order left. | No |
| `CONTINUATION_EXPIRED` | 409 | The prepared continuation step has expired. | Prepare the continuation again (POST the continuation path), then sign it. | No |
| `CONTINUATION_FUNDER_MISMATCH` | 409 | The continuation was signed or funded by a wallet other than the route's taker. | Sign the continuation with the wallet that placed the order. | No |
| `CONTINUATION_FUNDING_PENDING` | 409 | Funding for this continuation was submitted or is awaiting confirmation. | Read the order's status; do not start a replacement trade. | Yes |
| `CONTINUATION_IN_PROGRESS` | 409 | Preparation or funding of this continuation is already in progress. | Read the order's status, then retry preparation to resume the same trade. | Yes |
| `CONTINUATION_NOT_ARRIVED` | 409 | The funds the continuation needs have not arrived yet. | Wait, then read the continuation again before signing. | Yes |
| `CONTINUATION_NOT_CLAIMED` | 409 | The continuation has no claimed signature to relay. | Prepare the continuation and sign it before submitting. | No |
| `CONTINUATION_NOT_PREPARED` | 409 | No continuation step is prepared for this order. | POST to the continuation path to prepare it, then sign the result. | No |
| `CONTINUATION_ORDER_ID_INVALID` | 409 | The executing venue returned an order identifier the continuation cannot use. | Contact TetraFi support with the requestId; do not retry in a loop. | No |
| `CONTINUATION_PARENT_NOT_FINISHABLE` | 409 | The named order has no funds waiting to be finished in a new trade. | Name the order whose funds are waiting, or place a new order. | No |
| `CONTINUATION_PREPARED_BY_RETIRED_TRADER` | 409 | This continuation was prepared before the client signed as trader. | Let it lapse, then prepare it again. | No |
| `CONTINUATION_REQUIRES_WORKSPACE` | 400 | An order that finishes an earlier order must be placed in that order's workspace. | Send the request in the original order's workspace. | No |
| `CONTINUATION_REVISION_REFUSED` | 409 | The continuation cannot be revised in its current state. | Read the order's nextAction, then prepare again. | No |
| `CONTINUATION_STATE_CHANGED` | 409 | The continuation's state changed while the request ran. | Read the order's nextAction before retrying. | Yes |
| `CONTINUATION_TRADE_NOT_FUNDABLE` | 409 | The venue closed this trade before it was funded; nothing moved. | Prepare the continuation again for a fresh trade. | No |
| `CONTINUATION_WALLET_MISMATCH` | 409 | A trade that finishes an order must spend from the wallet that holds its funds. | Spend from the wallet the parent order left its funds in. | No |
| `CONVERSION_IDENTITY_MISMATCH` | 409 | The venue trade already belongs to another operation; nothing was sent. | Read the existing operation, or request a new quote for a new trade. | No |
| `CONVERSION_IDENTITY_UNAVAILABLE` | 503 | The trade's identity could not be recorded; nothing was sent. | Retry the same request shortly, with backoff. | Yes |
| `CONVERSION_PAIR_MISMATCH` | 409 | The trade's pair does not match the approved conversion; nothing was sent. | Request a new quote, then place the order on it. | No |
| `CORRIDOR_NOT_OFFERED` | 400 | This quote was not offered on the corridor the request names. | Requote on a corridor the quote lists, or request new quotes. | No |
| `CORRIDOR_NOT_SUPPORTED` | 422 | No settlement path is live on both ends of this chain pair. | Choose a different chain pair or quote. | No |
| `COUNTERPARTY_ROUTER_UNAVAILABLE` | 422 | The counterparty's settlement contract is not available on this chain pair. | Choose another quote. | No |
| `COUNTERPARTY_STANDING_UNAVAILABLE` | 503 | The counterparty's compliance standing could not be recorded or confirmed just now; nothing changed. | Retry the same request shortly, with backoff. | Yes |
| `CREDENTIAL_RESEAL_REQUIRED` | 503 | The stored venue credential needs to be sealed with the current key. | Rotate or re-verify the account's credential before reading instructions. | No |
| `CREDIT_LIMIT_BREACH` | 409 | The order needs more credit than the venue account has left under its credit limit; nothing was sent. details.creditRefusal.fix says what passes: reduceAmount \{maxAmount, asset} when a smaller order fits, reduceExposure \{overBy, currency} when the account is already over its limit and only a trade that reduces what it owes is admitted. | Lower the amount to fix.maxAmount, or under reduceExposure place only a trade that reduces what the account owes, then request a new quote. | No |
| `CREDIT_READ_UNAVAILABLE` | 503 | The venue account's credit could not be read fresh enough to check this order; nothing was sent. | Retry the same request shortly, with backoff. | Yes |
| `CSV_EXPORT_RATE_LIMIT` | 429 | Too many CSV exports from this workspace in the current window. | Wait for the Retry-After period, then export again. | Yes |
| `CURSOR_STALE` | 409 | The list changed since this cursor was issued. | Start the listing again without a cursor. | No |
| `CUSTODY_WALLET_BROWSER_ONLY` | 400 | The selected wallet signs in the browser, so it cannot be used for server-side signing. | Send the wallet's own signature instead, or choose a custody wallet. | No |
| `CUSTODY_WALLET_NOT_FOUND` | 400 | The custody wallet is not registered in this workspace. | Choose a custody wallet registered in this workspace. | No |
| `CUSTODY_WALLET_WRONG_WORKSPACE` | 403 | The custody wallet belongs to another workspace. | Choose a custody wallet of this workspace. | No |
| `DEFERRED_ACCOUNTING_NOT_CONFIGURED` | 503 | Deferred accounting is not configured for this route. | Choose another quote; this route cannot be traded until it is configured. | No |
| `DEFERRED_REHYDRATION_UNAVAILABLE` | 503 | The deferred order's prepared state could not be read. | Retry the same request shortly, with backoff. | Yes |
| `DEFERRED_SETTLEMENT_ERROR` | 400 | The deferred settlement refused the order. | Correct the order as the message says, or request a new quote. | No |
| `DEFERRED_TRADE_INTENT_REQUIRED` | 400 | A deferred order must include the signed trade intent returned with the quote. | Send the trade intent from the quote with the wallet's signature. | No |
| `DELEGATED_EXECUTION_REQUIRES_WORKSPACE` | 400 | Server-side execution of the source needs a workspace context. | Send the request with the workspace's credential. | No |
| `DELEGATED_EXECUTION_UNAVAILABLE` | 409 | Server-side execution is not available for this order. | Sign and send the source transaction yourself, or choose another quote. | No |
| `DELEGATED_SOURCE_ALREADY_SUBMITTED` | 409 | This order's source transaction was already submitted. | Read the order's state instead of submitting again. | No |
| `DELEGATED_SOURCE_AUTHORIZATION_REQUIRED` | 400 | Server-side execution needs the wallet owner's authorization. | Include the owner authorization the order preparation asked for. | No |
| `DELEGATED_SOURCE_AUTHORIZATION_UNUSABLE` | 409 | The retained owner authorization can no longer be used. | Prepare the order again and authorize it again. | No |
| `DELEGATED_SOURCE_CUSTODY_UNSUPPORTED` | 501 | Server-side execution does not support this wallet's custody provider. | Use a supported wallet, or sign the source transaction yourself. | No |
| `DELEGATED_SOURCE_DEADLINE_EXPIRED` | 400 | The source authorization's deadline has passed. | Prepare and authorize the order again. | No |
| `DELEGATED_SOURCE_DEADLINE_TOO_CLOSE` | 409 | The source authorization expires too soon to be executed safely. | Authorize again with a later deadline. | No |
| `DELEGATED_SOURCE_DEADLINE_TOO_FAR` | 400 | The source authorization's deadline is further away than allowed. | Authorize again with a nearer deadline. | No |
| `DELEGATED_SOURCE_EMBEDDED_WALLET_FAILED` | 502 | The wallet provider failed to execute the source transaction. | Retry the same request shortly, with backoff. | Yes |
| `DELEGATED_SOURCE_INSUFFICIENT_GAS` | 503 | The executor does not have enough gas to send the source transaction now. | Retry the same request shortly, with backoff. | Yes |
| `DELEGATED_SOURCE_OWNER_CHANGED` | 409 | The source transaction does not belong to the wallet that was screened. | Register the source transaction from the screened wallet, or prepare a new order. | No |
| `DELEGATED_SOURCE_PLAN_MALFORMED` | 400 | The submitted source plan does not match what the order prepared. | Send the source plan exactly as the preparation returned it. | No |
| `DELEGATED_SOURCE_QUEUE_TIMEOUT` | 503 | The source transaction could not be queued in time. | Retry the same request shortly, with backoff. | Yes |
| `DELEGATED_SOURCE_REPLACEMENT_REQUIRED` | 409 | The earlier source attempt must be replaced before sending again. | Prepare the order again to get a replacement, then sign it. | No |
| `DELEGATED_SOURCE_SIGNATURE_INVALID` | 400 | The source authorization's signature does not verify. | Sign the source authorization again with the funding wallet. | No |
| `DELEGATED_SOURCE_SIGNATURE_REQUIRED` | 400 | The source authorization needs a signature. | Include the funding wallet's signature. | No |
| `DELEGATED_SOURCE_STATE_UNAVAILABLE` | 503 | The order's source submission record could not be read or written; nothing was sent. | Retry the same request shortly, with backoff. | Yes |
| `DELEGATED_SOURCE_UNAVAILABLE` | 409 | Server-side source execution is not available for this order now. | Sign and send the source transaction yourself, or choose another quote. | No |
| `DELEGATED_SOURCE_UNSUPPORTED` | 400 | This source cannot be executed server-side. | Sign and send the source transaction yourself. | No |
| `DELIVER_TO_AMBIGUOUS` | 409 | The deliverTo address matches more than one withdrawal destination. A quote source answers unavailable with it; an order or requote on that source is refused. | Name the destination exactly, including its tag or memo. | No |
| `DELIVER_TO_CHAIN_MISMATCH` | 400 | The delivery address is not on the trade's receive chain. | Set deliverTo.chain to the receive chain named in details.receiveChain, or choose a different receive chain. | No |
| `DELIVER_TO_NOT_A_WORKSPACE_WALLET` | 409 | deliverTo is not one of the workspace's own wallets. A quote source answers unavailable with it; an order or requote on that source is refused. | Deliver to a workspace wallet. | No |
| `DEPOSIT_SCREENING_PENDING` | 503 | Screening of the sending address is still running. | Retry the same request shortly, with backoff. | Yes |
| `DEPOSIT_SCREENING_UNSUPPORTED_CHAIN` | 403 | Wallet screening does not cover the sending chain, so the order is refused. | Send from a chain that screening covers. | No |
| `DESTINATION_NOT_APPROVED` | 409 | deliverTo is not an approved withdrawal destination of the venue account. A quote source answers unavailable with it; an order or requote on that source is refused. | Approve the destination on the venue account, or deliver elsewhere. | No |
| `DIRECT_DEX_EVIDENCE_UNAVAILABLE` | 503 | The swap route's preflight record could not be read. | Retry the same request shortly, with backoff. | Yes |
| `DIRECT_DEX_PREFLIGHT_REQUIRED` | 400 | This swap route needs a matching preflight before the order. | Call POST /orders/preflight for this quote, then place the order. | No |
| `DIRECT_DEX_ROUTE_INVALID` | 400 | The swap route does not match the expected shape. | Request a new quote, then place the order on it. | No |
| `DIRECT_USER_MISMATCH` | 403 | The order names a different direct user than its quote. | Send the directUserId the quote was made for. | No |
| `DUPLICATE_ORDER` | 409 | An order is already registered for this quote. | Read the existing order; do not place it again. | No |
| `EDD_REQUIRED` | 403 | Enhanced due-diligence data is required; details lists the missing fields. | Provide the missing fields named in details, then place the order again. | No |
| `EIP712_HASH_FAILED` | 400 | The order's typed-data payload could not be hashed. | Request a new quote, then place the order on it. | No |
| `EMAIL_VERIFICATION_REQUIRED` | 403 | The signed-in person has not verified their email. | Verify the email address, then retry. | No |
| `EXACT_ROUTE_UNAVAILABLE` | 422 | No executable route exists for this exact pair right now. | Change the pair or amount, or try again later. | No |
| `EXECUTION_STAGE_DISABLED` | 409 | Trading on this venue is switched off in this environment; nothing was sent. | Choose another venue's quote. | No |
| `EXECUTION_STOPPED` | 409 | Execution is stopped for this venue or route; nothing was placed or sent. | Choose another quote; retry later if the venue resumes. | No |
| `EXECUTION_UNAVAILABLE` | 409 | The route's execution path is not available, so no plan could be sealed. | Choose another quote. | No |
| `EXPORT_TOO_LARGE` | 400 | The export would hold more rows than one file allows. | Narrow the filters or the date range, then export again. | No |
| `FIAT_ARRIVAL_UNAVAILABLE` | 503 | The bank deposit's expected arrival could not be established. | Retry the same request shortly, with backoff. | Yes |
| `FIAT_BALANCE_INSUFFICIENT` | 409 | The venue account's balance does not cover this bank trade; nothing was placed. | Add funds or lower the amount, then request a new quote. | No |
| `FIAT_BALANCE_UNAVAILABLE` | 409 | The venue account's balance could not be read; nothing was placed. | Retry the same request shortly, with backoff. | Yes |
| `FIAT_BANK_ACCOUNT_UNBOUND` | 409 | The bank quote names no bank account bound to this workspace. | Bind a bank account for this venue account, then request a new quote. | No |
| `FIAT_CARD_ACCOUNT_UNREADABLE` | 409 | The bank quote's venue account could not be read. | Request a new quote, then place the order on it. | No |
| `FIAT_CARD_NOT_A_BANK_CARD` | 409 | The quote is not a bank quote, so bank terms do not apply. | Remove the bank terms from the order. | No |
| `FIAT_DEPOSIT_FIRST_NEEDS_MEMBER` | 403 | Deposit-first trades need a signed-in member to confirm; an API key cannot consent. | Have a member confirm the trade in TetraFi. | No |
| `FIAT_DEPOSIT_FIRST_UNAVAILABLE` | 422 | Deposit first is not available for this trade. | Pay from the venue account balance instead. | No |
| `FIAT_FUNDING_MISMATCH` | 409 | The funding chosen does not match how the venue funds this bank trade. | Remove the funding choice, or match the venue's funding model. | No |
| `FIAT_FUNDING_MODEL_UNSUPPORTED` | 422 | The venue's funding model for this trade is not supported yet; nothing was placed. | Choose another quote. | No |
| `FIAT_PAYOUT_FEE_UNVERIFIED` | 409 | The bank payout fee could not be verified. | Request a new quote, then place the order on it. | No |
| `FIRM_ORDER_REQUIRED` | 409 | The firm order must exist before its signature is submitted. | Place the order first, then submit the signature. | No |
| `FORBIDDEN` | 403 | The caller may not read this record. | Use a credential whose role covers the record. | No |
| `FUNDER_PERMIT_NOT_APPLICABLE` | 400 | This continuation is signed as a route trade intent, not a funder permit. | Send routeTradeIntent and routeTradeIntentSignature instead. | No |
| `FUNDER_PERMIT_REQUIRED` | 400 | This continuation needs funderSignature and funderPermit2. | Include funderSignature and funderPermit2. | No |
| `FUNDING_AUTHORIZATION_TOO_LARGE` | 400 | funderPermit2 is larger than allowed. | Correct the request body as the message says, then send it again. | No |
| `FUNDING_NOT_ACCEPTED` | 400 | This quote is not paid from a venue account, so it takes no funding choice. | Remove the funding field. | No |
| `FUNDING_NOT_AVAILABLE` | 404 | No pending funding step is available to this caller for this order. | Read the order's current state; terminal orders do not offer funding data. Check the order id and workspace if no order is visible. | No |
| `FUNDING_SHORTFALL` | 409 | The venue account holds less than the trade needs; nothing was sent. | Fund the venue account, then request a new quote. | No |
| `HELD_QUOTE_SOURCE_UNRESOLVED` | 409 | The held quote's trading source or exact venue account can no longer be resolved; nothing was sent. | Request a new quote, then place the order on it. | No |
| `HIGH_SLIPPAGE_ACK_REQUIRED` | 422 | The quote's slippage is above the threshold that needs acknowledgement. | Acknowledge the high slippage in the request, or choose a better quote. | No |
| `IDEMPOTENCY_AUTHORITY_REQUIRED` | 403 | The caller no longer holds the authority needed to replay this stored response. | Use a credential with the same authority as the original request. | No |
| `IDEMPOTENCY_CONFLICT` | 409 | This Idempotency-Key was already used with a different request body. | Use a new Idempotency-Key for a different request. | No |
| `IDEMPOTENCY_KEY_INVALID` | 400 | The Idempotency-Key header is repeated, padded, empty or too long. | Send one Idempotency-Key of 1 to 255 characters. | No |
| `IDEMPOTENCY_KEY_REQUIRED` | 400 | This operation requires an Idempotency-Key header. | Add an Idempotency-Key header and send the request again. | No |
| `IDEMPOTENCY_UNAVAILABLE` | 503 | The request's idempotency record could not be verified. | Retry with the same Idempotency-Key shortly. | Yes |
| `INSUFFICIENT_BALANCE` | 422 | The paying wallet does not hold enough of the input asset. | Add funds or lower the amount, then place the order again. | No |
| `INSUFFICIENT_LIQUIDITY` | 422 | No venue has enough liquidity for this amount right now. | Try a smaller amount, or try again later. | No |
| `INSUFFICIENT_LP_BALANCE` | 422 | The workspace's balance with this liquidity provider does not cover the order. | Deposit funds with the provider, then place the order again. | No |
| `INSUFFICIENT_PERMISSION` | 403 | The caller's role or key permissions do not allow this action. | Ask a workspace admin for the permission the message names. | No |
| `INSUFFICIENT_SCOPE` | 403 | The API key lacks the scope this operation needs. | Use a key that holds the scope the message names. | No |
| `INSUFFICIENT_WORKSPACE_PERMISSION` | 403 | The caller's workspace role lacks the permission this read needs, such as View settlements for the maker projection or attribution for a per-member summary. | Ask a workspace admin for the permission the message names, or read a projection your role allows. | No |
| `INTEGRATION_APP_FORBIDDEN` | 403 | The integration app is not allowed to use this quote or order. | Use the integration app the quote was requested with. | No |
| `INTEGRATION_APP_MISMATCH` | 403 | The request's integration app differs from the quote's. | Use the integration app the quote was requested with. | No |
| `INTEGRATION_APP_UNAVAILABLE` | 503 | The integration app binding could not be read. | Retry the same request shortly, with backoff. | Yes |
| `INTEGRITY_FAILED` | 400 | The quote's integrity check failed: it was changed after it was issued. | Send the quote exactly as returned, or request a new one. | No |
| `INTERNAL_ERROR` | 500 | Something went wrong on TetraFi's side. | Contact TetraFi support with the requestId; do not retry in a loop. | No |
| `INVALID_AMOUNT` | 400 | An amount is not a positive exact decimal within the asset's precision. | Correct the request body as the message says, then send it again. | No |
| `INVALID_API_KEY_ID` | 400 | The apiKeyId filter is empty or carries surrounding whitespace. | Send the API key id exactly, or leave the filter out. | No |
| `INVALID_CATEGORY` | 400 | The category filter is not one of direct, sub\_workspace or affiliated. | Send a listed category, or leave the filter out. | No |
| `INVALID_CHANNEL` | 400 | The channel filter is not one of ui, api, whitelabel or embedded. | Send a listed channel, or leave the filter out. | No |
| `INVALID_CURSOR` | 400 | The cursor is not one this API issued. | Start the listing again without a cursor. | No |
| `INVALID_FUNDER` | 400 | The funder is not a 20-byte 0x-hex address. | Correct the request body as the message says, then send it again. | No |
| `INVALID_METADATA` | 400 | The request's metadata is not valid. | Correct the request body as the message says, then send it again. | No |
| `INVALID_REQUEST` | 400 | The request could not be read or has the wrong shape; details.field names the field when one is at fault. | Correct the request as the message and details say, then send it again. | No |
| `INVALID_SORT_BY` | 400 | The sortBy value is not createdAt or amountUsd. | Send a listed sortBy, or leave it out. | No |
| `INVALID_SORT_ORDER` | 400 | The sortOrder value is not asc or desc. | Send asc or desc, or leave it out. | No |
| `INVALID_SOURCE_WORKSPACE_ID` | 400 | The sourceWorkspaceId filter is not a workspace id. | Send a workspace UUID, or leave the filter out. | No |
| `INVALID_TRADE_PERIOD` | 400 | The from and to filters do not form a valid period. | Send a from that is not after to, at most 366 days apart. | No |
| `INVALID_WORKSPACE_ID` | 400 | The workspace id is not a valid workspace id. | Correct the request body as the message says, then send it again. | No |
| `IP_NOT_ALLOWED` | 403 | The API key is restricted to an IP allowlist that does not include this caller. | Call from an allowed IP, or update the key's allowlist. | No |
| `JWT_REQUIRED` | 403 | This action needs a signed-in person, not an API key. | Have a member perform it in a signed-in session. | No |
| `KEY_ACCESS_CHANGED` | 403 | The API key's access changed since the request was admitted. | Retry the request so it is admitted under the key's current access. | No |
| `KEY_AUTHORITY_REQUIRED` | 403 | The request needs a current workspace key with the required permission. | Use a current key that holds the permission. | No |
| `KEY_AUTHORITY_UNAVAILABLE` | 503 | The API key's current authority could not be read. | Retry the same request shortly, with backoff. | Yes |
| `KEY_IP_EVIDENCE_EXPIRED` | 503 | The key's verified IP evidence has expired; this read does not renew it. | Verify the account's key to renew its evidence, then read again. | Yes |
| `KYC_EXPIRED` | 403 | The identity or company verification this order is checked against has expired; nothing was admitted or sent. | Renew the verification the message names, then place the order again. | No |
| `KYC_NOT_VERIFIED` | 403 | The identity or company verification this order is checked against is not complete; nothing was admitted or sent. | Complete the verification the message names, then place the order again. | No |
| `LEGACY_CEX_LANE_RETIRED` | 409 | This liquidity provider's old connection path is retired. | Connect the provider as a venue account, then request new quotes. | No |
| `LP_CREDIT_EXHAUSTED` | 422 | The liquidity provider has no available credit for this order. | Lower the amount, or choose another quote. | No |
| `LP_DEFERRED_SETTLEMENT_UNAVAILABLE` | 403 | An LP workspace's desk trading settles on chain; deferred (credit) settlement is not available to it, so nothing was placed. | Choose a quote that settles on chain. | No |
| `LP_ENTITY_RETIRED` | 409 | The account belongs to a retired LP identity and cannot provide funding instructions. | Reconnect the account using the current LP identity. | No |
| `LP_ORDER_REJECTED` | 422 | The liquidity provider rejected the order's terms. | Review the order terms, or choose another quote. | No |
| `LP_PREFUNDED_BALANCE_REQUIRED` | 422 | This liquidity provider needs a prefunded balance before it can quote. | Deposit funds with the provider, then request quotes again. | No |
| `LP_REQUIREMENT_FACT_UNREADABLE` | 409 | The liquidity provider enforces a serving requirement on a fact recorded for this workspace that could not be read (for example a placeholder country); nothing was sent. | Check the fact in the workspace's company profile and correct it, or contact TetraFi support. | No |
| `LP_REQUIREMENT_INFORMATION_NEEDED` | 409 | The liquidity provider enforces a serving requirement on information this workspace has not recorded; nothing was sent. details.items names the onboarding items that supply it, and lpId the provider. | Record the named items in the workspace's company profile, then request a new quote. | No |
| `LP_WORKSPACE_LINK_MISSING` | 503 | This LP workspace has no recorded LP link, so its trades cannot be read. | Contact TetraFi support with the requestId; do not retry in a loop. | No |
| `MAX_WEBHOOKS_REACHED` | 400 | The workspace already has the maximum number of webhook endpoints. | Delete an endpoint you no longer use, then register again. | No |
| `METADATA_INVALID` | 400 | The order's metadata must be a JSON object. | Correct the request body as the message says, then send it again. | No |
| `METHOD_NOT_ALLOWED` | 405 | This HTTP method is not allowed on this path. | Use the method the API reference lists for this path. | No |
| `MFA_ENROLMENT_REQUIRED` | 403 | The workspace requires a second factor for money actions, and the member has none enrolled. | Enrol an authenticator for the member, then retry. | No |
| `MFA_REQUIRED` | 403 | This action needs a session that completed its second factor. | Complete the second factor, then retry. | No |
| `MFA_STALE` | 403 | Trading needs a second factor confirmed within the last 12 hours; nothing was placed. | Confirm the second factor again, then retry. | No |
| `MIN_RECEIVE_INVALID` | 400 | The minimum receive is not a positive amount. | Correct the request body as the message says, then send it again. | No |
| `MIN_RECEIVE_NOT_ACCEPTED` | 400 | This quote executes at the price shown, so it takes no minimum receive. | Remove minReceive from the order. | No |
| `MIN_RECEIVE_REQUIRED` | 400 | This venue needs the least you accept to receive. | Set minReceive on the order. | No |
| `MISSING_WORKSPACE` | 400 | A workspace is required for this request. | Send the request with a workspace-bound credential or workspace id. | No |
| `NOT_FOUND` | 404 | Nothing exists at this path, or it is not visible to the caller. | Check the path and id. | No |
| `NO_ELIGIBLE_SOLVERS` | 400 | No venue is eligible for this request. | Change the pair, amount or filters, or connect a venue that serves it. | No |
| `OBSERVATION_AUTHORITY_REQUIRED` | 403 | The caller lacks current authority to read this. | Use a credential with read access to this resource. | No |
| `OBSERVATION_AUTHORITY_UNAVAILABLE` | 503 | The caller's current read authority could not be checked. | Retry the same request shortly, with backoff. | Yes |
| `ONCHAIN_WALLET_NOT_USABLE` | 403 | This quote is indicative because the API key cannot use the organisation wallet. | Grant the key an organisation wallet before ordering, then request fresh quotes. | No |
| `OPERATION_NOT_SUPPORTED` | 400 | This order does not support that operation. | Use an operation the order's type supports. | No |
| `ORDER_ADMISSION_UNAVAILABLE` | 503 | Whether this order is already registered could not be confirmed. | Retry with the same request shortly; it will not create a second order. | Yes |
| `ORDER_CANCELLED` | 409 | This order was cancelled before dispatch; nothing was placed. | Read the order; request a new quote to trade again. | No |
| `ORDER_EXPIRED` | 400 | The order's signed payload has expired. | Request a new quote, then place the order on it. | No |
| `ORDER_HELD_FOR_REVIEW` | 403 | The order is held for compliance review. | Wait for the review outcome; do not place it again. | No |
| `ORDER_ID_CONFLICT` | 409 | This order id is already registered for a different request. | Read the existing order, or request a new quote. | No |
| `ORDER_IN_PROGRESS` | 409 | This order is still being placed. | Wait for the Retry-After period, then read the order. | Yes |
| `ORDER_NOT_CANCELLABLE` | 409 | This order already dispatched or its funding or delivery progressed. | Read the current order status; cancellation changed nothing. | No |
| `ORDER_NOT_FOUND` | 404 | No order with this id is visible to the caller. | Check the order id and the workspace. | No |
| `ORDER_RECORD_PENDING_RECOVERY` | 503 | The source transaction ran, but the order could not be recorded yet; the quote claim is kept. | Register the same source transaction again to recover the order; do not sign or send another trade. | No |
| `ORDER_REFUSED` | 409 | This order was refused by a pre-trade check before anything was sent; a refused order is final. | Read the order for the reason, clear it, then request a new quote and place a new order. | No |
| `ORDER_SIGNING_AUTHORIZATION_CONFLICT` | 400 | A retained authorization cannot be combined with a new owner proof. | Send either the retained authorization or a new proof, not both. | No |
| `ORDER_SIGNING_CONTEXT_REQUIRED` | 400 | The order's signing needs a workspace and signer context. | Send the signer context the preparation asked for. | No |
| `ORDER_SIGNING_SOURCE_CONFLICT` | 400 | The order names conflicting signing sources. | Name one signing source. | No |
| `ORDER_SIGNING_WALLET_MISMATCH` | 409 | The signing wallet is not the wallet the order was prepared for. | Sign with the prepared wallet, or prepare the order again. | No |
| `ORDER_SIZE_EXCEEDS_LP_LIMIT` | 422 | The amount is above the liquidity provider's limit. | Lower the amount. | No |
| `ORDER_TYPE_UNSUPPORTED` | 400 | This order type cannot be signed this way. | Use a quote whose order type supports the chosen signing. | No |
| `OWNER_AUTHORIZATION_NOT_ACCEPTED` | 400 | This quote is paid from a wallet that signs itself, so it takes a signature, not an owner approval. | Send the wallet's signature instead. | No |
| `PAY_WALLET_SHORT` | 422 | The paying wallet holds less than the trade needs; details names the shortfall. | Top up the wallet or choose another one, then request a new quote. | No |
| `PAY_WALLET_UNAVAILABLE` | 409 | The paying wallet the quote held was removed. | Request a new quote, then place the order on it. | No |
| `PERIOD_CAPACITY_EXCEEDED` | 409 | The trade would exceed the workspace's approved capacity for this period; nothing was sent. | Lower the amount, or wait for the next period. | No |
| `PERMIT_MISMATCH` | 400 | funderPermit2 does not match the prepared permit. | Sign the permit exactly as prepared. | No |
| `PERSONAL_TARGET_NOT_ALLOWED` | 409 | This credential named a member's personal account in source.tradingWallets; only that member's own session trades from it. No venue was asked. | Name an organisation wallet the credential is granted. | No |
| `PILOT_TRADE_CAP_EXCEEDED` | 409 | The trade is above this venue's per-trade limit during its pilot; nothing was sent. | Lower the amount. | No |
| `PLATFORM_POLICY_UNAVAILABLE` | 503 | The platform compliance policy could not be confirmed current, so the order was not admitted. | Retry the same request shortly, with backoff. | Yes |
| `PREFLIGHT_NOT_APPLICABLE` | 409 | This quote trades on a venue account and needs no preflight. | Place the order directly. | No |
| `PRICES_ELIGIBILITY_UNAVAILABLE` | 503 | Which venues may price for this caller could not be read. | Retry the same request shortly, with backoff. | Yes |
| `PRICES_ELIGIBILITY_WARMING` | 503 | Price eligibility is still loading. | Retry after the Retry-After period (about one second). | Yes |
| `PRICES_IDENTITY_UNAVAILABLE` | 503 | The current market identities could not be read. | Retry the same request shortly, with backoff. | Yes |
| `PRICES_POLICIES_UNAVAILABLE` | 503 | The workspace's pricing policies could not be read. | Retry the same request shortly, with backoff. | Yes |
| `PRICES_RATE_LIMIT` | 429 | Too many price reads for this caller. | Wait for the Retry-After period, then retry. | Yes |
| `PRICES_SERIALIZATION_FAILED` | 500 | The prices reply could not be written. | Contact TetraFi support with the requestId; do not retry in a loop. | No |
| `PRICES_SNAPSHOT_UNAVAILABLE` | Stream event | Sent on the price stream when the current price inputs could not be verified; the stream ends. | Open a new stream subscription shortly. | Yes |
| `PRICES_STREAM_LIMIT` | 429 | The caller already holds the maximum number of price streams. | Close a stream, then subscribe again. | Yes |
| `PRICES_WORKSPACE_TYPE` | 403 | This workspace type cannot read prices. | Use a Company, Broker or Direct-user workspace, or finish taker onboarding. | No |
| `PRICE_PROTECTION_CHANGED` | 409 | Changing price protection needs a new price; nothing was sent. | Request the price again with the new protection. | No |
| `PRODUCT_UNAVAILABLE` | 422 | The venue is not offering this product right now. | Choose another pair or venue. | No |
| `QUOTE_ALREADY_ORDERED` | 409 | This quote was already used for an order. | Read the existing order; do not place it again. | No |
| `QUOTE_BELOW_EXECUTION_COST` | 422 | The amount does not cover the estimated execution cost. | Use a larger amount. | No |
| `QUOTE_BOUND_BREACH` | 409 | The quote is outside the workspace's approved price bounds; nothing was sent. | Request a new quote, then place the order on it. | No |
| `QUOTE_BOUND_EVIDENCE_UNAVAILABLE` | 409 | The evidence for the workspace's price bounds could not be read; nothing was sent. | Request a new quote, then place the order on it. | No |
| `QUOTE_CANNOT_BE_REFRESHED` | 409 | The quote was recorded before it could be refreshed for a client. | Request quotes again. | No |
| `QUOTE_CATALOGUE_UNAVAILABLE` | 503 | The asset catalogue is not loaded just now. | Retry the same request shortly, with backoff. | Yes |
| `QUOTE_CLAIM_UNAVAILABLE` | 503 | The quote's claim could not be recorded. | Retry the same request shortly, with backoff. | Yes |
| `QUOTE_EXPIRED` | 410 | The quote has expired. | Request a new quote, then place the order on it. | No |
| `QUOTE_ID_INVALID` | 400 | The quote id cannot be used. | Send the quoteId exactly as POST /quotes returned it. | No |
| `QUOTE_ID_UNAVAILABLE` | 503 | A quote request id could not be issued. | Retry the same request shortly, with backoff. | Yes |
| `QUOTE_INTEGRITY_INVALID` | 400 | The order needs the original authenticated quote. | Send the quote exactly as returned. | No |
| `QUOTE_NOT_EXECUTABLE` | 409 | This price is for comparison only. | Request an executable quote first. | No |
| `QUOTE_NOT_FOUND` | 404 | No quote with this id is available to the caller. | Check the quoteId, or request a new quote. | No |
| `QUOTE_NOT_HELD` | 409 | The quote is no longer held; nothing was sent. | Request a new quote, then place the order on it. | No |
| `QUOTE_NOT_READY` | 503 | The quote is still being recorded. | Retry after about one second. | Yes |
| `QUOTE_ORDER_UNAVAILABLE` | 503 | The quote's order could not be read. | Retry the read shortly; do not place another order until it succeeds. | Yes |
| `QUOTE_OUTSIDE_APPROVED_BOUNDS` | 409 | The quote is outside the approved bounds; nothing was sent. | Request a new quote, then place the order on it. | No |
| `QUOTE_PRICE_MOVED` | 409 | The price moved outside the order's protection. | Request a new quote, or review the repricing offer if the response provides one. | No |
| `QUOTE_RATE_LIMITED` | 429 | Venue-hitting quote requests are limited to one every 3 seconds per caller. | Wait for the Retry-After period, then request again. | Yes |
| `QUOTE_REQUEST_NOT_FOUND` | 404 | No quote request with this id is visible to the caller. | Check the quoteRequestId. | No |
| `QUOTE_REQUEST_NOT_READY` | 503 | The quote request was issued moments ago and is still being recorded. | Retry after about one second. | Yes |
| `QUOTE_REQUEST_UNAVAILABLE` | 503 | The quote request could not be read. | Retry the same request shortly, with backoff. | Yes |
| `QUOTE_STORE_UNAVAILABLE` | 503 | Held quotes cannot be read right now. | Retry the same request shortly, with backoff. | Yes |
| `QUOTE_VALID_UNTIL_REQUIRED` | 400 | The quote carries no validity deadline, so it cannot be submitted. | Request a new quote, then place the order on it. | No |
| `QUOTE_WALLET_NOT_BOUND` | 409 | The quote was priced before a paying wallet was chosen (its tradingSource is null and its next is requote); nothing was sent. | Choose the wallet to pay from, requote, then order the new quote. | No |
| `RATE_LIMITED` | 429 | Too many requests from this caller. | Wait for the Retry-After period, then retry. | Yes |
| `RECORDS_OUT_OF_SCOPE` | 403 | The order belongs to another member, and the caller cannot read other members' orders. | Read your own orders, or use a credential with compliance view permission. | No |
| `REFERENCE_PRICE_UNAVAILABLE` | 409 | A reference price for the bounds check could not be read; nothing was sent. | Request a new quote shortly. | No |
| `RELAY_CONTEXT_UNRESOLVED` | 409 | The order's compliance context could not be resolved; nothing was relayed. | Contact TetraFi support with the requestId; do not retry in a loop. | No |
| `RELAY_FUNDER_UNRESOLVED` | 409 | The order's funding source could not be resolved; nothing was relayed. | Contact TetraFi support with the requestId; do not retry in a loop. | No |
| `RELAY_RECHECK_UNAVAILABLE` | 503 | The pre-send re-check could not be recorded; nothing was relayed. | Retry the same request shortly, with backoff. | Yes |
| `RELAY_SUBJECT_UNRESOLVED` | 409 | The order's compliance subject could not be resolved; nothing was relayed. | Contact TetraFi support with the requestId; do not retry in a loop. | No |
| `RELEASE_GRANT_UNAVAILABLE` | 503 | The approval to release this trade could not be read. | Retry the same request shortly, with backoff. | Yes |
| `RELEASE_WINDOW_LAPSED` | 409 | The approval window for releasing this trade has passed; nothing was sent. | Request a new quote, then place the order on it. | No |
| `REPRICING_OFFER_UNAVAILABLE` | 409 | There is no repricing offer to accept. | Prepare the continuation again without acceptRepricing. | No |
| `REQUEST_BODY_TOO_LARGE` | 413 | The request body is larger than allowed. | Send a smaller body. | No |
| `REQUEST_TIMEOUT` | 408 | The request timed out on the server. | Retry the same request shortly, with backoff. | Yes |
| `REQUEST_UNPROCESSABLE` | 422 | The request body has the wrong shape for this operation. | Correct the request body as the message says, then send it again. | No |
| `REQUOTE_FIELDS_CONFLICT` | 400 | A requote body carries fields that cannot go with requote; details.conflicts lists them. | Send requote alone, or send a fresh quote request. | No |
| `REQUOTE_NEEDS_WALLET` | 409 | The venue quotes once a wallet is chosen. | Bind a wallet, then requote. | No |
| `REQUOTE_REFUSED` | 409 | The venue would not requote; details.reason says why. | Act on details.reason, or request fresh quotes. | No |
| `REQUOTE_REQUIRED` | 409 | The firm order's handoff could not be read, so it needs a new quote. | Requote, then sign the replacement. | No |
| `REQUOTE_TIMED_OUT` | 504 | The venue did not answer the requote in time; the original quote still holds. | Requote again, or use the original quote before it expires. | Yes |
| `REQUOTE_WINDOW_CLOSED` | 410 | The quote is past its requote window (retainUntil), so it can no longer be refreshed or ordered. | Search again: POST /quotes with a pair body. | No |
| `RESOURCE_CONFLICT` | 409 | The request conflicts with the resource's current state. | Read the current resource before trying again. | No |
| `RESOURCE_GONE` | 410 | The resource is no longer available. | Request a new resource. | No |
| `RESPONSE_BUILD_FAILED` | 500 | The answer could not be assembled. | Contact TetraFi support with the requestId; do not retry in a loop. | No |
| `RFQ_ADMISSION_UNAVAILABLE` | 503 | The quote's admission state could not be read. | Retry the same request shortly, with backoff. | Yes |
| `RFQ_EXECUTION_UNAVAILABLE` | 409 | The route's source setup is not available. | Choose another quote. | No |
| `RFQ_ORIGIN_RECOVERY_RECEIVER_MISMATCH` | 409 | The recovery receiver must be the wallet that signed the funding. | Use the funding signer as the receiver. | No |
| `RFQ_REFIRM_CAP_EXCEEDED` | 409 | The order was re-firmed as many times as the venue allows. | Request a new quote for a new order. | No |
| `RFQ_REFIRM_NOT_YET` | 409 | The order's current firm quote is still live, so it cannot be re-firmed yet. | Retry after the current firm quote has lapsed. | Yes |
| `RFQ_WALLET_SOLVER_INDEXED_ORIGIN_UNREVIEWED` | 409 | This funding path for the route has not been reviewed for use. | Choose another quote. | No |
| `RFQ_WALLET_SOLVER_NON_RFQ_TAIL_UNREVIEWED` | 409 | This funding path for the route has not been reviewed for use. | Choose another quote. | No |
| `ROUTE_AUTHORITY_UNAVAILABLE` | 409 | The route's execution authority could not be confirmed. | Choose another quote. | No |
| `ROUTE_NOT_WAITING` | 409 | The order is not waiting for the taker: it is settled, still running a step, or has no continuation, so there is nothing to prepare, sign or stop. | Read the order; act only when its nextAction asks for the taker. | No |
| `ROUTE_SOURCE_EVIDENCE_INVALID` | 400 | The source transaction hash is invalid. | Send the source transaction hash exactly. | No |
| `ROUTE_SOURCE_PLAN_UNAVAILABLE` | 409 | The original source plan could not be verified; nothing was sent. | Request a new quote, then place the order on it. | No |
| `ROUTE_TRADE_INTENT_NOT_APPLICABLE` | 400 | This continuation takes funderSignature and funderPermit2, not a route trade intent. | Send funderSignature and funderPermit2 instead. | No |
| `ROUTE_TRADE_INTENT_REQUIRED` | 400 | This continuation needs routeTradeIntent and routeTradeIntentSignature. | Include both fields. | No |
| `ROUTE_TRADE_INTENT_TOO_LARGE` | 400 | routeTradeIntent is larger than allowed. | Correct the request body as the message says, then send it again. | No |
| `ROUTING_OPTIONS_FORBIDDEN` | 403 | The request used an option reserved for TetraFi operators. | Remove the reserved option and retry. | No |
| `SAME_ASSET_NEEDS_CHAIN` | 400 | Paying and receiving the same asset needs a chain pinned on each side. | Pin the pay and receive chains. | No |
| `SCHEMA_INVALID` | 400 | The order's signed payload does not match its schema. | Request a new quote, then place the order on it. | No |
| `SCREENING_UNAVAILABLE` | 503 | The screening provider is unavailable. | Retry the same request shortly, with backoff. | Yes |
| `SELF_DEALING_CHECK_UNAVAILABLE` | 503 | Whether the quote's provider is the workspace's own liquidity could not be read, so the self-dealing check could not run; nothing was placed. | Retry the same request shortly, with backoff. | Yes |
| `SELF_DEALING_REFUSED` | 409 | The quote comes from the workspace's own liquidity (a solver of its own LP); a workspace cannot trade with itself, so nothing was placed. | Choose a quote from another provider. | No |
| `SERIALIZATION_ERROR` | 500 | The settlement listing could not be encoded. | Contact TetraFi support with the requestId; do not retry in a loop. | No |
| `SERVER_CLOCK_UNAVAILABLE` | 503 | The server clock could not be read; nothing was admitted or sent. | Retry the same request shortly, with backoff. | Yes |
| `SERVICE_ACCOUNT_AUTHORITY_UNAVAILABLE` | 503 | The service account's own trading grant or signing key could not be read; nothing was placed. | Retry the same request shortly, with backoff. | Yes |
| `SERVICE_ACCOUNT_CANNOT_REVIEW` | 403 | A service account cannot read or decide another principal's venue trade review; only human members review. | Review the trade as a human member of the workspace. | No |
| `SERVICE_ACCOUNT_EXPIRED` | 403 | The service account has expired. | Ask a workspace admin to renew it. | No |
| `SERVICE_ACCOUNT_INACTIVE` | 403 | The service account is not active. | Ask a workspace admin to activate it. | No |
| `SERVICE_ACCOUNT_INVALID` | 403 | The service account id is invalid. | Check the key's service account. | No |
| `SERVICE_ACCOUNT_NOT_FOUND` | 403 | The service account was not found in this workspace. | Check the key's workspace. | No |
| `SERVICE_ACCOUNT_PLACE_ORDER_REQUIRED` | 403 | The service account's own role does not grant Place orders, so its venue trade was not placed. | Give the service account a role with Place orders, then confirm a new quote. | No |
| `SERVICE_ACCOUNT_SPONSOR_MISSING` | 403 | The service account's sponsor is no longer a member of the workspace. | Ask a workspace admin to assign a new sponsor. | No |
| `SERVICE_ACCOUNT_SPONSOR_NOT_CURRENT` | 409 | The service account's sponsor, its accountable human, is no longer a current, unsuspended member of the workspace, so its key's organisation-wallet trades stop, including later steps of a trade already placed. | Give the service account a current member as sponsor, or trade through another account. | No |
| `SERVICE_ACCOUNT_SUSPENDED` | 403 | The service account is suspended. | Ask a workspace admin to lift the suspension. | No |
| `SERVICE_ACCOUNT_UNASSIGNED` | 403 | The service account has no role. | Ask a workspace admin to assign a role. | No |
| `SERVICE_ACCOUNT_VENUE_KEY_NOT_CURRENT` | 403 | The service account, its sponsor or the signing key that prepared the venue trade is no longer current for venue trading; nothing was placed. | Use the current service account's venue-trading key, with an active sponsor, for both the quote and the order. | No |
| `SERVICE_ACCOUNT_WORKSPACE_MISSING` | 403 | The service account key has no workspace binding. | Create a new key bound to the workspace. | No |
| `SERVICE_UNAVAILABLE` | 503 | The service is unavailable. Fallback code of a 503 refusal that names no code. | Retry the same request shortly, with backoff. | Yes |
| `SESSION_AUTHORITY_UNAVAILABLE` | 503 | The session's current authority could not be read. | Retry the same request shortly, with backoff. | Yes |
| `SESSION_STORE_UNAVAILABLE` | 503 | Session state is unavailable for a moment. | Retry the same request shortly, with backoff. | Yes |
| `SETTLEMENT_ACCOUNT_NOT_FOUND` | 404 | The venue account the delayed-settlement quote names no longer exists in this workspace. | Request a new quote, then place the order on it. | No |
| `SETTLEMENT_CLOCK_UNAVAILABLE` | 503 | The server clock that assigns the settlement window could not be read, so nothing was sent. | Retry the same request shortly, with backoff. | Yes |
| `SETTLEMENT_CORRIDOR_UNAVAILABLE` | 503 | Settlement capabilities for the chain pair could not be read. | Retry the same request shortly, with backoff. | Yes |
| `SETTLEMENT_DEADLINE_UNCONFIRMED` | 422 | The venue has not confirmed the settlement deadline of the window this trade would settle in, so nothing was sent. | Wait for the venue to confirm the deadline, then request a new quote. | No |
| `SETTLEMENT_LP_CORRECTION_RECEIPT_UNAVAILABLE` | 503 | An LP agreement correction or its immutable receipt could not be verified; no position was inferred. | Restore the named agreement receipt and journal evidence, then retry the read. | Yes |
| `SETTLEMENT_OWNER_MISMATCH` | 403 | The executing wallet is not the verified owner wallet of the order. | Use the order owner's verified wallet. | No |
| `SETTLEMENT_PREDECESSOR_CHANGED_AFTER_SNAPSHOT` | 422 | An earlier settlement window was paid, delivered or changed after this snapshot; no successor obligation was created. | Continue in a newer cumulative settlement window whose snapshot includes the earlier payment, delivery or change; do not retry the unchanged older snapshot. | No |
| `SETTLEMENT_SCHEDULE_INVALID` | 422 | The venue account has no confirmed settlement schedule that can produce a window, so nothing was sent. | Confirm the account's settlement schedule, then request a new quote. | No |
| `SETTLEMENT_WALLET_REQUIRED` | 400 | This route needs settlementWalletId. | Include settlementWalletId. | No |
| `SETTLEMENT_WALLET_UNVERIFIED` | 403 | settlementWalletId must be a verified owner wallet. | Verify the wallet, or choose a verified one. | No |
| `SETTLEMENT_WINDOW_ACCOUNT_MISMATCH` | 409 | The quote's settlement window belongs to another venue account than the one trading it, so nothing was sent. | Request a new quote, then place the order on it. | No |
| `SETTLEMENT_WINDOW_CHANGED` | 409 | The settlement window assigned at the send is not the one the order consented to, so nothing was sent. The body's currentWindow is the window assigned now. | Review currentWindow, then send the same quote again with settlementWindowId set to its windowId. | No |
| `SETTLEMENT_WINDOW_DEPOSIT_FIRST_UNSUPPORTED` | 422 | A credit trade settles in the account's settlement window, so it cannot trade deposit-first. | Trade from the account balance. | No |
| `SETTLEMENT_WINDOW_NOT_APPLICABLE` | 422 | settlementWindowId was sent on a quote that settles immediately. | Send the order without settlementWindowId. | No |
| `SETTLEMENT_WINDOW_NOT_CONSENTED` | 422 | This trade uses credit, so it settles in the account's settlement window, and the send named no consented window. | Place the order on the quote, which carries its settlement window. | No |
| `SETTLEMENT_WINDOW_NOT_QUOTED` | 422 | The delayed-settlement quote was held without its settlement window. | Request a new quote, then place the order on it. | No |
| `SETTLEMENT_WINDOW_TERMS_PENDING` | 422 | This trade uses credit, so it settles in the venue account's settlement window, and the venue has not confirmed when that window closes, so nothing was sent. | Record the venue's answer on the account's schedule request, then request a new quote. | No |
| `SETTLEMENT_WINDOW_UNAVAILABLE` | 503 | The settlement window could not be verified, so nothing was sent. | Retry the same request shortly, with backoff. | Yes |
| `SIGNATURE_FORMAT_INVALID` | 400 | The signature is not 65 bytes. | Send the 65-byte signature as hex. | No |
| `SIGNATURE_INVALID` | 400 | The wallet signature does not verify. | Sign the prepared order with its funding wallet again. | No |
| `SIGNATURE_NOT_ACCEPTED` | 400 | This quote trades on a venue account and takes no wallet signature. | Remove the signature. | No |
| `SIGNATURE_TOO_LONG` | 400 | The signature is longer than allowed. | Correct the request body as the message says, then send it again. | No |
| `SIGNED_KEY_NOT_EXCHANGEABLE` | 400 | The token endpoint (POST /api/v1/oauth/token) refused to exchange a key that requires request signing or holds venue trading: a bearer token would drop the per-request signature that key's authority rests on. It answers the RFC 6749 body, error unauthorized\_client, with this code's reference in error\_uri. | Keep using the key directly and sign each request with its HMAC secret, or exchange a service-account key without request signing or venue trading. | No |
| `SIGNED_OUTPUT_BOUND_UNATTACHABLE` | 409 | The signed minimum receive cannot be attached to its wallet action. | Request a new quote, then place the order on it. | No |
| `SIGNED_OUTPUT_BOUND_UNREADABLE` | 409 | The signed minimum receive cannot be read. | Request a new quote before signing. | No |
| `SIGNER_LACKS_RIGHT` | 409 | The wallet's signer lacks the right this trade needs; nothing was signed. | Grant the signer the right, or choose another wallet. | No |
| `SIGNER_UNAVAILABLE` | 409 | The wallet's signer is not available; nothing was signed. | Retry later, or choose another wallet. | No |
| `SOLANA_DOMAIN_MISMATCH` | 400 | The Solana order's domain does not match the signed message. | Request a new quote, then place the order on it. | No |
| `SOLANA_ORDER_DEADLINE_PASSED` | 422 | The Solana order's deadlines have passed. | Request a new quote, then place the order on it. | No |
| `SOLANA_ORDER_NOT_OPEN` | 422 | The Solana transaction did not open the expected escrow order. | Check the transaction, or request a new quote. | No |
| `SOLANA_ORDER_RECORD_DERIVATION_FAILED` | 500 | The Solana order record address could not be derived. | Contact TetraFi support with the requestId; do not retry in a loop. | No |
| `SOLANA_ORDER_RECORD_MISMATCH` | 422 | The Solana escrow order does not match the quoted order. | Request a new quote, then place the order on it. | No |
| `SOLANA_ORDER_SERIALIZATION_FAILED` | 500 | The Solana order could not be serialized. | Contact TetraFi support with the requestId; do not retry in a loop. | No |
| `SOLANA_ORIGIN_FUNDING_MISMATCH` | 422 | The Solana order was not opened by the order's own user. | Open the order from the order owner's wallet. | No |
| `SOLANA_ORIGIN_NOT_CONFIRMED` | 422 | The Solana origin transaction is not confirmed yet. | Wait for confirmation, then submit again. | Yes |
| `SOLANA_ORIGIN_ORDER_MISMATCH` | 400 | svmOriginSubmission.orderId does not match the order. | Correct the request body as the message says, then send it again. | No |
| `SOLANA_ORIGIN_SIGNATURE_MISMATCH` | 400 | The order signature must equal the Solana origin transaction signature. | Correct the request body as the message says, then send it again. | No |
| `SOLANA_ORIGIN_SUBMISSION_MALFORMED` | 400 | svmOriginSubmission is malformed. | Correct the request body as the message says, then send it again. | No |
| `SOLANA_ORIGIN_SUBMISSION_REQUIRED` | 400 | Solana orders need svmOriginSubmission for the confirmed escrow-open transaction. | Include svmOriginSubmission. | No |
| `SOLANA_ORIGIN_TRANSACTION_FAILED` | 422 | The Solana origin transaction failed. | Request a new quote, then place the order on it. | No |
| `SOLANA_ORIGIN_TRANSACTION_MISMATCH` | 400 | The Solana origin transaction was not signed by the funding wallet. | Submit the transaction the funding wallet signed. | No |
| `SOLANA_REGISTRY_DRIFT` | 422 | The quoted Solana escrow no longer matches the active deployment. | Request a new quote, then place the order on it. | No |
| `SOLANA_REGISTRY_NOT_READY` | 422 | The Solana deployment is not fully configured. | Choose another quote. | No |
| `SOLANA_RPC_UNAVAILABLE` | 422 | The Solana transaction cannot be verified because no Solana node is configured. | Choose another quote. | No |
| `SOLANA_SOURCE_AUTHORIZATION_INVALID` | 400 | The Solana source permit is invalid. | Sign the source permit again as prepared. | No |
| `SOLANA_SOURCE_EXECUTION_UNAVAILABLE` | 503 | Source execution is temporarily unavailable. | Retry the same request shortly, with backoff. | Yes |
| `SOLANA_SOURCE_LOOKUP_TABLE_INVALID` | 409 | The prepared source transaction's address lookup table cannot be used. | Request a new quote, then place the order on it. | No |
| `SOLANA_SOURCE_PERMIT_CORRUPT` | 409 | The retained source authorization could not be decoded. | Contact TetraFi support with the requestId; do not retry in a loop. | No |
| `SOLANA_SOURCE_PERMIT_EXPIRED` | 410 | The source authorization expired. | Request a new quote, then place the order on it. | No |
| `SOLANA_SOURCE_PERMIT_NOT_FOUND` | 404 | The prepared source authorization was not found. | Request a new quote, then place the order on it. | No |
| `SOLANA_SOURCE_PERMIT_OWNER_MISMATCH` | 403 | The source authorization belongs to another wallet. | Use the funding wallet's authorization. | No |
| `SOLANA_SOURCE_PERMIT_REQUIRED` | 400 | This order requires the prepared source authorization. | Include the source authorization from preparation. | No |
| `SOLANA_SOURCE_PLAN_INVALID` | 409 | The source transaction's plan is no longer usable. | Request a new quote, then place the order on it. | No |
| `SOLANA_SOURCE_PROVIDER_EXECUTION_FAILED` | 409 | The wallet provider could not execute the source transaction. | Read the order before trying again. | No |
| `SOLANA_SOURCE_QUOTE_INVALID` | 400 | The source quote does not match its prepared authorization. | Request a new quote, then place the order on it. | No |
| `SOLANA_SOURCE_QUOTE_MISMATCH` | 409 | The Solana source authorization no longer matches its quote and route. | Request a new quote, then place the order on it. | No |
| `SOLANA_SOURCE_REFERENCE_INVALID` | 400 | The source transaction reference is invalid. | Correct the request body as the message says, then send it again. | No |
| `SOLANA_SOURCE_REGISTRY_DRIFT` | 409 | The source transaction's active deployment changed. | Request a new quote, then place the order on it. | No |
| `SOLANA_SOURCE_ROLE_DRIFT` | 409 | The source transaction's required authority changed. | Request a new quote, then place the order on it. | No |
| `SOLANA_SOURCE_RPC_UNAVAILABLE` | 503 | The source transaction's network could not be read. | Retry the same request shortly, with backoff. | Yes |
| `SOLANA_SOURCE_SIGNATURE_CONFLICT` | 409 | Another signature is already retained for this authorization. | Follow the existing source transaction. | No |
| `SOLANA_SOURCE_SIGNATURE_INVALID` | 400 | The Solana source signature does not verify. | Sign the source permit again with the funding wallet. | No |
| `SOLANA_SOURCE_SIGNING_FAILED` | 409 | The wallet could not sign the source transaction. | Check the wallet's signing authority before trying again. | No |
| `SOLANA_SOURCE_SIMULATION_REJECTED` | 409 | The source transaction failed its pre-send simulation. | Request a new quote, then place the order on it. | No |
| `SOLANA_SOURCE_STATE_DRIFT` | 409 | The source transaction's prepared state changed. | Request a new quote, then place the order on it. | No |
| `SOLANA_SOURCE_STATE_UNAVAILABLE` | 409 | The source transaction's retained state could not be read. | Retry the same request shortly, with backoff. | Yes |
| `SOLANA_SOURCE_TRANSACTION_FAILED` | 409 | The source transaction failed. | Read the order before starting another trade. | No |
| `SOLANA_TRANSACTION_MALFORMED` | 400 | The Solana order payload is malformed. | Request a new quote, then place the order on it. | No |
| `SOLANA_WORKSPACE_ROUTER_MISMATCH` | 422 | The quoted Solana settlement contract is not the workspace's active one. | Request a new quote, then place the order on it. | No |
| `SOLANA_WORKSPACE_ROUTER_MISSING` | 422 | The Solana order needs an authenticated workspace with a settlement contract. | Send the request with a workspace credential, or choose another quote. | No |
| `SOURCE_LEG_RECOVERED` | 409 | The source transaction succeeded but its funds were returned to the payer instead of starting the route. | Request a new quote for a new order. | No |
| `SOURCE_NOT_OWNED` | 403 | A source names a wallet or account this caller cannot use: unknown, outside this workspace, or outside the key's grants. | Name a wallet or account from the answer's sourceOptions. | No |
| `SOURCE_RECOVERY_CLAIM_MISMATCH` | 409 | This source does not belong to the retained quote claim. | Register the source of this order's own claim. | No |
| `SOURCE_RECOVERY_QUOTE_INVALID` | 409 | The recovery quote does not match its held terms. | Use the recovery quote exactly as held. | No |
| `SOURCE_RECOVERY_UNAVAILABLE` | 503 | The retained recovery claim could not be read. | Retry shortly; do not send another trade. | Yes |
| `STEP_UP_ALREADY_USED` | 403 | This step-up proof was already used. | Complete a new step-up and retry with its proof. | No |
| `STEP_UP_EXPIRED` | 403 | The step-up proof has expired. | Complete a new step-up and retry with its proof. | No |
| `STEP_UP_REQUIRED` | 403 | This trade needs a fresh step-up confirmation; details.stepUpSubject names it. | Complete the step-up for that subject and retry with stepUpProof. | No |
| `STEP_UP_SUBJECT_MISMATCH` | 403 | The step-up proof was made for a different action. | Complete the step-up for the subject this refusal names. | No |
| `STEP_UP_UNAVAILABLE` | 503 | The step-up check could not be performed. | Retry the same request shortly, with backoff. | Yes |
| `STORAGE_ERROR` | 500 | A storage error occurred on TetraFi's side. | Contact TetraFi support with the requestId; do not retry in a loop. | No |
| `TAKER_ADMISSION_UNAVAILABLE` | 503 | The workspace's taker admission could not be read. | Retry the same request shortly, with backoff. | Yes |
| `TAKER_ONBOARDING_INCOMPLETE` | 403 | TetraFi has turned off desk trading for this LP workspace. | Contact TetraFi support to turn desk trading back on. | No |
| `TAKER_WORKSPACE_TYPE` | 403 | This workspace type cannot request taker prices or quotes. | Use a taker workspace, or finish taker onboarding. | No |
| `TARGET_NOT_ALLOWED_FOR_SLOT` | 400 | The bound wallet cannot be used for that slot. | Bind a wallet allowed for the slot the message names. | No |
| `TRADER_SIGNATURE_NOT_APPLICABLE` | 400 | Only certain continuations take a traderSignature. | Remove traderSignature. | No |
| `TRADER_SIGNATURE_REQUIRED` | 409 | The continuation needs the client's trader signature. | Sign traderTypedData and send it as traderSignature. | No |
| `TRADE_CONSUMED_READ_UNAVAILABLE` | 503 | Whether the trade was already used could not be read. | Retry the same request shortly, with backoff. | Yes |
| `TRADE_EXPORT_INCOMPLETE` | 503 | Some trades could not be read, so no export file was made; the JSON list still answers. | Retry the same request shortly, with backoff. | Yes |
| `TRADE_LEDGER_AUTHORIZATION_INVALID` | 409 | The signed trade authorization no longer matches the quote. | Refresh quotes and sign again. | No |
| `TRADE_LEDGER_AUTHORIZATION_REQUIRED` | 400 | This order needs tradeLedgerAuthorization. | Include the signed tradeLedgerAuthorization. | No |
| `TRADE_LEDGER_INSUFFICIENT_BALANCE` | 422 | The on-chain trading account does not hold enough for this order. | Deposit funds to the account, then place the order again. | No |
| `TRADE_LEDGER_INTENT_INVALID` | 400 | The order payload is not a valid trade intent. | Request a new quote, then place the order on it. | No |
| `TRADE_NOT_FOUND` | 404 | No trade with this id is visible in the workspace. | Check the trade id, and that it belongs to the workspace in the path. | No |
| `TRADE_PROJECTION_UNAVAILABLE` | 503 | The requested trade projection is not available on this stack. | Retry the same request shortly, with backoff. | Yes |
| `TRADING_SOURCE_NOT_LINKED` | 409 | The selected trading source is not linked to the venue account this quote would use. | Choose a linked trading source, or link it on the venue account, then request quotes again. | No |
| `TRANSPORT_PATHWAY_UNREACHABLE` | 422 | The settlement transport for this chain pair has no live path. | Choose a different chain pair or quote. | No |
| `TREASURY_DISABLED` | 503 | Trade preparation is not available on this server. | Choose a quote that does not trade on a venue account. | No |
| `TREASURY_FREEZE_UNAVAILABLE` | 503 | The workspace's freeze state could not be read. | Retry the same request shortly, with backoff. | Yes |
| `TREASURY_FROZEN` | 423 | The workspace is frozen, so money movements are refused. | Ask a workspace admin to lift the freeze. | No |
| `UNKNOWN_ASSET` | 400 | The asset is not in the catalogue; details.value names it. | Use an asset listed by GET /assets. | No |
| `UNKNOWN_CHAIN` | 400 | The chain is not known; details.value names it. | Use a chain listed by GET /assets. | No |
| `UNKNOWN_VENUE` | 400 | The venue is not known; details.value names it. | Use a venue id from a quote or GET /prices. | No |
| `UNSUPPORTED_CONTENT_TYPE` | 415 | The body is not sent as application/json. | Send the body with Content-Type: application/json. | No |
| `UPSTREAM_TIMEOUT` | 504 | An upstream service timed out. | Retry the same request shortly, with backoff. | Yes |
| `UPSTREAM_UNAVAILABLE` | 502 | An upstream service is unavailable. | Retry the same request shortly, with backoff. | Yes |
| `USABLE_SET_UNAVAILABLE` | 503 | The wallets this caller may use could not be read. | Retry the same request shortly, with backoff. | Yes |
| `USER_NOT_IN_UMBRELLA` | 404 | The userId filter names a user outside the caller's umbrella. | Filter by a user of a workspace under your umbrella. | No |
| `USER_RESOLUTION_FAILED` | 500 | The caller's user identity could not be resolved. | Contact TetraFi support with the requestId; do not retry in a loop. | No |
| `VALIDATION_ERROR` | 400 | The request failed validation. | Correct the request body as the message says, then send it again. | No |
| `VENUE_ACCOUNT_FUNDING_VENUE_DISABLED` | 409 | Only a disabled venue holds the account's balance key, so no deposit details were released. | Re-enable that venue in the account's Controls, then read again. | No |
| `VENUE_ACCOUNT_FUNDS_IN_WALLETS` | 409 | This wallet-based venue keeps funds in its linked wallets, not a venue account. | Read the linked trading wallets in Treasury instead. | No |
| `VENUE_ACCOUNT_HAS_NO_KEY` | 409 | The venue account has no current funding key. | Connect or rotate the account's key, then read again. | No |
| `VENUE_ACCOUNT_INSUFFICIENT_AVAILABLE_FUNDS` | 409 | The paying account or wallet holds too little that is not already held for other open orders; nothing was placed. | Fund the account, or wait for its open orders to finish, then request a fresh quote. | No |
| `VENUE_ACCOUNT_KEY_NOT_CONNECTED` | 409 | The venue account's funding key is not connected. | Reconnect and verify the account's key. | No |
| `VENUE_ACCOUNT_LEDGER_PENDING` | 409 | Not observed yet: the venue account has not finished setup, so its ledger has not been read. | A member with manage\_credentials follows the finishVenueAccountSetup fix on target.venueAccountId, then reads its ledger again. | No |
| `VENUE_ACCOUNT_NOT_CONFIGURED` | 409 | The venue account is not configured for this funding read. | Complete the account's setup and verification. | No |
| `VENUE_ACCOUNT_NOT_FOUND` | 404 | This workspace has no venue account with that id. | Use an account id from this workspace's venue accounts. | No |
| `VENUE_ACCOUNT_REVERIFY_REQUIRED` | 409 | No current key holds this venue account's balance. | Re-verify or rotate the account's key, then read its instructions again. | No |
| `VENUE_ACCOUNT_REVOKED` | 409 | This venue account is disconnected. | Reconnect the venue account before reading its funding instructions. | No |
| `VENUE_ACCOUNT_SERVICE_TIMEOUT` | 503 | The venue-account funding read timed out. | Retry the same request shortly, with backoff. | Yes |
| `VENUE_ACCOUNT_SERVICE_UNAVAILABLE` | 503 | The venue-account funding service is unavailable. | Retry the same request shortly, with backoff. | Yes |
| `VENUE_ACCOUNT_UNVERIFIED` | 409 | The venue account is not verified with the venue. | Verify the venue account, then request a new quote. | No |
| `VENUE_ACCOUNT_VENUE_UNKNOWN` | 409 | The account's venue is not recognised. | Reconnect the account to a supported venue. | No |
| `VENUE_ADAPTER_ERROR` | 502 | The liquidity provider is temporarily unavailable. | Retry the same request shortly, with backoff. | Yes |
| `VENUE_BALANCES_UNREADABLE` | 503 | The venue account's balance answer could not be built; no balances were released. | Retry the same request shortly, with backoff. | Yes |
| `VENUE_CANNOT_FILL` | 503 | The chosen liquidity provider cannot fill this trade right now. | Request new quotes, or choose another quote. | No |
| `VENUE_CLIENT_ERROR` | 400 | The liquidity provider refused the order request. | Request a new quote, or choose another venue. | No |
| `VENUE_CONNECTION_AUTHORITY_UNAVAILABLE` | 503 | Current authority could not be confirmed at the deposit disclosure boundary; no instructions were released. | Check that the caller still has wallet-view authority, then retry shortly. | Yes |
| `VENUE_CONNECTION_CHANGED` | 409 | The account's connection, key or controls changed during the read; no instructions were released. | Read the current account, then request its instructions again. | Yes |
| `VENUE_CONNECTION_INVALID` | 400 | The deposit selection or stored funding configuration cannot be used. | Correct the currency, asset, network or linked bank selection as the message says; re-verify the account if its configuration is invalid. | No |
| `VENUE_CONNECTION_NOT_FOUND` | 404 | The account's venue connection could not be found in this workspace. | Read the current venue account and use its current connection. | No |
| `VENUE_CONNECTION_STORAGE_UNAVAILABLE` | 503 | The venue account's current funding state could not be read or its disclosure audit could not be committed. | Retry the same request shortly, with backoff. | Yes |
| `VENUE_CONNECTION_WORKSPACE_TYPE` | 403 | This workspace type cannot read venue-account funding instructions. | Use a Company or Broker workspace, or an LP workspace admitted as a taker. | No |
| `VENUE_CREDENTIAL_ENVELOPE_INVALID` | 503 | The account's funding credential could not be verified or opened. | Rotate the account's key; contact support if the failure persists. | No |
| `VENUE_CREDENTIAL_KEY_UNAVAILABLE` | 503 | The service needed to open the account's funding credential is unavailable. | Retry the same request shortly, with backoff. | Yes |
| `VENUE_CREDIT_HOLD_NOT_RESERVED` | 409 | The credit held for this firm price is no longer reserved (used or released); nothing was sent. | Request a new quote, then place the order on it. | No |
| `VENUE_DATA_UNAVAILABLE` | 422 | The venues could not read their own balances or prices just now. | Retry the same request shortly, with backoff. | Yes |
| `VENUE_FIRM_QUOTE_BUDGET_EXHAUSTED` | 429 | The declared venue quote-rate pool is spent; no new provider ask was sent. | Wait for details.retryAfter or details.retryAfterMs, then deliberately retry; details.reason is tetrafi:declaredPool. | Yes |
| `VENUE_FIRM_QUOTE_COUNT_UNREADABLE` | 409 | The workspace's daily firm-quote count could not be read; the price remains blocked and no new ask is sent. | Try again to read the count before requesting a firm price. | Yes |
| `VENUE_FIRM_QUOTE_LIMITED` | 429 | This venue's firm-quote limit is reached. | Wait for the Retry-After period, then retry. | Yes |
| `VENUE_HELD_QUOTE_NOT_ADOPTABLE` | 409 | The held firm price no longer matches this order (its account, revisions, principal or bounds), so it cannot be adopted; nothing was sent. | Request a new quote, then place the order on it. | No |
| `VENUE_KEY_IP_RESTRICTION_REQUIRED` | 409 | The account's key does not have the required IP restriction. | Apply the required IP restriction at the venue, then verify the key. | No |
| `VENUE_NOT_AVAILABLE` | 409 | This venue is not available for the funding read. | Use an available venue account. | No |
| `VENUE_NOT_AVAILABLE_TO_CREDENTIAL` | 403 | This credential cannot ask this venue for a firm quote. | Use a credential with Request quotes and Place orders, or a member session. | No |
| `VENUE_OPERATION_MISMATCH` | 409 | The order does not match the venue operation it continues. | Read the operation, or request a new quote. | No |
| `VENUE_ORDER_PREPARATION_REFUSED` | 409 | The venue order could not be built from this firm price; nothing was sent. | Request a new quote, then place the order on it. | No |
| `VENUE_POLICY_UNAVAILABLE` | 503 | How this venue executes cannot be read right now; nothing was sent. | Retry the same request shortly, with backoff. | Yes |
| `VENUE_QUOTE_NOT_PRICED` | 409 | The venue returned no price for the firm ask; nothing was sent. | Request the price again. | No |
| `VENUE_QUOTE_OUTSIDE_BOUNDS` | 409 | The venue's firm price is below the order's minimum receive; nothing was sent. | Request a new price, or lower the minimum receive. | No |
| `VENUE_QUOTE_RATE_LIMITED` | 429 | The named venue is limiting quote requests; the request remains counted and nothing was placed. | Wait for Retry-After (also details.retryAfter), then deliberately request again; details.reason names the retry timing source. | Yes |
| `VENUE_QUOTE_SEND_WINDOW_CLOSED` | 409 | The order arrived before the quote's expiresAt, but the venue's firm price reached its send deadline before it could be sent; nothing was sent. | Request a new quote, then place the order on it. | No |
| `VENUE_READ_AUTHORITY_REFUSED` | 403 | The caller's authority to read the workspace's venue accounts ended during the read; nothing was released. reason authority\_ended: the credential or session was revoked or expired, no longer carries treasury\_read, or no longer meets the workspace's MFA requirement. reason permission\_withdrawn: its principal lost ViewWallets, its workspace membership or taker admission. | Use a current credential with treasury\_read whose principal holds ViewWallets, then read again. | No |
| `VENUE_REGISTRY_UNAVAILABLE` | 503 | The venue registry needed for the funding read is unavailable. | Retry the same request shortly, with backoff. | Yes |
| `VENUE_SEND_DEADLINE_UNDECLARED` | 409 | This venue declares no send deadline for its firm prices, so the order cannot be bounded; nothing was sent. | Request a quote from another venue. | No |
| `VENUE_TRADE_INITIATOR_NOT_PERMITTED` | 403 | The venue account refused this initiator: it is neither a current workspace member nor an active human-operated service account, with a current sponsor, acting through an unrevoked signing key that has venue trading switched on and the workspace\_venue\_trade scope. Nothing was placed. | Use a current member, or a current human-operated service account's venue-trading key, and the same key for the quote and the order. | No |
| `VENUE_TRADE_KEY_CHANGED` | 403 | The API key's venue-trading settings changed since the request was admitted. | Retry so the request is admitted under the key's current settings. | No |
| `VENUE_TRADE_KEY_DISABLED` | 403 | The API key's venue-trading switch is off. | Turn on venue trading for the key. | No |
| `VENUE_TRADE_KEY_NOT_CURRENT` | 403 | The API key is revoked or expired, or is no longer current for this workspace. Nothing was placed. | Use a current venue-trading key, or create a new one. | No |
| `VENUE_TRADE_KEY_SIGNING_REQUIRED` | 409 | Request signing cannot be turned off on a key that can trade venues: venue trading accepts only signed requests. The key and its secret are unchanged. | Keep signing on, or use a key without venue trading for unsigned requests. | No |
| `VENUE_TRADE_KEY_UNAVAILABLE` | 503 | The API key's venue-trading settings could not be read. | Retry the same request shortly, with backoff. | Yes |
| `VENUE_TRADE_PAYOUT_DESTINATION_CHANGED` | 409 | The payout destination changed after the trade was prepared. | Prepare the trade again. | No |
| `VENUE_TRADE_PAYOUT_FEE_INVALID` | 422 | The payout fee is not valid for the venue's precision. | Request a new quote. | No |
| `VENUE_TRADE_RECONFIRMATION_REQUIRED` | 409 | This confirmation placed no order; the trade needs a fresh quote accepted. | Request a fresh quote and accept it. | No |
| `VENUE_TRADE_REVIEW_EXPIRED` | 409 | The trade's review expired; nothing was sent. | Prepare the trade again for a new review. | No |
| `VENUE_TRADE_REVIEW_PENDING` | 409 | The trade waits for a human approval on its venue trade review; nothing was sent. | Wait for a human member to approve the review, then confirm again. | No |
| `VENUE_TRADE_REVIEW_REJECTED` | 409 | The trade's review was rejected; nothing was sent. | Do not retry; prepare a different trade if needed. | No |
| `VENUE_TRADE_REVIEW_REQUIRED` | 409 | Current policy needs a human review the trade was not prepared with; nothing was sent. | Request a new quote so the trade is prepared for review. | No |
| `VENUE_TRADE_SCOPE_REQUIRED` | 403 | Venue-account trading needs an API key with the workspace\_venue\_trade scope. | Use a key with workspace\_venue\_trade, venue trading on and HMAC signing. | No |
| `VENUE_TRADE_SIGNATURE_REQUIRED` | 403 | Venue-account trading with an API key needs HMAC request signing. | Sign the request with X-Timestamp and X-Signature. | No |
| `VENUE_UNAVAILABLE` | 503 | The chosen liquidity provider is temporarily unavailable. | Retry shortly, or choose another quote. | Yes |
| `VENUE_WORKSPACE_ACCOUNT_REQUIRED` | 409 | Deposit instructions require the workspace's own venue account. | Use a workspace-owned venue account. | No |
| `WALLET_COMPLIANCE_REVOKED` | 403 | A wallet on this quote had its on-chain compliance revoked. | Use another wallet. | No |
| `WALLET_DEFAULTS_UNAVAILABLE` | 503 | The saved default wallets and accounts could not be read. | Retry the same request shortly, with backoff. | Yes |
| `WALLET_IDENTITY_CONFLICT` | 422 | The funding wallet is not ownership-verified for the order's owner. | Verify the wallet for the owner, or use a verified one. | No |
| `WALLET_LINKED_TO_DIFFERENT_ACCOUNT` | 403 | The signing wallet is linked to a different account. | Sign with a wallet linked to this account. | No |
| `WALLET_LINK_REQUIRED` | 403 | The signing wallet must be linked and verified first. | Link and verify the wallet, then place the order. | No |
| `WALLET_NOT_LINKED` | 422 | The funding wallet is not linked to the order's owner. | Link the wallet to the owner, or use a linked one. | No |
| `WALLET_NOT_ON_CHAIN` | 400 | The bound wallet or address is not an account on the chain it was bound to. | Bind a wallet registered on that chain. | No |
| `WALLET_SIGNATURE_REQUIRED` | 400 | The order is missing the wallet signature the quote requires. | Sign the quote's terms in the paying wallet and include the signature. | No |
| `WEBHOOK_CONFLICT` | 409 | The webhook endpoint's current state does not allow this action; the message names why, for example a paused endpoint. | Reactivate the endpoint or read its current state, then send the request again. | No |
| `WEBHOOK_DELIVERY_NOT_FOUND` | 404 | This webhook endpoint has no delivery with that id. | Use a delivery id from this endpoint's delivery log. | No |
| `WEBHOOK_EVENT_RETIRED` | 400 | An events entry names a retired webhook event; the message names its replacement. | Subscribe to the replacement event instead. | No |
| `WEBHOOK_EVENT_UNKNOWN` | 400 | An events entry is not a webhook event; details.acceptedKeys lists the events you can subscribe to. | Subscribe only to events listed in details.acceptedKeys. | No |
| `WEBHOOK_EXISTS` | 409 | This workspace already has a webhook endpoint for that URL. | Use the existing endpoint, or register a different URL. | No |
| `WEBHOOK_NOT_FOUND` | 404 | This workspace has no webhook endpoint with that id. | Use an id from this workspace's webhook list. | No |
| `WEBHOOK_PRINCIPAL_UNRESOLVED` | 403 | This credential cannot be recorded as the webhook's accountable principal. | Register the webhook with a member session, a member's API key or a service account of this workspace. | No |
| `WEBHOOK_REDELIVERY_NOT_AVAILABLE` | 409 | This delivery offers no redelivery (its redeliverAvailable is false): it was withheld because the endpoint's principal may not read that activity; reason names the recorded outcome. Nothing was queued. | Grant the endpoint's principal the permission the event needs; later events are delivered, this one is not resent. | No |
| `WEBHOOK_REDELIVERY_REFUSED` | 409 | This delivery cannot be sent again now: the endpoint is paused, the delivery is still pending or already being redelivered, or its payload is not retained. | Read the delivery and the endpoint; reactivate a paused endpoint or wait for the pending attempt, then retry. | No |
| `WITHDRAWAL_CHAIN_UNSUPPORTED` | 409 | The venue has no withdrawal network for that chain. A quote source answers unavailable with it; an order or requote on that source is refused. | Deliver on a chain the venue withdraws to. | No |
| `WITHDRAWAL_FEE_EXCEEDS_AMOUNT` | 409 | The venue's withdrawal fee is larger than the amount received. A quote source answers unavailable with it; an order or requote on that source is refused. | Use a larger amount. | No |
| `WITHDRAWAL_FEE_UNVERIFIED` | 409 | The venue's withdrawal fee could not be read, so the minimum receive cannot be set. | Request a new quote, then place the order on it. | No |
| `WORKFLOW_UNAVAILABLE` | 503 | The workspace's compliance workflow could not be read; the order was not admitted. | Retry the same request shortly, with backoff. | Yes |
| `WORKSPACE_COMPLIANCE_POLICY_UNAVAILABLE` | 503 | The workspace compliance policy could not be confirmed current, so the order was not admitted. | Retry the same request shortly, with backoff. | Yes |
| `WORKSPACE_CONTEXT_REQUIRED` | 400 | A workspace context is required to act on this order. | Send the request with the workspace's credential. | No |
| `WORKSPACE_INVALID` | 403 | The credential's workspace id is invalid. | Check the key's workspace. | No |
| `WORKSPACE_NOT_ACTIVE` | 403 | The workspace is not active. | Complete or restore the workspace, then retry. | No |
| `WORKSPACE_NOT_FOUND` | 404 | The path workspace is unknown or is not the authenticated workspace; both have the same response. | Use your authenticated workspace id in the path. | No |
| `WORKSPACE_POLICY_UNAVAILABLE` | 503 | The workspace's trading policy could not be read. | Retry the same request shortly, with backoff. | Yes |
| `WORKSPACE_REQUIRED` | 400 | This action needs an authenticated workspace context. | Send the request with a workspace credential. | No |
| `WORKSPACE_SCOPE_MISMATCH` | 403 | The header or other workspace scope selector is not available to this credential or session. | Use a workspace the session belongs to and the credential is bound to. | No |
| `WORKSPACE_SLIPPAGE_LIMIT_EXCEEDED` | 403 | The quote's slippage is above the workspace's limit. | Choose a quote within the limit, or ask an admin to change it. | No |

## Source reasons

A source reason explains why a venue did not quote. It does not mean the whole request failed. Read the remedy before retrying.

| Reason | Meaning | What to do | Retryable |
| :- | :- | :- | :- |
| `accountFeeUnavailable` | The venue account's fee could not be read. | Read prices again shortly. | Yes |
| `accountSetupIncomplete` | The venue account is still being set up. | Complete the account's activation steps. | No |
| `acrossCapacityExceeded` | The amount exceeds Across's current route capacity. | Lower the amount or wait for capacity. | Yes |
| `acrossChainNotCarried` | Across does not carry assets on one of these chains. | Choose another venue or network. | No |
| `acrossRoutedViaCctp` | At this size Across sends USDC through Circle CCTP, which the Across signing grant cannot sign. | Use the Circle CCTP route for this transfer. | No |
| `adapterPayloadSerializationFailed` | The venue's quote payload could not be prepared, so the quote was withheld. | Choose another quote. | No |
| `admissionUnavailable` | The workspace's taker admission could not be read. | Request again shortly. | Yes |
| `advancedAccountEligibilityUnavailable` | Whether the venue account allows Advanced trading could not be read. | Request quotes again shortly. | Yes |
| `advancedAccountStateInconsistent` | The venue account's Advanced state read inconsistently. | Request quotes again shortly. | Yes |
| `advancedConnectionDisabled` | The venue account's Advanced connection is disabled. | Enable it, then request quotes again. | No |
| `advancedConnectionNotConfigured` | The venue account has no Advanced connection. | Configure the Advanced connection. | No |
| `advancedConnectionPaused` | The venue account's Advanced connection is paused. | Resume it, then request quotes again. | No |
| `advancedModeDisabled` | This platform has not enabled Advanced trading, so the venue was not asked. | Use a Basic quote, or wait until Advanced trading is enabled. | No |
| `advancedNotAvailableForAccount` | Advanced trading is not available for this venue account. | Use Basic, or another venue. | No |
| `advancedNotEnabledForAccount` | Advanced trading is not enabled on this venue account. | Enable Advanced on the account. | No |
| `advancedSettlementNeedsVerification` | An Advanced quote settles on TetraFi's contracts, which need TetraFi verification (the workspace's on-chain credential, or the member's for an own-wallet order); nobody on this request holds it, so the venue was not asked. | Complete TetraFi verification to settle on-chain, or choose a Basic quote. | No |
| `allowanceUnavailable` | The wallet's token allowance could not be read. | Request quotes again shortly. | Yes |
| `amountAboveMaximum` | The amount is above what the venue takes. | Lower the amount. | No |
| `amountBelowMinimum` | The amount is below what the venue takes. | Raise the amount. | No |
| `amountUnreadable` | The venue's amounts could not be read. | Request quotes again. | No |
| `amountsUnreadable` | The route's amounts could not be read. | Request quotes again. | No |
| `apiKeyAdvancedWalletUnsupported` | Advanced venues trade from a member's own wallet, which an API key cannot use, so the venue was not asked. | Use a Basic quote, or quote this venue in a member session. | No |
| `apiKeyOrganisationWalletNotAllowlisted` | The organisation wallet the venue would use is not granted to this API key. | A workspace owner adds the wallet to the key's organisation wallets, then request quotes again. | No |
| `apiKeyOrganisationWalletScopeRequired` | The API key holds no grant for an organisation wallet, so the venue has no wallet to quote for. | Grant the key an organisation wallet, or bind a workspace wallet in bind.wallets. | No |
| `askFirst` | The venue prices only when asked directly. | Name the venue in filters.venues.include, or requote its card. | No |
| `askLimitReached` | The venue's ask limit for this workspace is reached; `fix` names when it reopens. | Request quotes again after the time the fix names. | Yes |
| `authorityUnavailable` | The caller's trading authority could not be read. | Request quotes again shortly. | Yes |
| `automationNeverAsks` | Automated callers do not trigger a live ask to this venue. | Requote the card to ask it. | No |
| `availabilityUnreadable` | The venue's availability could not be read. | Request quotes again shortly. | Yes |
| `backgroundNeverAsks` | A background request does not ask this venue live. | Ask in a foreground request or requote. | No |
| `balanceAvailabilityUnconfirmed` | The venue has not confirmed whether its balance is available to trade. | Request quotes again once the venue reports its balance. | Yes |
| `balanceMeaningUnconfirmed` | The venue has not confirmed whether its reported balance is available to trade. | Request quotes again once the venue reports its balance. | Yes |
| `balanceUnreadable` | The paying wallet's balance could not be read. | Request quotes again shortly. | Yes |
| `bankDestinationUnavailable` | The venue account's registered bank accounts could not be read. | Request quotes again shortly. | Yes |
| `basicVenueAccountsUnavailable` | The workspace's venue accounts could not be read. | Request quotes again shortly. | Yes |
| `bebopJamKeyNotEnabled` | Bebop does not price this pair on its solver route for TetraFi yet. | Choose a pair Bebop's RFQ route prices, or another venue. | No |
| `bebopJamQuoteDeclined` | Bebop's solver route returned no price for this wallet. | Choose a pair Bebop's RFQ route prices, or another venue. | No |
| `bebopJamWalletUnsupported` | This wallet cannot sign Bebop's solver-route orders. | Choose a pair Bebop's RFQ route prices, or a wallet that supports it. | No |
| `bebopQuorumWalletTooSlow` | Bebop needs a wallet that can sign the swap within about 20 s; this wallet needs more than one approver. | Choose a wallet one person can sign for. | No |
| `bebopTokenUnavailable` | Bebop is not trading one of this pair's tokens right now. | Choose another venue, or request quotes again later. | No |
| `bebopWalletQuorumUnreadable` | The wallet's approval quorum could not be read, so Bebop was not asked. | Request quotes again shortly. | Yes |
| `billingPaymentOverdue` | The organisation's TetraFi bill is more than 30 days overdue, so no venue was asked for a new quote. | Pay the overdue statement in Settings, Billing, then request quotes again. | No |
| `bondAmountUnreadable` | The route's bond amount could not be read. | Request quotes again. | No |
| `bondAssetUnreadable` | The route's bond asset could not be read. | Request quotes again. | No |
| `buyAmountUnsupported` | The venue cannot quote a fixed buy amount. | Set sellAmount instead. | No |
| `buyChainInvalid` | The buy chain could not be read. | Request quotes again. | No |
| `catalogueUnavailable` | The asset catalogue was not loaded. | Request quotes again shortly. | Yes |
| `cctpChainNotCarried` | Circle CCTP does not carry USDC between these chains. | Choose another venue or network. | No |
| `ccxtVenueRequiresCexLane` | This venue's quote needs its own venue-account path, so it was withheld here. | Quote through the venue account. | No |
| `chainFamilyUnknown` | The pay chain's family is not known. | Choose another pair. | No |
| `chainUnrecorded` | The chain is not recorded in the deployment. | Choose another chain. | No |
| `clientSessionRequired` | The venue needs a client session. | Quote in a signed-in session. | No |
| `clockUnreadable` | The server clock could not be read. | Request quotes again shortly. | Yes |
| `comingSoon` | The venue does not serve this pair yet. | Choose another venue. | No |
| `comparisonCostsUnavailable` | The costs used to compare this price could not be read. | Read prices again shortly. | Yes |
| `connectionChanged` | The venue connection changed during the request. | Request quotes again. | Yes |
| `connectionListingUnavailable` | The venue account's connections could not be read. | Request quotes again shortly. | Yes |
| `connectionNotConfigured` | The venue connection is not configured for this workspace. | A credentials manager configures the venue connection, then request quotes again. | No |
| `connectionRevoked` | The workspace's key for this venue was revoked. | Reconnect the venue account. | No |
| `corridorInvalid` | The route's corridor could not be read. | Request quotes again. | No |
| `credential` | The credential cannot use this venue. | Use a member session or a key with venue trading. | No |
| `deadlineExceeded` | The route did not answer in time. | Request quotes again. | Yes |
| `defaultsLoading` | Default wallet bindings are still loading. | Request quotes again shortly. | Yes |
| `defaultsUnavailable` | The saved default wallets and accounts could not be read. | Request quotes again shortly. | Yes |
| `deliverToCalldataUnsupported` | This trade cannot carry delivery calldata. | Deliver to a plain address. | No |
| `deliverToNotPermitted` | deliverTo needs a member session that can view wallets. | Remove deliverTo, or quote in a member session. | No |
| `deliverToTagUnsupported` | This route cannot carry a delivery destination tag. | Deliver to a plain address without a destination tag, or choose a route that supports it. | No |
| `deliverToUnreadable` | The delivery destination could not be read. | Request quotes again shortly. | Yes |
| `deliveryAccountNetworkUnavailable` | The network of the account receiving the trade could not be resolved. | Choose another receiving account, then request quotes again. | No |
| `deliveryAccountUnavailable` | The account receiving the trade could not be resolved for this venue. | Choose another receiving account, then request quotes again. | No |
| `destinationCannotSendOnChain` | The organisation wallet cannot send on this network yet, so it is not offered to receive there. | Choose a custody wallet, or an organisation wallet on an EVM network. | No |
| `dexReferencePriceUnavailable` | The reference price that bounds this pool quote could not be read, so it was withheld. | Request quotes again shortly. | Yes |
| `directPatienceHarvest` | The route was stopped to return direct quotes in time. | Request quotes again. | Yes |
| `economicallyInferior` | A direct quote now delivers more than this route. | Use the better quote. | No |
| `exactAmountConflictsWithCard` | The exact amount asked conflicts with the venue's card. | Request quotes again with the other side fixed. | No |
| `exactAmountConflictsWithQuote` | The venue's quote does not match the exact amount asked. | Request quotes again. | No |
| `exactOutputDebitUnavailable` | The venue priced a fixed buy amount but returned no sell amount for it. | Set sellAmount instead. | No |
| `exactOutputDeliveryUnsupported` | The venue cannot deliver an exact buy amount. | Set sellAmount instead. | No |
| `exactOutputEstimateUnavailable` | The venue could not estimate the exact buy amount. | Set sellAmount instead. | No |
| `exactRouteHypothesisUnavailable` | This route is not available now. | Request quotes again later. | No |
| `executionStageDisabled` | Trading on this venue is switched off in this environment. | Choose another venue. | No |
| `expiredOnArrival` | The venue's quote had expired when it arrived. | Request quotes again. | Yes |
| `expiryUnknown` | The venue's quote expiry could not be read. | Request quotes again. | No |
| `feeUnreadable` | The venue's fee could not be read. | Request quotes again. | No |
| `feeUnverified` | The venue's fee has not been verified. | Choose another venue. | No |
| `filteredOut` | The venue is excluded by the request's filters. | Relax the filters to include it. | No |
| `firmAskRefused` | The venue refused the firm ask. | Choose another quote. | No |
| `firmQuoteLimited` | The venue limits how often it answers firm quotes; `fix` names when it reopens. | Request quotes again after the time the fix names. | Yes |
| `freshnessUnknown` | How fresh the venue's price is could not be read. | Request quotes again. | No |
| `fundingAccountNetworkUnavailable` | The network of the account paying for the trade could not be resolved. | Choose another trading source, then request quotes again. | No |
| `fundingAccountUnavailable` | The account paying for the trade could not be resolved for this venue. | Request quotes again shortly, or choose another trading source. | Yes |
| `fundingWindow` | The venue is inside a funding window. | Request quotes again after the window. | Yes |
| `grantCapExceeded` | The amount exceeds the paying organisation wallet's approved signing-grant cap. | Lower the amount or ask the wallet owner to approve a larger grant. | No |
| `indicative` | A priced indicative card from a venue read or estimate, not a firm-price ask. | Read the card's firmAsk: onRequest offers a firm ask; atExecution fixes the price only when the order executes. | No |
| `insufficientDepth` | The amount is above the depth the venue has available right now. | Lower the amount, or request quotes again later. | Yes |
| `insufficientLiquidity` | The venue lacks liquidity for this amount. | Try a smaller amount. | No |
| `jurisdictionUnproven` | The requester's identity country is not on record, so the quote was withheld. | Complete the identity country, then request quotes again. | No |
| `lpUnknown` | The venue's provider is not known. | Choose another venue. | No |
| `mfaEnrolmentRequired` | The workspace requires a second factor and the member has none. | Enrol an authenticator. | No |
| `mfaRequired` | The venue needs a session that completed its second factor. | Complete the second factor. | No |
| `minimumUnverified` | The venue's minimum amount is not verified. | Choose another venue. | No |
| `missingPermission` | The caller lacks the workspace permission this venue's quote needs; `fix` names it. | Ask a workspace admin for the permission the fix names. | No |
| `mixedNetworks` | The pair mixes test and production networks. | Choose chains on the same network. | No |
| `needsNativeGas` | The paying wallet needs native gas before this venue can trade; detail names the amount. | Fund the wallet with the named gas, then request quotes again. | No |
| `needsWallet` | The venue needs a bound wallet before it can quote. | Bind a wallet for this venue, then request quotes again. | No |
| `netReceivedUnavailable` | The amount received net of fees could not be computed. | Request quotes again. | No |
| `networkUnrecorded` | Whether the chain is a test network is not recorded. | Choose another chain. | No |
| `noAddress` | The paying wallet has no address to read a balance from. | Bind a wallet with an address. | No |
| `noCard` | The venue returned no quote card. | Request quotes again. | No |
| `noFetcher` | Balances cannot be read on this server. | Proceed without the balance check. | No |
| `noInventory` | The venue holds none of the receive asset on that network right now. | Choose another venue, or request quotes again later. | Yes |
| `noLaneForPair` | The venue has no lane for this pair. | Choose another venue. | No |
| `noLegs` | The route has no legs. | Request quotes again. | No |
| `noOnChainCorridor` | This pair has no on-chain corridor. | Choose another pair. | No |
| `noPlannedVenue` | The route has no planned venue. | Request quotes again. | No |
| `noPool` | The venue has no pool for this pair. | Choose another venue. | No |
| `noPrice` | There is no price to compare. | Choose another venue. | No |
| `noQuote` | The venue sent no quote. | Request quotes again. | No |
| `noRpc` | The chain's node is not reachable for a balance read. | Request quotes again shortly. | Yes |
| `noSize` | The source has no price for the requested size. | Choose another size. | No |
| `notConnected` | The workspace has no account connected for this venue. | Connect the venue account. | No |
| `notEligible` | The venue is not eligible for this request, so it was not asked. | Change the request, or choose another venue. | No |
| `notExecutable` | The venue's card is not executable for this caller. | Read the card's detail for why. | No |
| `notFilled` | The source's levels do not fill this size. | Choose a smaller size. | No |
| `notPriced` | A reference price for one of the assets is not available, so the spread from mid is not shown. | Request quotes again later. | Yes |
| `notYetPublished` | The source publishes this pair but no price is cached yet. | Read prices again shortly. | Yes |
| `onboardedVenuesUnavailable` | The workspace's connected venues could not be read for this asset list. | Read the list again shortly. | Yes |
| `onchainAccountDefaultWalletRequired` | The venue account needs a default organisation wallet on the paying network; `network` names it. | Choose the default wallet for that network. | No |
| `onchainAccountDefaultWalletUnavailable` | The venue account's default wallet on the paying network is no longer eligible; `network` names it. | Choose another linked wallet as the default. | No |
| `onchainAccountWalletRequired` | The venue account needs a registered organisation wallet on the paying network. | Register a wallet on that network. | No |
| `onchainAssetDecimalsMismatch` | The venue's market precision does not match the asset catalogue. | Choose another venue. | No |
| `onchainAssetIdentityMismatch` | The venue's market asset does not match the catalogue asset. | Choose another venue. | No |
| `onchainAssetUnmapped` | The venue's market token is not in the asset catalogue. | Choose another venue. | No |
| `onchainAssetVariantFiltered` | The request's variant filter excludes this venue's token. | Relax the variant filter. | No |
| `onchainCatalogueUnavailable` | The asset catalogue was not loaded for this venue. | Request quotes again shortly. | Yes |
| `onchainDeliverToNotReceivingWallet` | The venue delivers on-chain to the trade's receiving organisation wallet, not to the address named. | Bind the receiving wallet instead of a delivery address. | No |
| `onchainDeliverToUnverified` | The receiving organisation wallet's address could not be confirmed, so the venue was not asked. | Request quotes again, or bind the receiving wallet. | No |
| `onchainMarketCatalogUnreadable` | The venue's market list could not be read. | Request quotes again shortly. | Yes |
| `onchainMarketChainRequired` | The venue lists this pair on more than one chain, so a chain must be pinned. | Pin the pay and receive chains. | No |
| `onchainMarketTokenRequired` | The venue's market names no on-chain token for this pair. | Choose another venue. | No |
| `onchainMarketVariantRequired` | The venue lists this pair in more than one token variant on these chains and none is native on both sides. | Choose the token variant in the request's variant filter. | No |
| `onchainMarketsUnavailable` | On-chain markets could not be read for this asset list. | Read the list again shortly. | Yes |
| `onchainSiteChainUnreadable` | The venue's chain could not be read. | Request quotes again shortly. | Yes |
| `onchainWalletChainUnreadable` | The wallet's chain could not be read. | Request quotes again shortly. | Yes |
| `onchainWalletInactive` | The saved wallet is not active. | Activate the wallet, or choose another. | No |
| `onchainWalletNotLinked` | The chosen wallet is not linked to this venue account; `recovery` offers a fix. | Link the wallet, or use the account default the recovery names. | No |
| `onchainWalletNotUsable` | The saved wallet cannot be used by this caller; an API key without a wallet grant receives indicative prices only. | Grant the API key an organisation wallet, or choose a wallet the caller may use. | No |
| `onchainWalletPickAmbiguous` | The request names several organisation wallets and none on this network. | Name one wallet on the paying network. | No |
| `onchainWalletUnavailable` | The saved wallet for this venue could not be used just now. | Request quotes again shortly, or bind another wallet. | Yes |
| `onchainWalletWrongNetwork` | The saved wallet is on another network. | Choose a wallet on this network. | No |
| `orderPayloadMissing` | The route's order payload is missing. | Request quotes again. | No |
| `outsideTopComposites` | Better routes filled the route list. | Use one of the listed routes. | No |
| `pairNotServed` | The venue does not serve this pair. | Choose another venue. | No |
| `pairUnmapped` | The venue does not map this pair. | Choose another venue. | No |
| `payInTermsUnavailable` | The venue's bank pay-in terms for this quote could not be read. | Request quotes again. | No |
| `permissionsUnreadable` | The caller's permissions could not be read. | Request quotes again shortly. | Yes |
| `pilotTradeCapExceeded` | The amount is above the venue's pilot trade cap. | Lower the amount. | No |
| `placeOrderNotPermitted` | The caller cannot place orders. | Use a credential with Place orders. | No |
| `platformFeeRateUnavailable` | The TetraFi fee rate for this trade could not be read, so the quote was withheld. | Request quotes again shortly. | Yes |
| `prefundingMarkerUnreadable` | Whether the route needs prefunding could not be read. | Request quotes again. | No |
| `prefundingRequired` | The venue needs a prefunded balance before it can quote. | Prefund the venue account. | No |
| `priceArithmetic` | The source's price could not be computed. | Choose another venue. | No |
| `priceOnRequest` | The venue publishes no price; it prices when asked. | Name it in filters.venues.include or requote its card. | No |
| `priceOutOfRange` | The venue quoted too far from the market, so the quote is not shown. | Request quotes again later. | No |
| `priceProtectionInvalid` | The price protection asked is above the allowed limit. | Ask for less price protection. | No |
| `priceSourceNone` | This venue publishes no price and must be asked directly. | Request a quote naming this venue. | No |
| `pricingBookOnly` | The venue offers order-book prices only here. | Trade on its book price. | No |
| `pricingBookPairUnserved` | The venue's pricing book does not serve this pair. | Choose another venue or pair. | No |
| `productNotQuoted` | The venue no longer quotes this product. | Request fresh quotes. | No |
| `protocolChainMissing` | The route has no chain for its protocol leg. | Request quotes again. | No |
| `providerFeeTreatmentUnknown` | How the venue's fee is applied could not be read. | Request quotes again. | No |
| `providerSiteUnrecorded` | The venue site's network is not recorded. | Choose another venue. | No |
| `quoteIdUnissuable` | A quote id could not be issued. | Request quotes again shortly. | Yes |
| `quoteNotHeld` | The quote could not be held, so it cannot be ordered. | Request quotes again. | Yes |
| `receiveWalletNotServed` | The venue cannot pay out to the receive wallet. | Choose another receive wallet. | No |
| `referenceMidUnavailable` | The reference mid could not be read. | Read prices again shortly. | Yes |
| `referenceMidUnreadable` | The reference mid price could not be read. | Request quotes again. | No |
| `referencePriceUnavailable` | No reference price was available to price the route. | Request quotes again shortly. | Yes |
| `registryUnavailable` | The deployment registry could not be read. | Request quotes again shortly. | Yes |
| `relayCapacityExceeded` | The amount exceeds Relay's available liquidity on this route; detail names the dollar ceiling when Relay states one. | Lower the amount, use another bridge or wait for liquidity. | Yes |
| `relayChainNotCarried` | Relay does not carry assets on one of these chains. | Choose another venue or network. | No |
| `relayCurrencyUnsupported` | Relay does not carry this token on this route; no deposit was sent. | Use another bridge. | No |
| `relaySwapImpactTooHigh` | Relay will not quote this size on this route because its price impact is too high. | Try another amount or another bridge. | No |
| `releaseRecheckUnavailable` | The final checks of the caller's authority and venue account could not be completed before the quote was returned. | Request quotes again shortly. | Yes |
| `requestUnbuildable` | The request for this route could not be built. | Change the request, or choose another route. | No |
| `routeLegChainUnknown` | A route leg's chain is not known. | Request quotes again. | No |
| `routeLegUnnamed` | A route leg could not be identified. | Request quotes again. | No |
| `routeLegUnplanned` | A route leg was not planned. | Request quotes again. | No |
| `routeUnavailable` | The venue has no executable route for this exact pair right now. | Request quotes again later. | No |
| `secondFactorUnreadable` | The member's second-factor state could not be read. | Request again shortly. | Yes |
| `sellChainInvalid` | The sell chain could not be read. | Request quotes again. | No |
| `settlementDeclarationUnavailable` | The venue's settlement declaration could not be read. | Request quotes again shortly. | Yes |
| `settlementNotAvailable` | The venue declares no settlement for this pair and network. | Choose another venue or network. | No |
| `settlementPrecisionUnavailable` | The settlement asset's precision could not be read. | Read prices again shortly. | Yes |
| `shortfallUnmeasured` | The funding shortfall could not be measured. | Request quotes again. | No |
| `shortfallUnreadable` | The funding shortfall could not be read. | Request quotes again. | No |
| `signerLacksRight` | The wallet's signer lacks the right this venue needs. | Grant the signer the right, or choose another wallet. | No |
| `signerUnavailable` | The wallet's signer is not available just now. | Request quotes again later. | Yes |
| `signingGrantAmbiguous` | More than one organisation wallet can pay for this venue and none was chosen. | Bind the paying wallet, then request quotes again. | No |
| `signingGrantExpired` | The saved wallet's signing grant for this venue has expired. | Renew the signing grant, then request quotes again. | No |
| `signingGrantRequired` | The saved wallet has no active signing grant for this venue. | Grant signing for the venue, then request quotes again. | No |
| `signingGrantTokenNotKept` | The signing grant does not cover the token this trade keeps. | Extend the grant to the token. | No |
| `signingGrantTokenNotPayable` | The signing grant does not cover the token this trade pays. | Extend the grant to the token. | No |
| `singleChainVenue` | The venue trades on one chain only. | Choose pay and receive on the same chain. | No |
| `siteChainUnreadable` | The venue site's chain could not be read. | Request quotes again shortly. | Yes |
| `sizeNotEligible` | The amount is outside the venue's eligible sizes. | Change the amount. | No |
| `solverChainUnready` | The solver is not ready to settle on the chain named by network and detail. | Choose another route while the solver operator restores settlement readiness. | No |
| `submitOrderBlocked` | The workspace cannot submit orders now. | Resolve what blocks order submission. | No |
| `takerOnboardingIncomplete` | The workspace has not finished taker onboarding. | Finish taker onboarding. | No |
| `tetrafiSolverCallbackNotAuthorized` | TetraFi has not yet enabled delivery to this receiving wallet on that network. | Choose an enabled receiving wallet, or ask TetraFi support to enable this one. | No |
| `tierNotQuoted` | The venue no longer quotes this size tier. | Request fresh quotes. | No |
| `timedOut` | The venue did not answer in time. | Request quotes again. | Yes |
| `timedOutBeforeSend` | The venue timed out before anything was sent to it. | Request quotes again. | Yes |
| `tradePaused` | Trading on the venue account is paused. | Request quotes again after it resumes. | Yes |
| `tradingLinkSnapshotChanged` | The venue account's trading links changed while the quote was qualified. | Request quotes again. | Yes |
| `tradingLinkSnapshotUnavailable` | The venue account's trading links could not be read. | Request quotes again shortly. | Yes |
| `tradingPermissionRequired` | Firm prices from this venue need Request quotes and Place orders. | Use a credential with both permissions. | No |
| `tradingSourceNetworkUnavailable` | The network of the selected trading source could not be resolved. | Choose another trading source, then request quotes again. | No |
| `tradingSourceNotLinked` | The selected trading source is not linked to this venue's account. | Choose a linked trading source, or link it on the venue account. | No |
| `uniswapChainReadUnavailable` | The chain could not be read to price the Uniswap v3 pool. | Request quotes again shortly. | Yes |
| `uniswapInsufficientDepth` | The amount is above the depth Uniswap v3 has available right now. | Lower the amount, or request quotes again later. | Yes |
| `uniswapQuoteUnreadable` | Uniswap v3's pool quote could not be read. | Request quotes again shortly. | Yes |
| `uniswapRouteNotGranted` | The wallet's Uniswap v3 signing grant does not include a route for this pair. | Choose another wallet, or have a wallet manager add the pair to the wallet's grant. | No |
| `uniswapUnwrapAboveDailyCap` | A native receive's swap could deliver more wrapped token than the wallet's Uniswap v3 grant still unwraps today. | Lower the amount, or have a wallet manager raise the wrapped token's daily cap. | No |
| `uniswapUnwrapAboveTradeCap` | A native receive's swap could deliver more wrapped token than the wallet's Uniswap v3 grant unwraps per trade. | Lower the amount, or have a wallet manager raise the wrapped token's per-trade cap. | No |
| `unsupportedNative` | The native token's balance cannot be read on this chain. | Proceed without the balance check. | No |
| `venueConnectionStorageUnavailable` | The venue account's quote-admission records could not be read or written. | Request quotes again shortly. | Yes |
| `venueDataStale` | The venue could not read its own balances or prices just now. | Request quotes again shortly. | Yes |
| `venueDeclined` | The venue declined to quote. | Choose another venue. | No |
| `venueEnablementRechecking` | The venue's readiness for this workspace is being re-checked. | Request quotes again shortly. | Yes |
| `venueEnablementUnavailable` | The workspace's venue enablements could not be read. | Request quotes again shortly. | Yes |
| `venueListingTimedOut` | The workspace's venue list could not be read in time. | Request quotes again. | Yes |
| `venueNotConnected` | The venue's account is not connected for this workspace. | Connect the venue account. | No |
| `venueNotEnabled` | The venue is not enabled on the selected trading source's venue account; `fix` names who can enable it. | A credentials manager enables the venue, then request quotes again. | No |
| `venueNotEnabledForWorkspace` | The venue is not enabled for this workspace. | Enable the venue for the workspace. | No |
| `venueNotListed` | The venue no longer quotes this pair. | Request fresh quotes. | No |
| `venuePoliciesUnavailable` | The venue quote policies could not be read. | Request quotes again shortly. | Yes |
| `venueRelationship` | The workspace's relationship with this venue does not allow trading. | Resolve the relationship with the venue. | No |
| `venueRelationshipUnavailable` | The workspace's relationship with this venue could not be read. | Request quotes again shortly. | Yes |
| `venueTradeKeyUnavailable` | The API key's venue-trading settings could not be read. | Request quotes again shortly. | Yes |
| `venueTradeScopeRequired` | The API key can read indicative prices but cannot order without venue-trading authority. | Re-issue the key with two-factor authentication, venue trading on and HMAC signing. | No |
| `venueTradeUnreadable` | The venue's trade terms could not be read. | Request quotes again. | No |
| `venueUnavailable` | The venue could not price this request right now. | Request quotes again shortly. | Yes |
| `walletChainMismatch` | The saved wallet is registered on a different network. | Choose a wallet on this network. | No |
| `walletHasNoAddress` | The bound wallet has no address on this network. | Bind a wallet with an address on the network. | No |
| `walletNotOnChain` | The chosen wallet is registered on another network, so the venue was not asked. | Choose a wallet on this network. | No |
| `walletNotUsableByYou` | The linked wallet is visible to this member but cannot be used by them for trading. | An admin can give the member rights in Treasury Access, or choose a wallet they may use. | No |
| `walletNotVerifiedForAce` | The wallet has no on-chain compliance identity, so the quote was withheld. | Verify the wallet, then request quotes again. | No |
| `walletNotWhitelisted` | The saved wallet is not approved for this venue account. | Approve the wallet on the venue account, or choose another. | No |
| `walletRefused` | The bound wallet cannot trade on this venue. | Bind another wallet. | No |
| `walletUnavailable` | The bound wallet could not be used just now. | Request quotes again shortly, or bind another wallet. | Yes |
| `withdrawalChainUnsupported` | The venue has no withdrawal network for that chain. | Deliver on a chain the venue withdraws to. | No |
| `withdrawalFeeUnread` | The venue's withdrawal fee could not be read. | Request quotes again. | No |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.