Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.dexpaprika.com/llms.txt

Use this file to discover all available pages before exploring further.

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

ServiceURLNotes
REST APIhttps://api.dexpaprika.comJSON responses, no auth
Streaming APIhttps://streaming.dexpaprika.comSSE only on /stream path. Bare URL returns {"message":"Not Found"} (404)
Streaming docshttps://docs.dexpaprika.com/streaming/introductionHuman-readable docs

Pagination (applies to ALL list endpoints)

  • Pages are 1-indexed. page=0 is silently treated as page=1.
  • Max limit is 100. Values >100 return HTTP 400 (rejected, not capped).
  • Exception: /pools/filter uses wrapper key results instead of pools.
All paginated responses include:
"page_info": {
  "limit": 10,
  "page": 1,
  "total_items": 7838,
  "total_pages": 784
}

Endpoints

GET /networks

Response: Flat array (no wrapper, no page_info).
[
  {"id": "ethereum", "display_name": "Ethereum"},
  {"id": "solana", "display_name": "Solana"}
]
  • 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).
{
  "chains": 33,
  "factories": 205,
  "pools": 28185674,
  "tokens": 25916463
}
  • 4 keys: chains, factories, pools, tokens
  • Key is factories, NOT dexes — this is the DEX/factory count

GET /search?query=

Response: Object with 3 array keys.
{
  "tokens": [...],
  "pools": [...],
  "dexes": [...]
}
  • Case-insensitive
  • Empty query → 400
  • Token result shape (15 keys):
KeyTypeNotes
idstringContract address
namestring
symbolstring
chainstringNetwork ID
typestringOften empty
statusstringe.g. "visible"
decimalsnumber
total_supplynumber
descriptionstring
websitestring
explorerstring
price_usdnumber
liquidity_usdnumber
volume_usdnumber
price_usd_changenumber
  • 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)
NOTE: Search token shape is DIFFERENT from token details shape. Search tokens do NOT have has_image, added_at, price_stats, summary, or last_updated.

GET /networks//tokens/

Response: Flat object (no wrapper). Top-level keys (13 total):
KeyTypeNotes
idstringContract address
namestring
symbolstring
chainstring
decimalsnumber
total_supplynumber
descriptionstring
websitestring
has_imageboolean
added_atstringISO 8601
price_statsobjectSee below
summaryobjectSee below
last_updatedstringISO 8601
price_stats (4 keys):
KeyType
high_24hnumber
low_24hnumber
athnumber
ath_datestring
summary (13 keys):
KeyType
chainstring
idstring
price_usdnumber
fdvnumber
liquidity_usdnumber
poolsnumber
24hobject
6hobject
1hobject
30mobject
15mobject
5mobject
1mobject
Price is at: 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):
KeyTypeNotes
volumenumberVolume in token units
volume_usdnumberVolume in USD
sellsnumberPlural with ‘s’
buysnumberPlural with ‘s’
txnsnumberTotal transactions
buy_usdnumber
sell_usdnumber
last_price_usd_changenumberPercentage
CRITICAL: Fields are 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).
[
  {"chain": "ethereum", "id": "0xc02a...", "price_usd": 1975.75},
  {"chain": "ethereum", "id": "0xa0b8...", "price_usd": 1.0001}
]
  • 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 tokens param

GET /networks//pools

Response: {pools: [...], page_info: {...}} Parameters:
ParamValuesDefault
page1-indexed integer1
limit1-10010
order_byvolume_usd, price_usd, transactions, last_price_change_usd_24h, created_atvolume_usd
sortasc, descdesc
Pool item keys (14 total):
KeyTypeNotes
idstringPool contract address
chainstring
dex_idstring
dex_namestring
feenumber
created_atstringISO 8601
created_at_block_numbernumber
volume_usdnumber
transactionsnumber
price_usdnumber
last_price_change_usd_5mnumber/nullCan be null
last_price_change_usd_1hnumber/nullCan be null
last_price_change_usd_24hnumber/nullCan be null
tokensarrayToken summary objects

GET /networks//pools/filter

