GET /cex-dex/{token}
GET /cex-dex/{token}
Section titled “GET /cex-dex/{token}”The divergence between Coinbase’s price for a token and an on-chain price, from a snapshot the scanner
refreshes every 5 minutes. The on-chain side is Chainlink where a feed exists; dex_source says which
source it was.
This endpoint can be withdrawn: while Coinbase-derived data is switched off it answers 503 and quotes no price.
Request
Section titled “Request”GET https://api.cerebruspulse.xyz/cex-dex/{token}Path Parameters
Section titled “Path Parameters”| Parameter | Type | Required | Description |
|---|---|---|---|
token | string | Yes | Token symbol, case-insensitive. Aliases: WETH → ETH, WBTC → BTC, BITCOIN → BTC, ETHEREUM → ETH. The snapshot on 2026-09-24 covered 15 tokens: AAVE, ARB, AVAX, BTC, CRV, DOGE, ETH, FIL, LINK, NEAR, OP, SEI, SOL, SUI, UNI. Another token gets a 400 listing the available ones, not charged. |
Response
Section titled “Response”| Field | Type | Description |
|---|---|---|
endpoint | string | cex-dex |
token | string | The token, after aliases |
timestamp_iso | string | When the snapshot was taken (ISO 8601) |
divergence.cex_price | number | Coinbase price (USD) |
divergence.dex_price | number | The on-chain price (USD) |
divergence.dex_source | string | Where dex_price came from: chainlink, or a fallback such as coinbase or defillama |
divergence.spread_bps | number | The divergence in basis points, as the scanner reports it |
divergence.spread_pct | number | The same in percent |
divergence.direction | string | cex_premium or dex_premium |
divergence.interpretation | string | The direction in words |
meta | object | Common metadata (Response Schemas); data_age_seconds is the snapshot’s age, and above 600 seconds meta.warning is stale_data |
meta.offering | string | pulse_cex_dex |
meta.refresh_interval_minutes | number | 5 |
meta.cex_source | string | coinbase |
Example
Section titled “Example”GET /cex-dex/ETH: real engine output on market data captured at 2026-09-24 17:05 UTC. Lists are cut to 3 items. Live responses may also carry meta.disclaimer, which the gateway adds.
{ "endpoint": "cex-dex", "token": "ETH", "timestamp_iso": "2026-09-24T16:59:05.418496+00:00", "divergence": { "cex_price": 2687.75, "dex_price": 2686.6836, "dex_source": "chainlink", "spread_bps": 4, "spread_pct": 0.04, "direction": "cex_premium", "interpretation": "CEX trading at premium to DEX" }, "meta": { "provider": "Cerebrus Pulse", "offering": "pulse_cex_dex", "execution_ms": 0, "data_age_seconds": 355.4, "refresh_interval_minutes": 5, "cex_source": "coinbase", "sources": [ { "name": "Coinbase Exchange", "url": "https://www.coinbase.com" }, { "name": "Chainlink Data Feeds (Arbitrum One)", "url": "https://data.chain.link" } ] }}Errors
Section titled “Errors”| Status | Reason |
|---|---|
| 400 | Invalid symbol (before any price is quoted), or a token the snapshot does not cover (not charged) |
| 402 | Payment required (the standard x402 flow) |
| 429 | Rate limit exceeded |
| 503 | Withdrawn, service disabled, payments down, or the CEX-DEX feed is missing or stale; no price is quoted |
| 504 | Engine timeout (not charged) |
The /screener carries the same divergence per market in cex_dex_spread_bps.