DexPaprika API — Verified Reference (2026-03-02)
Every claim in this document was verified against the live API with 72 tests, 72 pass, 0 failures.Base URLs
| Service | URL | Notes |
|---|---|---|
| REST API | https://api.dexpaprika.com | JSON responses, no auth |
| Streaming API | https://streaming.dexpaprika.com | SSE only on /stream path. Bare URL returns {"message":"Not Found"} (404) |
| Streaming docs | https://docs.dexpaprika.com/streaming/introduction | Human-readable docs |
Pagination (applies to ALL list endpoints)
- Pages are 1-indexed.
page=0is silently treated aspage=1. - Max
limitis 100. Values >100 return HTTP 400 (rejected, not capped). - Exception:
/pools/filteruses wrapper keyresultsinstead ofpools.
Endpoints
GET /networks
Response: Flat array (no wrapper, no page_info).- 33 networks as of 2026-03-02
- Each item: 2 keys —
id(string),display_name(string) - Common IDs:
ethereum,solana,bsc,arbitrum,base,polygon,optimism,avalanche
GET /stats
Response: Flat object (no wrapper).- 4 keys:
chains,factories,pools,tokens - Key is
factories, NOTdexes— this is the DEX/factory count
GET /search?query=
Response: Object with 3 array keys.- Case-insensitive
- Empty query → 400
- Token result shape (15 keys):
| Key | Type | Notes |
|---|---|---|
id | string | Contract address |
name | string | |
symbol | string | |
chain | string | Network ID |
type | string | Often empty |
status | string | e.g. "visible" |
decimals | number | |
total_supply | number | |
description | string | |
website | string | |
explorer | string | |
price_usd | number | |
liquidity_usd | number | |
volume_usd | number | |
price_usd_change | number |
- Pool result shape includes:
id,dex_id,dex_name,chain,created_at_block_number,created_at,volume_usd,transactions,price_usd,last_price_change_usd_5m(nullable),last_price_change_usd_1h(nullable),last_price_change_usd_24h(nullable),tokens(array)
has_image, added_at, price_stats, summary, or last_updated.
GET /networks//tokens/
Response: Flat object (no wrapper). Top-level keys (13 total):| Key | Type | Notes |
|---|---|---|
id | string | Contract address |
name | string | |
symbol | string | |
chain | string | |
decimals | number | |
total_supply | number | |
description | string | |
website | string | |
has_image | boolean | |
added_at | string | ISO 8601 |
price_stats | object | See below |
summary | object | See below |
last_updated | string | ISO 8601 |
price_stats (4 keys):
| Key | Type |
|---|---|
high_24h | number |
low_24h | number |
ath | number |
ath_date | string |
summary (13 keys):
| Key | Type |
|---|---|
chain | string |
id | string |
price_usd | number |
fdv | number |
liquidity_usd | number |
pools | number |
24h | object |
6h | object |
1h | object |
30m | object |
15m | object |
5m | object |
1m | object |
response.summary.price_usd
summary.main_pool does NOT exist. There is no main_pool field anywhere in this response.
Each time window object (8 keys, same shape for all intervals):
| Key | Type | Notes |
|---|---|---|
volume | number | Volume in token units |
volume_usd | number | Volume in USD |
sells | number | Plural with ‘s’ |
buys | number | Plural with ‘s’ |
txns | number | Total transactions |
buy_usd | number | |
sell_usd | number | |
last_price_usd_change | number | Percentage |
sells and buys (plural). NOT sell/buy (singular). The singular forms do not exist.
GET /networks//multi/prices?tokens=,
Response: Flat array (no wrapper, no page_info).- Each item: 3 keys —
chain,id,price_usd - Order is NOT guaranteed
- Max 10 tokens. 11+ returns 400 with
{"message":"max 10 tokens allowed."} - Invalid/unknown tokens are silently omitted (not an error)
- All-invalid tokens → HTTP 200 with empty array
[] - Comma-separated addresses in a single
tokensparam
GET /networks//pools
Response:{pools: [...], page_info: {...}}
Parameters:
| Param | Values | Default |
|---|---|---|
page | 1-indexed integer | 1 |
limit | 1-100 | 10 |
order_by | volume_usd, price_usd, transactions, last_price_change_usd_24h, created_at | volume_usd |
sort | asc, desc | desc |
| Key | Type | Notes |
|---|---|---|
id | string | Pool contract address |
chain | string | |
dex_id | string | |
dex_name | string | |
fee | number | |
created_at | string | ISO 8601 |
created_at_block_number | number | |
volume_usd | number | |
transactions | number | |
price_usd | number | |
last_price_change_usd_5m | number/null | Can be null |
last_price_change_usd_1h | number/null | Can be null |
last_price_change_usd_24h | number/null | Can be null |
tokens | array | Token summary objects |
GET /networks//pools/filter
Response:{results: [...], page_info: {...}}
Note: wrapper key is results, not pools.
Parameters:
| Param | Type | Description | Default |
|---|---|---|---|
page | integer | 1-indexed | 1 |
limit | integer | 1-100 | 50 |
volume_24h_min | number | Min 24h volume USD | — |
volume_24h_max | number | Max 24h volume USD | — |
txns_24h_min | integer | Min transactions 24h | — |
created_after | integer | UNIX timestamp | — |
created_before | integer | UNIX timestamp | — |
sort_by | string | volume_24h, txns_24h, created_at | volume_24h |
sort_dir | string | asc, desc | desc |
volume_7d_min, volume_30d_min, liquidity_usd_min, liquidity_usd_max
All filters combine with AND logic.
Filter result item keys (7 total):
| Key | Type | Notes |
|---|---|---|
address | string | Not id — different from pool listing |
chain | string | |
dex_id | string | |
volume_usd_24h | number | Not volume_usd — different name |
liquidity_usd | number | |
txns_24h | number | Not transactions — different name |
created_at | string | ISO 8601 |
/pools listing:
/pools listing | /pools/filter results |
|---|---|
id | address |
volume_usd | volume_usd_24h |
transactions | txns_24h |
GET /networks//pools/
Response: Flat object (no wrapper). Parameters:inversed (boolean, default: false) — flips the token pair price ratio.
Top-level keys (20 total):
| Key | Type |
|---|---|
id | string |
chain | string |
dex_id | string |
dex_name | string |
factory_id | string |
fee | number |
created_at | string |
created_at_block_number | number |
last_price | number |
last_price_usd | number |
price_time | string |
price_stats | object |
token_reserves | object |
tokens | array |
24h | object |
6h | object |
1h | object |
30m | object |
15m | object |
5m | object |
GET /networks//pools//ohlcv
Response: Flat array (no wrapper). Parameters:| Param | Type | Required | Notes |
|---|---|---|---|
start | string | Yes | ISO 8601 or UNIX timestamp |
end | string | No | Max 1 year from start |
limit | integer | No | Max 366. Values >366 return 400. |
interval | string | No | 1m, 5m, 10m, 15m, 30m, 1h, 6h, 12h, 24h |
inversed | boolean | No | Flip price ratio |
start → 400.
Candle keys (7 total):
| Key | Type |
|---|---|
time_open | string |
time_close | string |
open | number |
high | number |
low | number |
close | number |
volume | number |
GET /networks//pools//transactions
Response:{transactions: [...], page_info: {...}}
Parameters:
| Param | Default | Notes |
|---|---|---|
page | 1 | 1-indexed |
limit | 20 | Max 100 |
cursor | — | Transaction ID for deep pagination |
cursor for deeper.
Transaction item keys (24 total):
| Key | Type |
|---|---|
id | string |
log_index | number |
transaction_index | number |
factory_id | string |
pool_id | string |
chain | string |
canonical_chain | string |
sender | string |
recipient | string |
token_0 | string |
token_0_symbol | string |
token_1 | string |
token_1_symbol | string |
amount_0 | number |
amount_1 | number |
volume_0 | number |
volume_1 | number |
price_0 | number |
price_0_usd | number |
price_1 | number |
price_1_usd | number |
created_at_block_number | number |
created_at_block_hash | string |
created_at | string |
GET /networks//tokens//pools
Response:{pools: [...], page_info: {...}}
Parameters:
| Param | Default | Notes |
|---|---|---|
page | 1 | 1-indexed |
limit | 10 | |
order_by | volume_usd | Same options as pool listing |
sort | desc | |
address | — | Filter to pools paired with this second token |
reorder | false | Make queried token primary in all metrics |
GET /networks//dexes
Response:{dexes: [...], page_info: {...}}
Note: page_info exists but may show total_items: 0 (appears buggy). The limit param may be ignored — all DEXes are returned.
DEX item keys (4 total):
| Key | Type |
|---|---|
dex_id | string |
dex_name | string |
chain | string |
protocol | string |
GET /networks//dexes//pools
Response:{pools: [...], page_info: {...}}
Same pool item shape as /networks/{network}/pools.
Streaming API
GET /stream (single token)
POST /stream (multiple tokens, up to 2,000)
SSE event format
data: line comes BEFORE event: line.
| Field | Type | Description |
|---|---|---|
a | string | Token address |
c | string | Chain ID |
p | string | Price in USD. String, not number. Parse as decimal. |
t | integer | Server send timestamp (UNIX seconds) |
t_p | integer | Price data timestamp (UNIX seconds) |
Streaming constraints
- Max 2,000 assets per POST
- All assets must be valid — one invalid asset cancels entire stream with 400
- Global limit: 10,000 concurrent streams per server
- First events may take 10-20 seconds to arrive
- Events arrive ~1/second after initial connection
Streaming errors
| Status | Cause | Message |
|---|---|---|
| 200 | Connected | Stream begins |
| 400 | Bad chain | {"message":"unsupported chain"} |
| 400 | Bad address | {"message":"asset not found"} |
| 400 | Invalid asset in batch | {"message":"unsupported chain"} (entire stream cancelled) |
| 404 | Bare URL / wrong path | {"message":"Not Found"} |
| 429 | Global limit | Retry with backoff |
event: error + data: {"message": "..."}
Error handling (REST)
| Status | Cause | Example |
|---|---|---|
| 200 | Success | Normal response |
| 400 | Invalid params | Bad order_by, sort, sort_by, empty query, limit >100, OHLCV limit >366, >10 batch tokens |
| 404 | Not found | Invalid network, token, or pool address |
| 410 | Deprecated | GET /pools (use /networks/{network}/pools) |
| 429 | Rate limit | 10,000 req/day exceeded |
| 500 | Server error | Retry with backoff |
Constraints summary
| Constraint | Value | Enforcement |
|---|---|---|
| Rate limit | 10,000 requests/day | |
| Pagination max per page | 100 | 400 if exceeded |
| Pagination indexing | 1-indexed | page=0 treated as page=1 |
| Batch prices max tokens | 10 | 400 if exceeded |
| OHLCV max data points | 366 | 400 if exceeded |
| OHLCV max range | 1 year | |
| Transaction max pages | 100 | Use cursor for deeper |
| Streaming max assets/request | 2,000 | |
| Streaming global concurrent | 10,000 per server |
Common token addresses
| Token | Chain | Address |
|---|---|---|
| WETH | ethereum | 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 |
| USDC | ethereum | 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48 |
| USDT | ethereum | 0xdac17f958d2ee523a2206206994597c13d831ec7 |
| USDC | polygon | 0x2791bca1f2de4661ed88a30c99a7a9449aa84174 |
| SOL | solana | So11111111111111111111111111111111111111112 |
Key gotchas for implementers
sells/buysnotsell/buy— plural forms only in token summary time windowssummary.main_pooldoes not exist — to find a token’s best pool, query/tokens/{address}/pools?order_by=volume_usd&sort=desc&limit=1- Filter uses different field names than pool listing:
addressnotid,volume_usd_24hnotvolume_usd,txns_24hnottransactions - Filter wrapper key is
results, notpools - Stats key is
factories, notdexes - Pages are 1-indexed everywhere — page=0 is silently normalized to page=1
- Limits are enforced, not capped — limit=200 returns 400, not 100 results
- Streaming
pis a string — parse as decimal for precision, do not treat as JSON number - Streaming bare URL is 404 — only
/streampath works - Search token shape ≠ token details shape — different fields at top level
- OHLCV is the only flat-array list response — all other list endpoints wrap in
{key: [...], page_info: {...}} - DEXes endpoint
page_infois buggy — may showtotal_items: 0while returning all results - Non-functional filter params (
volume_7d_min,volume_30d_min,liquidity_usd_min,liquidity_usd_max) are accepted but always return 0 results - First streaming events may take 10-20 seconds — don’t use short timeouts