api
Everything the app shows comes from this api, and all of it is public. There's no key and no sign-up. The full schema is at /openapi.json.
The api lives at https://api.isomer.finance. The examples use $API; if you run isomer yourself, point it at http://localhost:4000 instead.
API=https://api.isomer.finance
the rules#
- No auth. Every endpoint is public.
- 60 requests a minute per ip. Past that you get
429with aretry-afterheader in seconds. - Every response has
asOf, the time it was produced. Prices also carry the time of the trade or quote they came from, so you can tell how fresh each one is. - Every price is in usd per share of the underlying stock, already converted with the wrapper's live multiplier.
- Errors look like
{"error": "unknown_ticker", "message": "isomer doesn't track ABC.", "asOf": "…"}: a code for programs and a sentence for people.
stocks and prices#
GET /v1/stocks returns every stock with each wrapper's latest price and the max basis.
curl "$API/v1/stocks"
GET /v1/stocks/:ticker adds the full basis matrix, the underlying's last close and any chain whose indexer is behind.
curl "$API/v1/stocks/TSLA"
A wrapper's price is null when it hasn't traded or been quoted in the last 5 minutes. thirdParty: true marks a price from DexScreener, which is shown for reference and never part of the basis.
basis history#
GET /v1/basis/:ticker/history is max basis over time, one point per bucket. from and to are ISO timestamps (default: the last 24 hours); interval is 1m, 5m, 15m, 1h or 1d (default 5m). One response holds at most 10,080 points; ask for a coarser interval past that.
curl "$API/v1/basis/TSLA/history?interval=1h&from=2026-10-14T00:00:00Z"
GET /v1/basis/history is the same for every stock at once. Add format=csv to either for a file with the columns ts,ticker,max_basis_bps,wrappers_priced:
curl -o basis.csv "$API/v1/basis/history?interval=5m&format=csv&from=2026-10-14T00:00:00Z"
the registry#
GET /v1/registry is the whole wrapper registry: chains, issuers, stocks and wrappers, with sources.
GET /v1/registry/:symbol/events lists the multiplier changes we've seen, newest first, with each wrapper's multiplier now. :symbol is a stock (NFLX, every NFLX wrapper) or one wrapper's symbol (NFLXx).
curl "$API/v1/registry/NFLX/events"
quotes#
POST /v1/quote builds a route. from and to are wrapper ids (issuer:STOCK:chain), amount is in whole tokens as a decimal string, slippageBps applies per leg, and wallets holds the addresses that will sign.
curl -X POST "$API/v1/quote" -H 'content-type: application/json' -d '{
"from": "xstocks:TSLA:solana",
"to": "ondo:TSLA:ethereum",
"amount": "1",
"slippageBps": 50,
"wallets": { "solana": "<your solana address>", "evm": "<your evm address>" }
}'
The response lists the legs with expected and minimum outputs, fees and an unsigned transaction for the first leg. A later leg's tx is null until the leg before it has landed; then fetch it with GET /v1/quote/:id/legs/:index/tx?after=<previous tx hash>. It answers 409 while the previous leg is still on its way. See how routing works for why.
live updates#
WS /v1/live pushes prices and basis as they change. Subscribe to up to 20 tickers:
websocat "${API/http/ws}/v1/live"
{"type":"subscribe","tickers":["TSLA","NVDA"]}
You'll receive two kinds of message:
{"type":"price","price":{"wrapperId":"xstocks:TSLA:solana","price":381.4,"volume24hUsd":182000,"asOf":"…","thirdParty":false}}
{"type":"basis","ticker":"TSLA","maxBasisBps":12.4,"asOf":"…"}