Skip to main content

DexPaprika API

Free API for on-chain DEX data and real-time price streaming. 33+ blockchains, 25M+ tokens, 27M+ pools. No API key, no authentication.
ServiceBase URLPurpose
REST APIhttps://api.dexpaprika.comToken data, pools, OHLCV, transactions, search
Streaming APIhttps://streaming.dexpaprika.comReal-time price updates via SSE (~1s intervals). Full docs
CLIcurl -sSL .../install.sh | shTerminal tool wrapping the full API. Install: curl -sSL https://raw.githubusercontent.com/coinpaprika/dexpaprika-cli/main/install.sh | sh
All examples use curl, but any HTTP client works. The CLI (dexpaprika-cli) wraps every endpoint into simple commands with --output json --raw for scripting. REST responses are JSON. Streaming responses are Server-Sent Events.

Core concepts

Network IDs are lowercase chain identifiers: ethereum, solana, bsc, arbitrum, base, polygon, optimism, avalanche, etc. Get the full list from GET /networks. Token addresses are the on-chain contract addresses (e.g., 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 for WETH on Ethereum, So11111111111111111111111111111111111111112 for SOL on Solana). Pool addresses are the on-chain liquidity pool contract addresses. Find them via token pools or network pools endpoints. If you don’t know the network or address for a token, use search first.

Endpoints

Search (start here when you don’t have addresses)

GET /search?query={query}
Search tokens, pools, and DEXes by name, symbol, or address. Case-insensitive. Use this to resolve “what’s the ETH price” into the actual network + address you need. Example: Find Jupiter token
curl "https://api.dexpaprika.com/search?query=jupiter"

Token price and details

GET /networks/{network}/tokens/{token_address}
Returns name, symbol, chain, decimals, USD price, fully diluted valuation, liquidity, and volume/transaction stats at multiple time windows (24h, 6h, 1h, 30m, 15m, 5m). The price is at response.summary.price_usd Example: Get SOL price
curl "https://api.dexpaprika.com/networks/solana/tokens/So11111111111111111111111111111111111111112"
Extract just the price:
curl -s "https://api.dexpaprika.com/networks/solana/tokens/So11111111111111111111111111111111111111112" | jq '.summary.price_usd'

Batch token prices

GET /networks/{network}/multi/prices?tokens={addr1},{addr2},{addr3}
Fetch USD prices for multiple tokens in one request. Comma-separated addresses, max 10 per request. Unknown or unpriced tokens are silently omitted from the response. Example: WETH + USDC on Ethereum
curl "https://api.dexpaprika.com/networks/ethereum/multi/prices?tokens=0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2,0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
Response is an array of {id, chain, price_usd} objects. Order is not guaranteed.

Top pools on a network

GET /networks/{network}/pools?page={1}&limit={10}&order_by={volume_usd}&sort={desc}
List top liquidity pools. Pages are 1-indexed, max 100 per page. Order by: volume_usd, price_usd, transactions, last_price_change_usd_24h, created_at. Example: Top 5 Ethereum pools by volume
curl "https://api.dexpaprika.com/networks/ethereum/pools?limit=5&order_by=volume_usd&sort=desc"

Advanced pool filtering (new)

GET /networks/{network}/pools/filter
Filter pools with range queries on volume, transactions, and creation date. This is the endpoint to use for building pool screeners, finding high-volume pools, or discovering recently created pools that meet specific criteria. Parameters:
ParameterTypeDescription
pageintegerPage number, 1-indexed (default: 1)
limitintegerItems per page, 1-100 (default: 50)
volume_24h_minnumberMin 24h volume in USD
volume_24h_maxnumberMax 24h volume in USD
txns_24h_minintegerMin transactions in last 24h
created_afterintegerUNIX timestamp — only pools created after this
created_beforeintegerUNIX timestamp — only pools created before this
sort_bystringvolume_24h (default), txns_24h, created_at
sort_dirstringasc or desc (default: desc)
Note: volume_7d_min, volume_30d_min, liquidity_usd_min, liquidity_usd_max exist in the spec but are not functional yet — they return empty results. All filters combine with AND logic. The response includes page_info with total_items and total_pages. Example: High-volume Ethereum pools (>$100k daily volume)
curl "https://api.dexpaprika.com/networks/ethereum/pools/filter?volume_24h_min=100000&sort_by=volume_24h&sort_dir=desc"
Example: Recently created Solana pools with activity
curl "https://api.dexpaprika.com/networks/solana/pools/filter?created_after=1709251200&txns_24h_min=50&sort_by=created_at&sort_dir=desc"

