Pairs & Marks API
Which pairs does CRX list?
Every supported pair, with its live Pyth (Hermes) feed id. All are USD-base USD/XXX feeds. All settle in USDC. None deliver currency.
20 USD pairs. Every one settles in USDC against a live Pyth fixing — none deliver currency.
Pair Quote currency Live Pyth feed USD/BRL Reais 0xd2db4dbf1a…d7a95906USD/CAD Canadian dollars 0x3112b03a41…eaa2eccaUSD/CHF Francs 0x0b1e3297e6…a63e28f8USD/CLP Chilean pesos 0xd407a4b25c…cc3e84c7USD/CNH Yuan 0xeef52e09c8…2e332e66USD/COP Colombian pesos 0xcaffb53eda…ef4edf8dUSD/HKD Hong Kong dollars 0x19d75fde7f…b23aff4cUSD/IDR Rupiah 0x6693afcd49…b9207433USD/INR Rupees 0x0ac0f9a288…4fcf1809USD/JPY Yen 0xef2c98c804…3042fd52USD/KRW Won 0xe539120487…201be7e3USD/MXN Mexican pesos 0xe13b1c1ffb…866b77caUSD/NOK Kroner 0x235ddea9f4…596023a3USD/PEN Soles 0x5a90fd5841…b192446aUSD/PHP Pesos 0x2bda7f268b…9e0a68c9USD/SEK Kronor 0x8ccb376aa8…e43fc676USD/SGD Singapore dollars 0x396a969a9c…8bdb4918USD/TRY Lira 0x032a2eba1c…8744e058USD/TWD Taiwan dollars 0x489f02f2f1…fcd5a8e0USD/ZAR Rand 0x389d889017…97f493f1
Where does the pair set come from?
One config file: config/pairs.json. It is the single source of truth read by the frontend selector, the maker bot, the TWAP keeper, and the on-chain seeding script. Each entry carries:
| Field | Meaning |
|---|---|
symbol | The pair label, e.g. USD/INR. pairId = keccak256(symbol) on-chain. |
base / quote | Always USD base; quote is the foreign currency. |
feedId | The Pyth (Hermes) price feed id for the pair. |
schedule | The market-hours string driving the open/closed session gate. |
inverted | Always false. Every pair is a direct USD/XXX feed. |
How do I read the session for a pair?
From the schedule string in config/pairs.json. Its shape:
America/New_York;<Mon>,<Tue>,<Wed>,<Thu>,<Fri>,<Sat>,<Sun>;<holiday overrides>
- The first field is the venue timezone.
- Then seven per-weekday windows,
HHMM-HHMM.O= open all day,C= closed.&joins two windows in one day. - Then holiday overrides,
MMDD/<window-or-C>.
The gate shows a pair Open in-session and Closed out-of-session.
Some LatAm pairs only publish live during their local bank session. USD/CLP, USD/COP, and USD/PEN are Open in-session and Closed out-of-session — they are not dead, just session-windowed. The freshness overlay halts trading if an in-session feed stalls.
How do I read the live mark?
Two distinct prices — do not confuse them.
| Price | Source | Endpoint / read | Binding? |
|---|---|---|---|
| Indicative spot | Pyth Hermes | GET <hermes>/... direct (see below) | no |
| On-chain mark | per-pair FX oracle | on-chain _markRate, read over RPC | margin only |
| Fixing | FX oracle, on/after fixing date | on-chain, at settlement | yes |
- Indicative spot comes straight from Pyth Hermes, base
https://hermes.pyth.network(thehermesfield inconfig/pairs.json), keyed byfeedId. It refreshes every few seconds and is not firm. - On-chain mark is what the contract marks margin against. Read it over RPC from the per-pair FX oracle; it is fixed to
expo = −8. - Fixing is the single rate that settles the trade, read once at the fixing date.
The full distinction: Pricing & Rate Sources (~3 min).
The relayer does not serve a live-mark endpoint. The indicative spot is read from Pyth Hermes directly; the on-chain mark and fixing are read on-chain over RPC. There is no relayer GET /mark.
Which relayer endpoint relates to pairs?
One: margin, which takes a pair label.
| Method | Path | Auth | Params | Returns |
|---|---|---|---|---|
GET | /margin | no | pair (required), notional (required, quote units) | { "im": "4200.00" } — vol-scaled initial margin |
Pair labels passed to /margin, /rfq, and on-chain calls must match a symbol in config/pairs.json exactly.
Next: Positions & Settlement API (~3 min) — read positions, marks, PnL, and settlement state for an address.