Subscribing
Once connected, subscribe to the pairs you want. You receive an acknowledgement, an optional snapshot, and then update frames as prices move.
This protocol is identical on both the indicative (
/v1/rates) and OTC (/v1/otc-rates) feeds — only the available symbols differ.
Subscribe
{
"method": "subscribe",
"params": {
"channel": "ticker",
"symbol": ["USD/NGN", "BTC/USD"],
"snapshot": true
},
"req_id": 1
}
| Field | Type | Required | Description |
|---|---|---|---|
method |
string | Yes | "subscribe" |
params.channel |
string | Yes | "ticker" |
params.symbol |
string[] | Yes | One or more BASE/QUOTE pairs (see Supported pairs). Case-insensitive. |
params.snapshot |
boolean | No | Send the current price immediately after subscribing. Default true. |
req_id |
integer | No | Echoed back on the ack so you can correlate the response. |
Symbols are normalized to uppercase, so
usd/ngnandUSD/NGNare equivalent.
Acknowledgement
{
"method": "subscribe",
"result": { "channel": "ticker", "symbol": ["USD/NGN", "BTC/USD"], "snapshot": true },
"success": true,
"req_id": 1
}
result.symbol lists the symbols that were accepted. Any unsupported symbol produces a separate unknown_symbol error (see Errors & Limits); the rest still succeed.
Snapshot
If snapshot was true, the current price for each accepted pair arrives in one frame:
{
"channel": "ticker",
"type": "snapshot",
"data": [
{ "symbol": "USD/NGN", "bid": 1683.42, "ask": 1700.10, "server_time": "2026-05-25T13:28:53.194Z" },
{ "symbol": "BTC/USD", "bid": 76635.35498, "ask": 77871.48996, "server_time": "2026-05-25T13:28:53.249Z" }
]
}
Update
Prices are re-checked roughly every 10 seconds and a frame is sent only when bid/ask changes (you won't receive a frame for an unchanged price). Active pairs update more often as the market moves:
{
"channel": "ticker",
"type": "update",
"data": [
{ "symbol": "BTC/USD", "bid": 76651.62430, "ask": 77888.02169, "server_time": "2026-05-25T13:29:40.021Z" }
]
}
| Field | Type | Description |
|---|---|---|
symbol |
string | The pair, canonical BASE/QUOTE |
bid |
number | Price to sell BASE, in QUOTE — includes your account's pricing |
ask |
number | Price to buy BASE, in QUOTE — includes your account's pricing |
server_time |
string | When the gateway sent the frame (ISO 8601) |
bid/askare indicative. They are not a lock-in price — pass an amount toPOST /v1/quotesto get an executable rate.
Unsubscribe
{
"method": "unsubscribe",
"params": { "channel": "ticker", "symbol": ["BTC/USD"] },
"req_id": 2
}
Acknowledgement:
{
"method": "unsubscribe",
"result": { "channel": "ticker", "symbol": ["BTC/USD"] },
"success": true,
"req_id": 2
}
You stop receiving update frames for the unsubscribed pairs. Other subscriptions are unaffected.