Pool details

GET /networks/{network}/pools/{pool_address}?inversed={false}
Returns liquidity, reserves, pricing, token pair info, and DEX metadata for a specific pool. Set inversed=true to flip the price ratio (token1/token0 instead of token0/token1).

Pool OHLCV (historical candlesticks)

GET /networks/{network}/pools/{pool_address}/ohlcv?start={timestamp}&interval={24h}&limit={30}
Historical price candlestick data. start is required (ISO 8601 or UNIX timestamp). Optional end (max 1 year from start). Intervals: 1m, 5m, 10m, 15m, 30m, 1h, 6h, 12h, 24h Max data points: 366 per request Example: Last 30 days of daily candles for a pool
curl "https://api.dexpaprika.com/networks/ethereum/pools/0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640/ohlcv?start=2025-01-01&interval=24h&limit=30"

Pool transactions

GET /networks/{network}/pools/{pool_address}/transactions?page={1}&limit={20}
Recent swaps, liquidity adds, and removes. Reverse chronological order. Pages 1-indexed, max 100 pages. For deep pagination, use cursor parameter (transaction ID) instead of page numbers. Each transaction includes: token amounts (amount_0, amount_1), volumes (volume_0, volume_1), USD prices (price_0_usd, price_1_usd), token symbols, sender/recipient, and timestamps.

Pools for a token

GET /networks/{network}/tokens/{token_address}/pools?order_by={volume_usd}&sort={desc}&limit={10}
Find all pools containing a specific token. Optional: add address parameter to filter to pools paired with a second specific token. Add reorder=true to make the queried token the primary token in all metrics.

DEXes on a network

GET /networks/{network}/dexes
List all DEXes on a network with their identifiers. Use the dex id to filter pools:
GET /networks/{network}/dexes/{dex}/pools

Networks

GET /networks
Returns all supported blockchain networks with their IDs. Use these IDs in all other endpoints.

Platform stats

GET /stats
High-level counts: total networks, DEXes, pools, and tokens. Useful for health checks.

Streaming API — Real-time prices via SSE

Stream live token prices with ~1 second update intervals. Uses Server-Sent Events (SSE) — works with any HTTP client that supports streaming. For full streaming docs, guides, and code examples see: https://docs.dexpaprika.com/streaming/introduction Base URL: https://streaming.dexpaprika.com (no landing page — only the /stream paths below work)

Stream a single token (GET)

curl -N "https://streaming.dexpaprika.com/stream?method=t_p&chain=ethereum&address=0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"

Stream multiple tokens (POST) — recommended for 2+ tokens

Send a JSON array of assets. Single connection, up to 2,000 tokens.
curl -N -X POST "https://streaming.dexpaprika.com/stream" \
  -H "Accept: text/event-stream" \
  -H "Content-Type: application/json" \
  -d '[
    {"chain": "solana", "address": "So11111111111111111111111111111111111111112", "method": "t_p"},
    {"chain": "ethereum", "address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "method": "t_p"}
  ]'
Each asset object requires chain (network ID), address (token contract), and method (always t_p for token price).

SSE event format

data: {"a":"0xc02a...","c":"ethereum","p":"2739.79","t":1769778188,"t_p":1769778187}
event: t_p
FieldMeaning
aToken address
cChain ID
pPrice in USD (string for precision — parse as decimal)
tServer send timestamp (UNIX seconds)
t_pPrice event timestamp (UNIX seconds)
Use now() - t for network latency, now() - t_p for total price data latency.

Python streaming example

import requests, json

