Skip to main content
Ondo’s Global Market APIs return structured error messages with three key fields:
  • code: Machine-readable identifier (e.g., MARKET_CLOSED)
  • message: Human-readable description
  • documentation: URL linking to relevant documentation

Error Codes

MARKET_CLOSED

Status: 403 Forbidden
{
  "code": "MARKET_CLOSED",
  "message": "market is closed"
}
The market is closed due to weekends, holidays, or scheduled/unscheduled closures from maintenance or exchange outages.

MARKET_PAUSED

Status: 403 Forbidden
{
  "code": "MARKET_PAUSED",
  "message": "market is paused"
}
Trading is temporarily paused, either during scheduled session transitions (09:29-09:31 ET) or unscheduled halts (circuit breaker triggers).

ASSET_PAUSED

Status: 403 Forbidden
{
  "code": "ASSET_PAUSED",
  "message": "asset trading is paused"
}
Trading for a specific asset is paused, possibly due to corporate actions, symbol migration, or market volatility.

ASSET_LIMITED

Status: 200 OK
{
  "code": "ASSET_LIMITED",
  "message": "Earnings event in progress"
}
Returned as a reason code within asset status responses (not as an error). Indicates the asset has limited trading capacity, typically during earnings events. Trading is still permitted, but quantity may be restricted.

ASSET_CLOSED_FOR_SESSION

Status: 403 Forbidden
{
  "code": "ASSET_CLOSED_FOR_SESSION",
  "message": "asset is not available for trading during the current session"
}
The asset isn’t tradable in the current session (“premarket”, “regular”, “postmarket”, or “overnight”).

ASSET_REDEEM_ONLY

Status: 403 Forbidden
{
  "code": "ASSET_REDEEM_ONLY",
  "message": "asset is redeem-only"
}
The asset can only be redeemed (sold), not minted (bought).

READ_ONLY_API_KEY

Status: 403 Forbidden
{
  "code": "READ_ONLY_API_KEY",
  "message": "read-only API key cannot perform write operations"
}
The API key used is read-only and cannot create attestations or perform other write operations.

MISSING_API_KEY

Status: 401 Unauthorized
{
  "code": "MISSING_API_KEY",
  "message": "missing API key"
}
No API key was provided in the x-api-key request header.

INVALID_API_KEY

Status: 401 Unauthorized
{
  "code": "INVALID_API_KEY",
  "message": "invalid API key"
}
The provided API key is not valid or has been revoked.

INVALID_SYMBOL

Status: 400 Bad Request
{
  "code": "INVALID_SYMBOL",
  "message": "invalid symbol; must be at least 3 characters long and end with 'on'"
}
The symbol is invalid, unrecognized, or improperly formatted. Use valid namespaced symbols (e.g., TSLAon, AAPLon).

MISSING_SYMBOL

Status: 400 Bad Request
{
  "code": "MISSING_SYMBOL",
  "message": "missing symbol"
}
The required symbol parameter was not provided.

ASSET_NOT_FOUND

Status: 404 Not Found
{
  "code": "ASSET_NOT_FOUND",
  "message": "asset not found"
}
The specified asset does not exist in the system.

INVALID_SIDE

Status: 400 Bad Request
{
  "code": "INVALID_SIDE",
  "message": "invalid side; side must be either 'buy' or 'sell'"
}
The side parameter must be either buy or sell.

INVALID_DURATION

Status: 400 Bad Request
{
  "code": "INVALID_DURATION",
  "message": "invalid duration; duration must be either 'long' or 'short'"
}
The duration parameter must be either long or short.

MAX_LIMIT_REACHED

Status: 400 Bad Request
{
  "code": "MAX_LIMIT_REACHED",
  "message": "exceeded the active notional value limit"
}
The order exceeds user-based notional caps. Limits reset when attestations expire.

SESSION_LIMIT_REACHED

Status: 400 Bad Request
{
  "code": "SESSION_LIMIT_REACHED",
  "message": "exceeded the session's notional value limit"
}
The order exceeds session-based notional caps, which reset after each session transition.

MAX_ATTESTATIONS

Status: 400 Bad Request
{
  "code": "MAX_ATTESTATIONS",
  "message": "exceeded the active attestations limit"
}
Maximum concurrent attestation requests reached. Wait for some to settle before requesting more.

INSUFFICIENT_LIQUIDITY

Status: 400 Bad Request
{
  "code": "INSUFFICIENT_LIQUIDITY",
  "message": "insufficient liquidity for the requested operation"
}
An attestation cannot be created due to insufficient funds, typically during sparse overnight trading.

INVALID_NOTIONAL_VALUE

Status: 400 Bad Request
{
  "code": "INVALID_NOTIONAL_VALUE",
  "message": "invalid notional value; value must be a string representing a positive decimal value"
}
The amount is below minimum requirements, above user limits, or malformed/non-numeric.

INVALID_TOKEN_AMOUNT

