API reference

Venues

One endpoint, and it exists for two reasons: Derive sends no CORS header so a browser cannot read it directly, and its raw list contains four times as many currencies as actually have options.

GET /venues/derive/currencies#

No parameters. Proxies Derive's public/get_all_currencies, filters it, and reports both counts so the size of the filter is visible rather than implied.

GET /venues/derive/currencies
{
  "currencies": [
    { "currency": "VVV",  "instrumentTypes": ["perp", "option"] },
    { "currency": "SOL",  "instrumentTypes": ["perp", "option", "erc20"] },
    { "currency": "XRP",  "instrumentTypes": ["perp", "option"] },
    { "currency": "ADA",  "instrumentTypes": ["perp", "option"] },
    { "currency": "ETH",  "instrumentTypes": ["perp", "option", "erc20"] },
    { "currency": "SNX",  "instrumentTypes": ["option", "erc20"] },
    { "currency": "CC",   "instrumentTypes": ["perp", "option"] },
    { "currency": "XAUT", "instrumentTypes": ["perp", "option", "erc20"] },
    { "currency": "PUMP", "instrumentTypes": ["perp", "option"] },
    { "currency": "LIT",  "instrumentTypes": ["perp", "option"] },
    { "currency": "HYPE", "instrumentTypes": ["perp", "option", "erc20"] },
    { "currency": "ZEC",  "instrumentTypes": ["perp", "option"] },
    { "currency": "AAVE", "instrumentTypes": ["perp", "option", "erc20"] },
    { "currency": "BTC",  "instrumentTypes": ["perp", "option", "erc20"] }
  ],
  "source": "derive:public/get_all_currencies",
  "filter": "instrument_types contains \"option\"",
  "currencyCount": 14,
  "upstreamCurrencyCount": 68,
  "asOf": "2026-09-23T01:33:35.734Z"
}
FieldMeans
currenciesthe filtered list, in upstream order
instrumentTypesDerive's own instrument_types for that currency, passed through unmodified. Values observed: perp, option, erc20.
filterthe predicate applied, stated in the response
currencyCounthow many survived the filter, currently 14
upstreamCurrencyCounthow many Derive returned, currently 68
asOfwhen the proxy fetched it. There is no long-lived cache.

The filter, and why nothing is hardcoded#

A launch wizard offering an options venue needs the list of underlyings that actually have options, and Derive's raw currency list is much broader than that: it includes currencies that only have perpetuals or only exist as ERC-20 collateral. Showing all 68 would offer choices that cannot be traded as options.

The predicate is applied live, not from a list someone typed

The filter is literally "instrument_types contains option", evaluated on whatever Derive returns at request time. If Derive lists a new options underlying tomorrow, it appears here with no code change, and if one is delisted it disappears. Nothing is hardcoded, and both counts are reported so the filter's effect can be seen.

Reporting upstreamCurrencyCount alongside currencyCount also makes an upstream outage obvious: a response with 68 upstream and 14 filtered is healthy, and one with 0 upstream is Derive failing, not everything being delisted.

Which Derive this is#

This endpoint proxies v2, while the rest of the indexer reads v3

The upstream is api.lyra.finance, which is Derive v2, settling on Derive chain 957. The equity poller, the coin handler and the status handler all read v3 at api.derive.xyz/v3 instead. That split is not a decision anybody made, so the 14 underlyings above are v2's list even though a Stags account would live on v3.

An earlier version of this page said v3 had no live options book and that options would therefore ship on v2. That was wrong, and the error was ours: the probe called a v2 endpoint name against v3, where it answers 404, and counted every 404 as an absent market. v3 carries live option markets on ETH, BTC and SOL and scoped session keys.

It changes nothing about custody today, because no Stags options vault exists on either deployment: Derive's own subaccount and session-key endpoints are failing. The program-level property is unchanged either way, since nothing on Solana lets the agent name a destination. Both halves are on the safety model, with the venue detail on venues.

There is no Hyperliquid equivalent#

Hyperliquid's info endpoint is readable from a browser directly, so nothing needs proxying for it, and there is no asset-list route here. The indexer does poll Hyperliquid for equity readings, which surface on /coins/:mint/positions and /status rather than as a venue catalogue.

One Hyperliquid constraint worth knowing when sizing a deployment, quoted from its own API documentation: orders carry a $10 minimum order value. It is notional, so leverage counts toward it, and it is per order rather than per position. Derive's equivalents are per-instrument and are covered on risk in options.