assets = [
    {"chain": "ethereum", "address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "method": "t_p"},
    {"chain": "solana", "address": "So11111111111111111111111111111111111111112", "method": "t_p"}
]

r = requests.post("https://streaming.dexpaprika.com/stream",
    headers={"Accept": "text/event-stream", "Content-Type": "application/json"},
    json=assets, stream=True)

for line in r.iter_lines():
    if line and line.startswith(b'data:'):
        data = json.loads(line[5:])
        print(f"{data['c']} {data['a']}: ${data['p']}")

Streaming constraints

  • Max 2,000 assets per POST request
  • All assets must be valid — one invalid asset cancels the entire stream with HTTP 400
  • Global stream limit: 10,000 concurrent streams per server
  • Validate assets via REST /search before streaming
  • Use multiple smaller requests (100-500 each) rather than one massive request for better load distribution
  • Reconnect with exponential backoff on disconnect

Streaming errors

StatusMeaning
200Connected, streaming
400Bad params, unsupported chain, asset not found, or one invalid asset in batch
429Global stream limit exceeded — retry with backoff
Errors during an active stream arrive as SSE events: event: error + data: {"message": "..."}. Handle both HTTP errors (before stream starts) and SSE errors (during streaming).

Constraints and limits

REST API

  • Rate limit: 10,000 requests per day
  • Batch prices: max 10 tokens per request
  • Pagination: max 100 items per page
  • OHLCV: max 366 data points per request, max 1 year range
  • Transactions: max 100 pages of pagination
  • Pagination: all endpoints are 1-indexed (page=0 is silently treated as page=1)

Streaming API

  • Max assets per request: 2,000
  • Global concurrent streams: 10,000 per server
  • All assets must be valid or entire stream is cancelled

Error handling

StatusMeaningWhat to do
200SuccessParse JSON response
400Bad request (invalid params, too many tokens, bad sort field)Check parameter values and constraints above
404Network, token, or pool not foundVerify the network ID and address; use /search to find correct values
410Endpoint deprecated (old /pools)Use /networks/{network}/pools instead
429Rate limit exceededBack off and retry; consider caching responses
500Server errorRetry with backoff
When a batch price request contains only invalid tokens, you get HTTP 200 with an empty array — not an error.

Common workflows

”What’s the price of X?”

  1. GET /search?query=X to find the network and token address
  2. GET /networks/{network}/tokens/{address} to get price at .summary.price_usd

”Show me the top pools on Ethereum”

  1. GET /networks/ethereum/pools?limit=10&order_by=volume_usd&sort=desc

”Find new pools with high volume”

  1. GET /networks/{network}/pools/filter?created_after={unix_timestamp}&volume_24h_min=50000&sort_by=created_at&sort_dir=desc

”Get historical price data for a token”

  1. Find the token’s pools via GET /networks/{network}/tokens/{address}/pools?order_by=volume_usd&sort=desc&limit=1 (the highest-volume pool is the best source)
  2. GET /networks/{network}/pools/{pool_address}/ohlcv?start={date}&interval=24h&limit=30

”Compare prices of multiple tokens”

  1. GET /networks/{network}/multi/prices?tokens={addr1},{addr2},{addr3}

”Stream live price updates for a token”

  1. GET https://streaming.dexpaprika.com/stream?method=t_p&chain={network}&address={token_address}

”Build a real-time dashboard tracking multiple tokens”

  1. Validate tokens exist via REST: GET /search?query={name} or GET /networks/{network}/tokens/{address}
  2. POST https://streaming.dexpaprika.com/stream with JSON array of {chain, address, method: "t_p"} objects
  3. Parse SSE events, read price from p field (string — parse as decimal for precision)

“Monitor a token’s price with alerts”

  1. Stream the token via GET or POST to streaming.dexpaprika.com
  2. Compare each incoming p value against your threshold
  3. Reconnect with exponential backoff on disconnect

What this skill does NOT cover

  • CoinPaprika centralized exchange data — that’s a different API (api.coinpaprika.com)
  • Trading or swapping — DexPaprika is read-only; it does not execute trades

Full documentation