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/ngn and USD/NGN are 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/ask are indicative. They are not a lock-in price — pass an amount to POST /v1/quotes to 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.