Status: 400 Bad Request
{
  "code": "INVALID_TOKEN_AMOUNT",
  "message": "invalid token amount; amount must be a string representing a positive decimal value"
}
The token amount is malformed or not a positive decimal value.

MISSING_TOKEN_OR_NOTIONAL

Status: 400 Bad Request
{
  "code": "MISSING_TOKEN_OR_NOTIONAL",
  "message": "either token amount or notional value must be provided"
}
The request must include either tokenAmount or notionalValue, but neither was provided.

INVALID_ADDRESS

Status: 403 Forbidden
{
  "code": "INVALID_ADDRESS",
  "message": "user_address is not on the allow list"
}
The provided wallet address is not whitelisted for trading.

MISSING_CHAIN_ID

Status: 400 Bad Request
{
  "code": "MISSING_CHAIN_ID",
  "message": "chainId is required"
}
The required chainId parameter was not provided in the request.

MISSING_SIDE

Status: 400 Bad Request
{
  "code": "MISSING_SIDE",
  "message": "side is required"
}
The required side parameter was not provided in the request.

INVALID_GM_CHAIN

Status: 400 Bad Request
{
  "code": "INVALID_GM_CHAIN",
  "message": "invalid chain; supported chains: ethereum-1, bsc-56, solana-900"
}
The specified chain is not a valid GM chain identifier.

UNSUPPORTED_GM_CHAIN

Status: 400 Bad Request
{
  "code": "UNSUPPORTED_GM_CHAIN",
  "message": "unsupported chain"
}
The specified chain is recognized but not currently supported for the requested operation.

PAUSED_GM_CHAIN

Status: 400 Bad Request
{
  "code": "PAUSED_GM_CHAIN",
  "message": "chain is paused"
}
The specified chain is temporarily paused and not accepting requests.

INVALID_SORT

Status: 400 Bad Request
{
  "code": "INVALID_SORT",
  "message": "invalid sort order; must be 'asc' or 'desc'"
}
The sort query parameter is invalid. Valid values are asc or desc.

INVALID_INTERVAL

Status: 400 Bad Request
{
  "code": "INVALID_INTERVAL",
  "message": "invalid interval format: 2hour"
}
The interval query parameter is not a valid value. Valid intervals are 1min, 5min, 15min, 1hour, 4hour, 12hour, and 1day.

INVALID_RANGE

Status: 400 Bad Request
{
  "code": "INVALID_RANGE",
  "message": "invalid time range: 2month; valid ranges: 1day, 1month, 3month, 6month, 1year, all"
}
The range query parameter is not a valid value. Valid ranges are 1day, 1month, 3month, 6month, 1year, and all.

INVALID_INTERVAL_RANGE_PAIR

Status: 400 Bad Request
{
  "code": "INVALID_INTERVAL_RANGE_PAIR",
  "message": "invalid interval/range pair: 1min/1year; valid pairs: 1min/1day, 5min/1day, 15min/1day, 1hour/1month, 4hour/3month, 12hour/6month, 1day/1year, 1day/all"
}
The combination of interval and range parameters is not supported. See the OHLC endpoint documentation for valid pairs.

MISSING_TICKER_ID

Status: 400 Bad Request
{
  "code": "MISSING_TICKER_ID",
  "message": "missing ticker ID"
}
The required tickerId parameter was not provided.

INVALID_TICKER_ID

Status: 400 Bad Request
{
  "code": "INVALID_TICKER_ID",
  "message": "invalid ticker ID"
}
The provided tickerId is not a valid ticker identifier. Ticker IDs are formatted as <base>_<target> (e.g., AAPLon_USDon).

RESOURCE_NOT_FOUND

Status: 404 Not Found
{
  "code": "RESOURCE_NOT_FOUND",
  "message": "resource not found"
}
The requested resource does not exist.

MISSING_USER_ADDRESS

Status: 400 Bad Request
{
  "code": "MISSING_USER_ADDRESS",
  "message": "missing user address"
}
The user_address field is required for firm attestation requests on Solana chains but was not provided.

INVALID_USER_ADDRESS

Status: 400 Bad Request
{
  "code": "INVALID_USER_ADDRESS",
  "message": "invalid user address"
}
The user_address provided for a firm attestation request on a Solana chain is not a valid Solana public key.

GAS_FEE_EXCEEDS_ORDER_VALUE

Status: 400 Bad Request
{
  "code": "GAS_FEE_EXCEEDS_ORDER_VALUE",
  "message": "gas fee exceeds order value: increase your order size or try again later"
}
The estimated gas fee for executing the order on-chain exceeds the total value of the order. Increase your order size or try again when gas fees are lower.

INTERNAL_ERROR

Status: 500 Internal Server Error
{
  "code": "INTERNAL_ERROR",
  "message": "internal error"
}
An unexpected server error occurred. If this persists, contact your account manager.
This list is non-exhaustive. For unresolved issues, consult request documentation or contact your account manager.