curl --request GET \
--url https://api.dexpaprika.com/networks/{network}/tokens/{token_address}/poolsimport requests
url = "https://api.dexpaprika.com/networks/{network}/tokens/{token_address}/pools"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.dexpaprika.com/networks/{network}/tokens/{token_address}/pools', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.dexpaprika.com/networks/{network}/tokens/{token_address}/pools",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.dexpaprika.com/networks/{network}/tokens/{token_address}/pools"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.dexpaprika.com/networks/{network}/tokens/{token_address}/pools")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.dexpaprika.com/networks/{network}/tokens/{token_address}/pools")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"error": "payment_required",
"tier": "keyless",
"message": "Monthly limit reached for unauthenticated use. Register for a free API key to get 300K credits/month.",
"credits": {
"limit": 50000,
"used": 50000,
"remaining": 0
},
"resets_at": "2026-09-01T00:00:00Z"
}Get top X pools for a token.
Removed. Use /networks//pools/search with the token_address filter instead.
curl --request GET \
--url https://api.dexpaprika.com/networks/{network}/tokens/{token_address}/poolsimport requests
url = "https://api.dexpaprika.com/networks/{network}/tokens/{token_address}/pools"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.dexpaprika.com/networks/{network}/tokens/{token_address}/pools', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.dexpaprika.com/networks/{network}/tokens/{token_address}/pools",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.dexpaprika.com/networks/{network}/tokens/{token_address}/pools"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.dexpaprika.com/networks/{network}/tokens/{token_address}/pools")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.dexpaprika.com/networks/{network}/tokens/{token_address}/pools")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"error": "payment_required",
"tier": "keyless",
"message": "Monthly limit reached for unauthenticated use. Register for a free API key to get 300K credits/month.",
"credits": {
"limit": 50000,
"used": 50000,
"remaining": 0
},
"resets_at": "2026-09-01T00:00:00Z"
}410 Gone. Use GET /networks/{network}/pools/search with the token_address query parameter instead. It restricts results to pools that contain the token on the given network.Migration
| Old | New |
|---|---|
path /networks/{network}/tokens/{token_address}/pools | /networks/{network}/pools/search?token_address={token_address} |
order_by=volume_usd | order_by=volume_usd_24h (the default) |
page | cursor (pass next_cursor from the previous response) |
address (second-token pair filter) | no equivalent |
reorder (pair-perspective flip) | no equivalent |
response pools + page_info | results + has_next_page + next_cursor |
curl "https://api.dexpaprika.com/networks/ethereum/pools/search?token_address=0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2&limit=3"
- The
token_addressfilter works on the network-scoped/networks/{network}/pools/searchonly. The cross-networkGET /pools/searchaccepts the parameter but silently ignores it, so always pass a network. - One token per query. Repeating
token_addressdoes not act as a pair filter; the API uses only one of the values (not guaranteed by order). The oldaddresspair filter andreorderflag have no replacement. - An unknown
token_addressreturns HTTP 200 with an emptyresultsarray, not an error.
Path Parameters
Token contract address. Such as JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN for Jupiter on Solana.
Response
Monthly credit allowance exhausted. Retrying will not help — the body names the available next step per tier: register (keyless), upgrade (free key), or buy a credit pack / enable overage / raise your spend cap (Pro). resets_at is when the allowance rolls over (calendar month or billing period, UTC). Deliberately carries no Retry-After header.
Structured body carried by every 402 and 429 emitted by the billing gate. The shape is constant across scenarios; only fields describing an available action appear. message is always a top-level string, so clients parsing the legacy {"message": ...} shape keep working.
Machine-readable discriminator matching the status code.
payment_required, rate_limited The billing tier the request was evaluated against.
keyless, free, pro Human-readable message naming the next action.
Credit counters for the current period. One credit is one request. plan and packs are split out for Pro keys only. limit is plan + packs; usage served through overage can exceed it.
Show child attributes
Show child attributes
Overage state, present on Pro 402 bodies. Money amounts are decimal strings, never floats.
Show child attributes
Show child attributes
When the monthly allowance rolls over (UTC). 402 only.
Seconds to wait before retrying. 429 only.
Early-adopter offer, present on the free-tier 402 only.
Show child attributes
Show child attributes
Next-step URLs. Keys vary by scenario: register, upgrade, packs, portal, usage, docs. Absent until the customer-facing pages go live.
Show child attributes
Show child attributes
Was this page helpful?