Skip to main content

Rate limits

Free tiers, keyed or keyless, call api.dexpaprika.com. Dev, Pro and Enterprise call api-pro.dexpaprika.com and must send the key in the Authorization header; upgrading to Pro is the whole change. When you exceed the per-minute rate, requests return HTTP 429; retry after a short pause. When the credit allowance runs out, requests return HTTP 402, and retrying will not help.

How the allowance refills

The tiers refill differently, and the difference changes how you pace heavy work. Free tiers use a rolling 30-day window. What counts is your usage over the last 30 days, and the window advances an hour at a time. There is no first-of-the-month reset to wait for: credits come back 30 days after you spent them, to the hour. A burst today therefore constrains you for the next 30 days rather than until the calendar turns over. With a key, period_started_at on GET /usage shows where your window currently begins. Pro and Enterprise reset on the billing period, anchored to the subscription date, so the whole allowance returns at once. The practical difference is backfills. Under a calendar month you could spend the allowance and wait for the 1st. Under a rolling window a large one-off pull keeps its weight for a full 30 days, so either spread heavy historical work across days or size it against Pro.

Requests and credits

An HTTP call is a request. What it spends is a credit. One request costs one credit, with no compute units and no per-endpoint weights: a light call and a heavy call cost the same. Credits are the customer-facing unit, and they are what console.dexpaprika.com, invoices and the pricing page count. Two places the distinction matters. The per-minute limit counts requests, so 15 per minute means 15 HTTP calls per minute. Batch endpoints charge one credit per item, so one HTTP call for 10 tokens is 1 request and 10 credits.
Need more headroom? Pro raises the monthly allowance to 5M credits with per-1M overage, and Enterprise is custom. Plans and checkout are on pricing.

OHLCV limits by plan

The pool OHLCV endpoint (GET /networks/{network}/pools/{pool_address}/ohlcv) caps how far back you can query and how fine the candles can be. The cap depends on your plan: How the history cap is applied:
  • start is required and must fall inside the window; start=-24h selects the last 24 hours, which every plan may query. end, when given, must fall inside it too.
  • count_back counts candles back from end, so count_back × interval must fit inside the window as well.
  • If start is inside the window but the range reaches before it, the request succeeds and the start is moved up to the edge of the window. You get a 403 only when the whole range lies before the window.
A request outside the plan’s limits returns HTTP 403 with the plan_required envelope. param names the parameter that broke the limit, required_tier the lowest plan that lifts it, and message says the same in words. A free key asking for a month of history:
A keyless request for interval=1m:
Token OHLCV (GET /networks/{network}/tokens/{token_address}/ohlcv) needs a paid plan. Keyless requests and free keys get 403 with "error": "plan_required" and no param, because the whole endpoint is gated (see paid-only endpoints); Dev and above follow the Dev, Pro and Enterprise rows of the table above. Pool indicators (GET /networks/{network}/pools/{pool_address}/indicators) are computed from pool OHLCV candles and follow the same table, for all five indicators, with the same 403 bodies. Without interval, a keyless request defaults to 1h rather than 24h, since a daily candle does not fit its 24-hour window. Token indicators need a paid plan, like token OHLCV. The interval check runs first: a free key asking for interval=1m over a month gets the interval message, not the history one. A 403 is not retryable; fix the parameters or upgrade the plan.
A few endpoints are not available to keyless callers or free keys at all. They need a Dev, Pro or Enterprise key, on the paid hosts (api-pro.dexpaprika.com for REST, streaming-pro.dexpaprika.com for SSE): The refusal is the plan_required envelope without a param, returned before any data is read, so it costs no credits. tier is keyless or free; required_tier is dev:
Details of every field are in error handling. Every other REST endpoint answers on the free tier (subject to the credit and per-minute limits above), /sse/reserves opens with a free key, and /sse/prices streams keyless on the showcase assets and on any token with a key.

Pagination rules

The search endpoints page with a cursor. GET /networks/{network}/dexes and GET /networks/{network}/pools/{pool_address}/transactions are the two that still page with numbers.

Reduce API calls

