Portal Community
AUTH_MISSING_KEY
credentialID didn't resolve to a usable API key — the node checks this before any HTTP request is made.
Fix: Confirm the vault credential referenced by credentialID exists and holds a valid Ondo API key — see Configuration.
AUTH_UNAUTHORIZED (401) / AUTH_FORBIDDEN (403)
401 means the API key itself is invalid or expired. 403 means the key is valid but lacks permission for the requested operation — commonly a read-only key calling limits.getTradingLimits or an attestations.* operation.
Fix: Rotate/verify the key for 401; request the correct scope (trading/attestation) for 403.
VAL_MISSING_SYMBOL / VAL_MISSING_CHAINID / other VAL_MISSING_* codes
A required operation field was empty. Every operation's fields table (see the resource pages) lists which are required.
Fix: Supply the missing field. These are caught before any HTTP call, so no API quota is spent on the failed attempt.
VAL_MISSING_AMOUNT / VAL_BOTH_AMOUNTS
Attestation operations require exactly one of tokenAmount or notionalValue — never both, never neither.
Fix: See Attestation Operations.
MARKET_CLOSED (status: "closed_market")
Returned by attestations.createAttestation, attestations.createAttestationQuote, and limits.getTradingLimits when the relevant market isn't open. This is a distinct, expected outcome — not a generic error.
Fix: Check getMarketStatus's isOpen/offhours.isOpen first, or branch your workflow on this specific status value.
RESOURCE_NOT_FOUND on getLatestDividend
This operation is keyed by the underlying stock ticker (e.g. AAPL), not the GM symbol (AAPLon).
Fix: Pass the stock ticker — if you only have the GM symbol, resolve it via getMarket's underlyingTicker field first.
RATE_LIMIT_EXCEEDED (HTTP 429)
The node automatically retries up to 3 times with exponential backoff (1s, 2s, 4s) before surfacing this error, so seeing it means the API is still rate-limiting after those retries.
Fix: Reduce call frequency, especially on assets.getAllPrices and other "all" operations; cache slow-changing data like getAllAddresses / getAllMetadata client-side.
Unexpectedly large response from chains.getBalances
Omitting both userAddress and tokenAddress returns balances for every user and token on the chain.
Fix: Always supply at least one filter in production workflows — see Chain Operations.
PARSE_JSON_ERROR / PARSE_ERROR
The API returned a response body that didn't match the expected schema for that operation.
Fix: Check the raw response (surfaced internally for debugging) against the operation's documented shape — this can indicate an upstream API change.
SERVER_ERROR (5xx) / SERVICE_UNAVAILABLE
Ondo's API itself is failing or temporarily unavailable.
Fix: Retry with backoff at the workflow level; this is not something the node's built-in retry (which only targets 429) will resolve automatically.