Response: {results: [...], page_info: {...}} Note: wrapper key is results, not pools. Parameters:
ParamTypeDescriptionDefault
pageinteger1-indexed1
limitinteger1-10050
volume_24h_minnumberMin 24h volume USD
volume_24h_maxnumberMax 24h volume USD
txns_24h_minintegerMin transactions 24h
created_afterintegerUNIX timestamp
created_beforeintegerUNIX timestamp
sort_bystringvolume_24h, txns_24h, created_atvolume_24h
sort_dirstringasc, descdesc
Non-functional params (accepted but return 0 results): volume_7d_min, volume_30d_min, liquidity_usd_min, liquidity_usd_max All filters combine with AND logic. Filter result item keys (7 total):
KeyTypeNotes
addressstringNot id — different from pool listing
chainstring
dex_idstring
volume_usd_24hnumberNot volume_usd — different name
liquidity_usdnumber
txns_24hnumberNot transactions — different name
created_atstringISO 8601
IMPORTANT field name differences from /pools listing:
/pools listing/pools/filter results
idaddress
volume_usdvolume_usd_24h
transactionstxns_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):
KeyType
idstring
chainstring
dex_idstring
dex_namestring
factory_idstring
feenumber
created_atstring
created_at_block_numbernumber
last_pricenumber
last_price_usdnumber
price_timestring
price_statsobject
token_reservesobject
tokensarray
24hobject
6hobject
1hobject
30mobject
15mobject
5mobject

GET /networks//pools//ohlcv

Response: Flat array (no wrapper). Parameters:
ParamTypeRequiredNotes
startstringYesISO 8601 or UNIX timestamp
endstringNoMax 1 year from start
limitintegerNoMax 366. Values >366 return 400.
intervalstringNo1m, 5m, 10m, 15m, 30m, 1h, 6h, 12h, 24h
inversedbooleanNoFlip price ratio
Missing start → 400. Candle keys (7 total):
KeyType
time_openstring
time_closestring
opennumber
highnumber
lownumber
closenumber
volumenumber

GET /networks//pools//transactions

Response: {transactions: [...], page_info: {...}} Parameters:
ParamDefaultNotes
page11-indexed
limit20Max 100
cursorTransaction ID for deep pagination
Max 100 pages via page param. Use cursor for deeper. Transaction item keys (24 total):
KeyType
idstring
log_indexnumber
transaction_indexnumber
factory_idstring
pool_idstring
chainstring
canonical_chainstring
senderstring
recipientstring
token_0string
token_0_symbolstring
token_1string
token_1_symbolstring
amount_0number
amount_1number
volume_0number
volume_1number
price_0number
price_0_usdnumber
price_1number
price_1_usdnumber
created_at_block_numbernumber
created_at_block_hashstring
created_atstring

GET /networks//tokens//pools

Response: {pools: [...], page_info: {...}} Parameters:
ParamDefaultNotes
page11-indexed
limit10
order_byvolume_usdSame options as pool listing
sortdesc
addressFilter to pools paired with this second token
reorderfalseMake 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):
KeyType
dex_idstring
dex_namestring
chainstring
protocolstring

GET /networks//dexes//pools

Response: {pools: [...], page_info: {...}} Same pool item shape as /networks/{network}/pools.

Streaming API

Two SSE feeds on streaming.dexpaprika.com:
PathPurpose
/sse/pricesReal-time token prices (~1s cadence per asset)
/sse/reservesBlock-level pool reserve updates with pre-attached USD prices
/streamDeprecated alias for /sse/prices. Still accepted; emits a warning event on connect. Will be removed.
/reserves/streamRetired. Now returns 404; use /sse/reserves.

GET /sse/prices (single token)

GET https://streaming.dexpaprika.com/sse/prices?method=token_price&chain={network}&address={token_address}

POST /sse/prices (multiple tokens, up to 25)

POST https://streaming.dexpaprika.com/sse/prices
Content-Type: application/json
Accept: text/event-stream

[
  {"chain": "ethereum", "address": "0xc02a...", "method": "token_price"},
  {"chain": "solana",   "address": "So111...", "method": "token_price"}
]

GET /sse/reserves (single pool or token)

GET https://streaming.dexpaprika.com/sse/reserves?method=pool_reserves&chain={network}&address={pool_address}
GET https://streaming.dexpaprika.com/sse/reserves?method=token_reserves&chain={network}&address={token_address}

POST /sse/reserves (multiple, up to 25)

POST https://streaming.dexpaprika.com/sse/reserves
Content-Type: application/json
Accept: text/event-stream

[
  {"chain": "ethereum", "address": "0x88e6...", "method": "pool_reserves"},
  {"chain": "ethereum", "address": "0xa0b8...", "method": "token_reserves"}
]

SSE event format