Use batch pricing

Instead of making one request per token:
Use batch pricing for up to 10 tokens at once:
Batching collapses three round-trips into one HTTP call, which cuts latency, connection overhead and pressure on the per-minute request limit. It does not cut your credit spend: each token in the batch bills as one credit, so 10 tokens cost 10 credits whether you fetch them one at a time or together. Batch for speed and for headroom against the per-minute limit, not to save credits.

Use streaming for real-time data

Sizing a workload before you pick a plan? Plan your credit usage has measured update rates, four worked cost models, and the point where streaming stops costing less than polling.
If you need live prices, don’t poll the REST API in a loop. Open one streaming connection instead:
A single POST /sse/prices connection accepts up to 25 assets. Concurrent SSE streams are capped per plan: 10 keyless (counted per IP), 10 on a free key, 30 on Dev and 100 on Pro (counted per account, from any IP). The next stream over the cap returns 429 with "error":"rate_limited" and a message starting Concurrent stream limit reached; close an open stream before starting another. Streaming is billed the same way as REST: each update delivered over the stream costs one credit. Because updates are pushed only when a swap moves the price, an idle market costs nothing, but a fast-moving one draws on your credit allowance much as polling would. Budget for the update rate of what you subscribe to, not the number of connections.

Cache static data

Some data changes rarely and can be cached: Data that changes frequently and should be fetched fresh:
  • Token prices
  • Pool volumes and transaction counts
  • Recent transactions
  • Current OHLCV candle (incomplete)

Request only what you need

  • Use limit to control page size. Do not fetch 100 items if you need 5
  • Use order_by and sort to get the most relevant results first
  • Use the filter endpoint for targeted queries instead of fetching all pools and filtering client-side

Handle errors gracefully

Implement exponential backoff

When requests fail, don’t retry immediately in a tight loop:

Don’t retry client errors

  • 400: fix the request parameters
  • 404: verify the network ID and addresses
  • 410: use the replacement endpoint
Only retry on 429 (rate limit) and 500 (server error).

Streaming best practices

Validate before streaming

The streaming API rejects the entire request if any asset is invalid. Always verify tokens exist via REST first:

Use batched POST for multiple tokens

Instead of opening multiple GET connections:
Use one POST connection:

Reconnect with backoff

Streaming connections can drop (network issues, server restarts). Always implement auto-reconnection:

Parse prices as decimals

The streaming p field is a string, not a number. Use decimal parsing to avoid floating-point precision issues:

Production checklist

  • Cache network and DEX lists
  • Use batch pricing where possible
  • Use streaming instead of polling for live prices
  • Implement exponential backoff for retries
  • Handle all HTTP status codes (200, 400, 404, 410, 429, 500)
  • Parse streaming prices as decimals, not floats
  • Validate tokens before adding to streaming connections
  • Monitor credit spend in console.dexpaprika.com against your tier’s allowance (streaming updates included)
  • Consider Pro if approaching your allowance, and budget time for the base URL and header change it needs

FAQs

Yes. The free tier allows 15 requests a minute without a key and 30 with a free key, and Pro allows 500, alongside the credit allowance. Exceeding the per-minute rate returns HTTP 429; retry after a short pause.
A request is one HTTP call. A credit is what it spends. One request costs one credit on every plan, with no compute units or per-endpoint multipliers, so the two numbers match except on batch endpoints, where one request charges one credit per item.
Yes. Each price update delivered over an SSE stream costs one credit, the same as a REST call. Updates are pushed only when a swap moves the price, so an idle subscription costs nothing, but an active one draws on your credit allowance.
Registering for a free API key raises the keyless 10,000 credits to 100,000. Both are measured over a rolling 30 days, not a calendar month. Beyond that, Pro includes 5,000,000 credits a month on the billing period, with per-1M overage.
Your plan’s OHLCV window or candle size was exceeded. Without a key you get 1h+ candles over the last 24 hours; a free key gets 10m+ candles over 7 days; Dev gets every interval over 30 days; Pro and Enterprise have no cap. The 403 message says which plan lifts the limit.