DexPaprika streams parsed pool reserves over Server-Sent Events. Every time a swap or liquidity change lands in a pool you subscribed to, you receive aDocumentation Index
Fetch the complete documentation index at: https://docs.dexpaprika.com/llms.txt
Use this file to discover all available pages before exploring further.
reserve_update event containing the current reserve and delta for each token in the pool, the current USD price, the USD value of the change, and the block number. No polling. No log decoding. No competitor offers this as a push feed.
The DexPaprika differentiator
DexPaprika is the only provider that streams parsed pool reserves as push events. Every block, every pool, every token: current reserve, delta since last block, current USD price, USD value of the change. No polling. No log decoding. No DEX-specific contract integrations. Just connect and consume.
What you get
Every time a swap, add-liquidity, or remove-liquidity transaction lands in a pool you subscribed to, DexPaprika emits areserve_update event containing:
- The chain and pool the change happened in
- The block number the change was observed in
- For each token in the pool:
- Current reserve (raw on-chain integer)
- Delta since the previous block (raw on-chain integer)
- Current USD price
- Current reserve value in USD
- USD value of this block’s delta
- Total reserve value of the pool in USD
- Total USD delta across all tokens this block
total_delta_usd, tells you in one number how much liquidity moved through the pool this block. Positive means net inflow, negative means net outflow. No reduction, no aggregation, no waiting.
Why this is unique
Real-time pool reserves are easy to describe and hard to ship. Every other approach in the market makes you do most of the work.How competitors handle this today
Subgraphs (The Graph)
Subgraphs (The Graph)
Subgraphs index DEX events into queryable schemas, and are most commonly consumed as polling GraphQL queries. Push subscriptions exist in some gateway configurations but aren’t the default consumption pattern most teams build against. Latency in the typical setup is bounded below by your poll interval. For 1,000 pools and 1-second polling that is 60,000 requests per minute, every minute, forever.
Raw block streams (Alchemy, Infura, QuickNode)
Raw block streams (Alchemy, Infura, QuickNode)
These providers stream raw blockchain events. You receive a
Sync(uint112, uint112) log for Uniswap V2, a Swap(...) log with internal balance math for Uniswap V3, an entirely different shape for Curve, Balancer, Solana DEXes. To turn that into “pool X now has Y USDC and Z WETH” you write a contract-by-contract decoder, maintain it across forks, handle reorgs, and reconcile reserve state from emitted deltas. That is tens of thousands of lines of code per DEX integration before you ever see a single USD-denominated reserve value.Price-only streams (Birdeye, others)
Price-only streams (Birdeye, others)
A handful of providers offer token-price websockets. They push “USDC is 4M in WETH liquidity this block.
DEX aggregators' own APIs (1inch, 0x, etc.)
DEX aggregators' own APIs (1inch, 0x, etc.)
Aggregator APIs are quote-driven, not stream-driven. You request a swap quote, you get pool depth as a side effect. You cannot subscribe.
On-chain analytics platforms (Dune, Defillama)
On-chain analytics platforms (Dune, Defillama)
These are query-and-dashboard platforms. Their freshness is measured in minutes. Real-time is not the product.
How DexPaprika handles it
We do the contract decoding, the cross-DEX reserve reconciliation, the price attachment, and the USD denomination on our side. You get a single SSE stream. The events look the same whether the underlying pool is Uniswap V2, V3, V4, Curve, Balancer, Aerodrome, Raydium, or Orca.| Provider | Reserves push events | Block-level granularity | USD-denominated deltas | Multi-DEX abstraction | Zero log decoding |
|---|---|---|---|---|---|
| DexPaprika Streaming | Yes | Yes | Yes | Yes | Yes |
| Subgraphs (The Graph) | No (poll) | Yes | Sometimes | Per-subgraph | No |
| Alchemy / Infura / QuickNode | Raw logs only | Yes | No | No | No |
| Birdeye | Token prices only | Token-level | No | N/A | N/A |
| Dune / Defillama | No (dashboards) | Minute-scale | Yes | Yes | Yes |
| GeckoTerminal | No | N/A | N/A | N/A | N/A |
| Bitquery | GraphQL subscriptions on raw events | Yes | Limited | Limited | Partial |
The two subscription methods
The/sse/reserves endpoint accepts two method values. Pick the one that matches what you are actually trying to monitor.
pool_reserves
Subscribe to one specific pool. You receive an event every time a swap or liquidity change lands in that pool’s smart contract. Use this when you care about a particular pair on a particular DEX (a Uniswap V3 USDC/WETH pool, a Curve 3pool position, a Raydium AMM you provide liquidity to).
token_reserves
Subscribe to one specific token. You receive an event every time any pool containing that token sees a reserve change. Use this when you care about a token’s entire on-chain ecosystem at once: total liquidity across all pools, where volume is concentrated, where it’s draining.
When to pick which
Pickpool_reserves if you are: an LP watching your specific position, an arbitrage bot focused on a single venue, a slippage estimator for a particular trade route, a Uniswap V4 hook integrator.
Pick token_reserves if you are: a treasury monitoring a stablecoin you issue, a token issuer watching liquidity migration across venues, an analytics platform aggregating TVL per token, a risk system watching for sudden drains anywhere a token trades.
You can run both subscriptions on the same connection. A multi-asset POST stream can mix pool_reserves and token_reserves entries freely.
What an event looks like
Live capture from the production stream:- The change happened on Ethereum, in pool
0xe055...939f(Uniswap V3 USDC/WETH), at block 25098911. - Token 0 is USDC. Its reserve dropped by 4,915,987,385 raw units this block. USDC has 6 decimals, so that is −$4,916.
- Token 1 is WETH. Its reserve rose by 2,180,365,462,384,895,407 raw units. WETH has 18 decimals, so that is +2.18 WETH, which at current 4,917**.
- Net dollar delta for the pool this block: ~$1.16. Which is what
total_delta_usdsays.
Use cases by audience
The same feature, three different reasons to care.For DeFi power users
If you provide liquidity, trade, or hold positions on DEXes, reserves streaming changes what you can know about your own money.Real-time impermanent loss
Watch your LP position’s IL accrue block by block. Every
reserve_update for your pool gives you the new constant-product or concentrated-liquidity state. Plug it into an IL calculator and your dashboard tells you what you are losing right now, not what you lost an hour ago.Slippage estimation before you swap
Get the exact reserves of the pool you are about to trade through, as of the current block. Compute expected slippage against the actual current state. Decide whether to route, split, or wait.
Liquidity migration alerts
Watch a token’s entire pool ecosystem (
method=token_reserves). When a major LP yanks liquidity from venue A and adds to venue B, you see both events within seconds.Rug-pull early warning
Sudden, large, one-sided reserve drains on a small pool. Exactly the signal you want before everyone else notices. Wire
total_delta_usd < -threshold into a webhook and you have it.For quant, MEV, and arbitrage builders
You need fresh, deterministic, low-latency pool state across many venues. Polling-based APIs do not work for you. Raw log streams force you to be your own DEX integration team.Block-level granularity
Every event carries the
block it was observed in. Two events with the same block happened in the same block. Two events with different block values are strictly ordered. You can reconstruct per-block pool state without ambiguity.Cross-DEX uniformity
Uniswap V2, V3, V4, Curve, Balancer, Aerodrome, Raydium, Orca, PancakeSwap, SushiSwap. They all emit the same
reserve_update shape. One parser, one schema, one mental model. The contract-by-contract decoding lives on our side.USD-denominated deltas, pre-attached
price_usd is attached to every token’s reserve at observation time. delta_usd tells you the dollar value of this block’s change. You do not maintain your own price feed to compute it.Production-grade throughput
The streaming infrastructure is built for high concurrency. Production load testing has demonstrated comfortable headroom under hundreds of simultaneous connections, with linear throughput scaling under realistic workloads.
For analytics and dashboard builders
You build the products people open in the morning to see what is happening on-chain. Your users expect numbers that are accurate to the block, not to the minute.Real-time TVL
Sum
total_reserve_usd across all pools you track. The number is current to the block. No background ETL job. No “data is fresh as of 2 minutes ago” disclaimer.Real-time DEX volume attribution
Aggregate
abs(total_delta_usd) per pool, per DEX, per chain, over your time window of choice. You get DEX volume as a live stream, not a delayed batch.Pool depth heatmaps
Maintain a per-pool reserves snapshot in memory, updated by every event. Render heatmaps that update live as liquidity moves across pools, chains, and DEXes.
Bridge flow visibility
When a bridge contract sits as a counterparty in a pool, its reserve changes show you cross-chain flows the moment they settle on the destination chain. No “is the bridge healthy” guessing.
Get started
Three runnable examples. Each connects to the live production stream, no API key required.A single pool with cURL
Subscribe to a Uniswap V3 USDC/WETH pool on Ethereum.Ctrl-C to disconnect.
A whole token’s ecosystem with Python
Subscribe to every pool containing USDC across Ethereum. This will emit a lot of events.Multiple assets at once with JavaScript
A POST stream that mixes one specific pool and one whole token. Single connection, both feeds.- The browser
EventSourceAPI does not support POST requests, so multi-asset subscriptions on the browser requirefetch+ReadableStreamlike above. Single-asset GET subscriptions work withEventSourcedirectly. - The
total_delta_usdfield is a regular JavaScript number, safe for floating-point math. The rawreserveanddeltafields can be very large integers; parse them withBigIntif you need exact precision.
Limits to know about
| Limit | Value | Behaviour when exceeded |
|---|---|---|
| Pools/tokens per POST connection | 25 | POST /sse/reserves rejects the request with {"message": "too many subscriptions"} |
| Concurrent SSE streams per IP | 10 | The 11th connection returns 429 Too Many Requests with {"message": "ip stream limit exceeded"} |
| Ping interval | 15 s | A ping event arrives if no reserve activity has been pushed for that long. Use it as a connection-liveness signal |
warning event in-band (for example, when you connect to a deprecated path). Treat unknown event types as no-ops so new server-side additions never crash your handler.
What’s next
Streaming reference
Schema, parameters, error codes for the GET and POST
/sse/reserves endpoints.Token price streaming
DexPaprika also streams token prices over the same SSE transport. Use both together for full pool-state coverage.
Live dashboard demo
A working frontend that connects to the streaming API. Source-available, deployable, a good starting reference.
Discord community
The team is in Discord. Bring use cases, edge cases, and feature requests.