Markets and limits
Find what is quotable right now, at what size, and when. Assets, levels, limits and market status.
Before you quote, read what is live. Four endpoints answer four questions:
| Question | Endpoint | Key fields |
|---|---|---|
| Which tokens exist, on which chains? | GET /v2/assets | chains[].token, chains[].quote_tokens, price, market |
| Which pairs quote right now, and how deep? | GET /v2/markets/levels | pairs[], bids, asks, quoteability |
| How much can I trade, and what do I approve? | GET /v2/limits | sides.<buy|sell>.status, limits, allowance_target |
| Is the equity market open? | GET /v2/markets/status | isOpen, marketStatus, assetTradability |
All of these are live. Never hard-code a pair, a chain or a decimals value.
Assets
GET /v2/assets is the catalog for a token picker. Each asset has a category (tokenized_equity, tokenized_fund, stablecoin, or other), price, market, and one chains[] entry per chain with its token and same-chain quote_tokens. ?address=0x... narrows it to one token contract.
curl -s "$RAVE_API/v2/assets" -H "Authorization: Bearer ***" \
| jq '.[] | {symbol, category, chains: [.chains[] | {chain_id, token: .token.address, quote_tokens: [.quote_tokens[].address]}]}'The catalog can lag a newly launched chain, so treat /v2/markets/levels as the source of truth for what quotes.
Decimals are per token, per chainUSDC has 18 decimals on BNB Smart Chain and 6 on Ethereum and Base. A decimals value carried across chains is wrong by a factor of 10^12. Base tokens differ too: they are not always 18 decimals, and some on Base use 8. Always read
decimalsfor the exact token address and chain you quote.
Market levels
GET /v2/markets/levels returns the pair books published right now: bid and ask levels, size bounds, and per-side quoteability.
| Filter | Example |
|---|---|
| One chain | ?chain_id=56 |
| One symbol | ?symbol=BASE_SYMBOL |
| One exact pair | ?chain_id=56&base_token=0x..."e_token=0x... (all three together, otherwise 400) |
# Which chains publish pairs right now
curl -s "$RAVE_API/v2/markets/levels" -H "Authorization: Bearer ***" \
| jq '[.pairs[].chain_id] | group_by(.) | map({chain_id: .[0], pairs: length})'Each side's quoteability carries status, tradable, size limits and input_capability (see Variable Input). allowance_target is not on levels; read it from /v2/limits. Do not route against a pair where available is false.
Limits
GET /v2/limits is the pre-quote gate. Each assets[] entry is one asset on one chain; the chain is token.chain_id. Filter with symbol and chain_id.
| Field (per side) | Meaning |
|---|---|
status, tradable | Whether you can request a firm quote now. reason and reason_code explain a closed side |
limits.min_input_amount, limits.max_input_amount | Human-readable { amount, decimals, token }. "3" with 18 decimals is 3000000000000000000 raw |
minimums_known | Whether the side publishes an established executable minimum; false means unknown, not unavailable |
limits.min_cash_notional | Minimum { amount, currency } in the pair's quote-token currency; amount can be absent/null when unknown |
limits.min_notional, limits.max_notional, current_max_notional | USD { amount, currency }; the legacy min_notional can be null, so do not substitute it for min_cash_notional |
remaining_capacity | capacity_status, current_quoteable_notional, executions, max_executions. The same counts are also flattened onto the side as remaining_executions and max_executions |
allowance_target, requires_allowance | The address the taker approves before a firm quote |
curl -s "$RAVE_API/v2/limits?symbol=BASE_SYMBOL&chain_id=$CHAIN_ID" -H "Authorization: Bearer ***" \
| jq '.assets[] | {symbol, chain_id: .token.chain_id, status: .sides.buy.status, tradable: .sides.buy.tradable, min_input: .sides.buy.limits.min_input_amount, max_input: .sides.buy.limits.max_input_amount, remaining_executions: .sides.buy.remaining_executions}'Session-wide capacity is in the top-level session object (status, remaining_quotes, max_quotes, reason_code). Its fields can be null when the snapshot is unavailable. Check tradable first: a closed side can have null or "0" bounds.
For both levels and limits, read the side's minimums_known separately from availability. false means the executable minimum is unknown in the published sizing envelope; it does not close an otherwise tradable side or establish an executable zero-sized order. Minimum amounts can be null; legacy token-amount objects and aggregate min_base_amount can instead carry "0" as an open lower bound when source minimums are unknown. Do not invent a minimum from that carrier or from the first depth level. Request a positive, representable amount within the published maximum and let the firm quote establish acceptance. A known zero policy floor still requires token precision, fees, funds, depth and settlement checks. If the flag is absent, retain compatibility with the published bounds rather than assuming it is false. These trading bounds are separate from the signed variable-input settlement window.
Market status
GET /v2/markets/status returns camelCase session state: isOpen, status, marketStatus, offhoursIsOpen, a nested snake_case market snapshot, sessionLimits, assetTradability ([{ symbol, tradable }]) for the session named by assetTradabilitySession, nextOpen, nextClose, nextOpenSession and updatedAt.
Tokenized stocks trade in sessions (premarket, regular, postmarket, overnight). A pair can stay quotable in /v2/markets/levels while /v2/markets/status reports the regular session closed. Gate each trade on the pair's own side, quoteability.<side>.tradable or sides.<side>.tradable, and show nextOpen when a side is closed.
Units
| Raw base units (strings) | Human-readable decimals |
|---|---|
Quote amount, amount_in, amount_out | Levels base_amount, quote_amount |
Any field ending in _raw | Limits min_input_amount.amount, max_input_amount.amount |
Stream prices[] values |
A multi-chain asset appears once per chain_id. Key on (symbol, chain_id) or the token address, never on symbol alone.
Updated 6 days ago