event: token_price
data: {"address":"0xc02a...","chain":"ethereum","price":"2255.59","timestamp":1778847592,"timestamp_price":1778847592,"token_price":1778847592}
Note: Both event:/data: orderings within a single SSE message are valid per the spec, and the server has emitted either during rollout. Parsers must buffer one message at a time (split on blank line) and dispatch on the parsed event type, not on field order.
Field (token_price)TypeDescription
addressstringToken address
chainstringChain ID
pricestringPrice in USD. String, not number. Parse as decimal.
timestampintegerServer send time (unix seconds)
timestamp_priceintegerPrice observation time (unix seconds)
token_priceintegerAlias of timestamp_price
Other event types you may receive on either feed:
EventPayloadMeaning
reserve_update{chain, pool_id, block, previous_block, tokens[], total_reserve_usd, total_delta_usd}Pool reserves changed on the latest block
ping{"time": <unix>}Keep-alive, every ~15s
warning{"message": "..."}Non-fatal notice (deprecation, etc.)
error{"message": "..."}Stream-terminating error
t_p{a, c, p, t, t_p}Deprecated compact price shape returned by method=t_p

Streaming constraints

  • Max 25 subscriptions per POST connection. 26+ entries get rejected with HTTP 400. The two endpoints use different rejection wording:
    • POST /sse/prices{"message":"too many assets, max 25 allowed"}
    • POST /sse/reserves{"message":"too many subscriptions"}
  • Max 10 concurrent SSE streams per IP. 11th returns 429 {"message":"ip stream limit exceeded"}.
  • Ping interval: 15 seconds (event: ping). Use a missing ping as a connection-liveness signal.
  • All assets must be valid — one invalid asset cancels the entire stream with HTTP 400.
  • First reserve events on a quiet pool may take seconds-to-minutes (events arrive only on actual on-chain changes).
  • Treat unknown event names as no-ops.

Streaming errors

StatusCauseMessage
200ConnectedStream begins
400Bad chain{"message":"unsupported chain"}
400Bad address{"message":"asset not found"}
400Invalid asset in batch{"message":"unsupported chain"} (entire stream cancelled)
400Too many entries in POST body to /sse/prices (26+){"message":"too many assets, max 25 allowed"}
400Too many entries in POST body to /sse/reserves (26+){"message":"too many subscriptions"}
404Bare URL, wrong path, or retired /reserves/stream{"message":"Not Found"}
429IP stream limit{"message":"ip stream limit exceeded"}
In-stream errors arrive as SSE: event: error + data: {"message": "..."}. Deprecations and other non-fatal notices arrive as event: warning.

Error handling (REST)

StatusCauseExample
200SuccessNormal response
400Invalid paramsBad order_by, sort, sort_by, empty query, limit >100, OHLCV limit >366, >10 batch tokens
404Not foundInvalid network, token, or pool address
410DeprecatedGET /pools (use /networks/{network}/pools)
429Rate limit10,000 req/day exceeded
500Server errorRetry with backoff

Constraints summary

ConstraintValueEnforcement
Rate limit10,000 requests/day
Pagination max per page100400 if exceeded
Pagination indexing1-indexedpage=0 treated as page=1
Batch prices max tokens10400 if exceeded
OHLCV max data points366400 if exceeded
OHLCV max range1 year
Transaction max pages100Use cursor for deeper
Streaming max assets/request2,000
Streaming global concurrent10,000 per server

Common token addresses

TokenChainAddress
WETHethereum0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
USDCethereum0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
USDTethereum0xdac17f958d2ee523a2206206994597c13d831ec7
USDCpolygon0x2791bca1f2de4661ed88a30c99a7a9449aa84174
SOLsolanaSo11111111111111111111111111111111111111112

Key gotchas for implementers

  1. sells/buys not sell/buy — plural forms only in token summary time windows
  2. summary.main_pool does not exist — to find a token’s best pool, query /tokens/{address}/pools?order_by=volume_usd&sort=desc&limit=1
  3. Filter uses different field names than pool listing: address not id, volume_usd_24h not volume_usd, txns_24h not transactions
  4. Filter wrapper key is results, not pools
  5. Stats key is factories, not dexes
  6. Pages are 1-indexed everywhere — page=0 is silently normalized to page=1
  7. Limits are enforced, not capped — limit=200 returns 400, not 100 results
  8. Streaming p is a string — parse as decimal for precision, do not treat as JSON number
  9. Streaming bare URL is 404 — only /stream path works
  10. Search token shape ≠ token details shape — different fields at top level
  11. OHLCV is the only flat-array list response — all other list endpoints wrap in {key: [...], page_info: {...}}
  12. DEXes endpoint page_info is buggy — may show total_items: 0 while returning all results
  13. Non-functional filter params (volume_7d_min, volume_30d_min, liquidity_usd_min, liquidity_usd_max) are accepted but always return 0 results
  14. First streaming events may take 10-20 seconds — don’t use short timeouts