DexScreener Pair Price & Liquidity Scraper
One row per DEX trading pair: USD price, pool liquidity, 24h volume and trade counts, each stamped with the time the source produced it. No API key needed.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
searchTerms,tokenAddresses,pairAddresses(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.0014 per pair = $1.4 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Pair scraped | One trading pair with its price and liquidity, carrying the source snapshot time. Misses are never charged. | $0.0014 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-09-20, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
searchTerms | Free-text search: a token symbol, a token name, a pair like SOL/USDC, or a contract address. Each term returns at most 30 pairs and there is no page two, so a broad symbol gives you the top of the list rather than every pair. Up to 100 terms per run. | array |
tokenAddresses | Token contract addresses, written as chain:address - for example solana:So11111111111111111111111111111111111111112 or ethereum:0x6982508145454ce325ddbe47a25d4ec3d2311933. A dexscreener.com URL pasted straight from the browser works too. By default you get the deepest pool for each token, one row each. Up to 100 per run. | array |
pairAddresses | Exact pool addresses, written as chain:address, or a pasted dexscreener.com pair URL. One row each. The address that comes back is checked against the one you asked for, so you never get billed for somebody else's pool. Up to 100 per run. | array |
chainId | Only needed if you paste addresses without a chain prefix. Set it to the chain they belong to - solana, ethereum, base, bsc, arbitrum, polygon and so on. An address written as chain:address ignores this. | string |
allPoolsPerToken | Off by default, which gives you one row per token - the pool with the most liquidity. Turn it on to get every pool the API lists for that token, up to 30 each. Useful for spotting price gaps between venues, and it multiplies what you pay by the number of pools. | boolean |
minLiquidityUsd | Leave at 0 to keep everything. Set it to, say, 10000 and pools holding less than that are dropped before they are written, so you are not billed for dust. A popular symbol returns a lot of near-empty pools. | integer |
maxItems | Total rows across everything you asked for. Keep it low while you are testing - you pay per row. Hard ceiling 3000. | integer |
proxyUrls | Leave this empty for a normal run. Fill it in only if you want the traffic to leave through proxy servers you already pay for, one URL per line, in the form http://user:pass@host:port. | array |
What you get
A structured dataset — each result includes fields like:
querychainIddexIdbaseSymbolquoteSymbolpriceUsdliquidityUsdvolumeH24priceChangeH24marketCapUsdsnapshotAtsourceAgeSecondspairUrlpairAddressExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Developer & Research Tools
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
GitHub Scraper
Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.
Stack Overflow / Stack Exchange Scraper
Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.
Package Registry Scraper (npm + PyPI)
Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.
arXiv Scraper
Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.
OpenAlex Scholarly Works Scraper
Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.
Crossref Scholarly Works Scraper
Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.
Where this tool sits
- Categories
- Developer & Research Tools
DexScreener Pair Price & Liquidity Scraper: DEX pairs by symbol, token or pool address
Search by symbol, paste token addresses or paste pool addresses, and you get one row per trading pair: the price in USD and in the quote token, the pool's liquidity, volume and price change from five minutes to 24 hours, and the buy and sell counts. Every row also says when DexScreener produced those figures. The catch is the ceiling: one search or token returns at most 30 pairs, there is no second page, and a broad symbol gives you the top of the list rather than every pool.
| Input | Search terms, token addresses or pool addresses, on any chain DexScreener lists |
| Output | One row per trading pair |
| Ceiling | 3,000 rows per run, 30 pairs per search or token |
| Account needed | None: no wallet, no API key |
| Price | $1.40 per 1,000 pairs, flat on every plan |
🔍 What DexScreener Pair Price & Liquidity Scraper does
Three ways in, and one run can mix them across chains:
- Search terms. A symbol, a name, a pair like
SOL/USDC, or a contract address. Search is
fuzzy. On 30 September a SOL/USDC search capped at five rows returned the real SOL/USDC pool on Base next to tokens called SOLANGELES, SOLO and PLAY. When you know what you want, use addresses.
- Token addresses. By default the deepest pool for each token, one row each. Turn on
allPoolsPerToken for every pool the token trades in, up to 30.
- Pool addresses. Exactly that pool. The address that comes back is checked against the one you
asked for, and a mismatch is dropped, not charged.
A pool that two of your targets both find comes back once.
DexScreener's figures can already be up to a minute old when the run reads them. So every row carries snapshotAt, the moment DexScreener produced the numbers, and sourceAgeSeconds, how old they were when read. Read those before you trust a price.
If the first 25 targets all come back empty and nothing has been delivered, the run stops there rather than grinding through the rest. That is nearly always a list of addresses on the wrong chain.
📥 What you give it
{
"searchTerms": ["SOL/USDC", "PEPE"],
"tokenAddresses": ["solana:So11111111111111111111111111111111111111112"],
"pairAddresses": ["base:0x1131DB5977242a03eBeaD1aCD18F80A9A29e5922"],
"minLiquidityUsd": 10000,
"maxItems": 50
}
| Field | Prefilled with | What it is |
|---|---|---|
searchTerms | ["SOL/USDC"] | Free text: a symbol, a name, a pair or a contract address. At most 30 pairs per term. Up to 100 terms. |
tokenAddresses | empty | Token contracts as chain:address, or a dexscreener.com URL pasted from the browser. Up to 100. |
pairAddresses | empty | Pool addresses in the same forms. One row each. Up to 100. |
chainId | solana | Only read for bare addresses with no chain in front: solana, ethereum, base, bsc, arbitrum, polygon and so on. The form starts on solana, so a bare address is read as Solana unless you change it. |
allPoolsPerToken | off | Every pool for each token, up to 30, instead of only the deepest. It multiplies what you pay by the number of pools. |
minLiquidityUsd | 0 | Pools holding less than this many dollars are dropped before they are written, so you are not billed for dust. 10000 is a sensible floor for real markets. |
maxItems | 50 | Total rows across everything you asked for, 1 to 3,000. Left out of an API call, it is 50. |
proxyUrls | empty | Optional. Your own servers, one per line as http://user:pass@host:port, if you want the traffic to leave through them. Leave it empty for a normal run. |
All four of these mean the same address:
solana:So11111111111111111111111111111111111111112
solana/So11111111111111111111111111111111111111112
https://dexscreener.com/solana/So11111111111111111111111111111111111111112
So11111111111111111111111111111111111111112 (with chainId set to "solana")
📤 What you get back
A real row from a real run on 30 September 2026:
{
"ok": true,
"charged": true,
"recordType": "pair",
"query": "SOL/USDC",
"chainId": "base",
"dexId": "aerodrome",
"baseSymbol": "SOL",
"quoteSymbol": "USDC",
"priceUsd": 119.55,
"liquidityUsd": 713289.14,
"volumeH24": 7372325.26,
"priceChangeH24": 2.46,
"marketCapUsd": 28813210,
"snapshotAt": "2026-09-30T02:24:25.000Z",
"sourceAgeSeconds": 47,
"pairUrl": "https://dexscreener.com/base/0x1131db5977242a03ebead1acd18f80a9a29e5922",
"pairAddress": "0x1131DB5977242a03eBeaD1aCD18F80A9A29e5922",
"baseAddress": "0x311935Cd80B76769bF2ecC9D8Ab7635b2139cf82",
"quoteAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"priceNative": 119.5566,
"liquidityBase": 2171.1728,
"liquidityQuote": 453710,
"fdvUsd": 28813210,
"volumeH6": 1534194.95,
"volumeH1": 379441.31,
"volumeM5": 29220.53,
"priceChangeH6": 0.49,
"priceChangeH1": 0.05,
"priceChangeM5": 0.05,
"buysH24": 5902,
"sellsH24": 5496,
"labels": [],
"pairCreatedAt": null,
"retrievedAt": "2026-09-30T02:25:12.901Z"
}
| Field | What it is |
|---|---|
query | The term or address that produced the row, so you can join the output back to your input. |
snapshotAt, sourceAgeSeconds | When DexScreener produced these figures, and how many seconds old they were when read, normally 0 to about 60. |
retrievedAt | When the run read them. Always later than snapshotAt, and the less useful of the two. |
priceUsd, priceNative | The price in dollars, and in units of the quote token. Sub-cent tokens keep full precision, so expect values like 0.00000412. |
liquidityUsd, liquidityBase, liquidityQuote | What sits in the pool, in dollars and in each token. This is the field that tells you whether ten dollars of trading would move the price. |
volumeM5 to volumeH24, priceChangeM5 to priceChangeH24 | Volume and percentage change over 5 minutes, 1 hour, 6 hours and 24 hours. |
buysH24, sellsH24 | Buy and sell counts over 24 hours. |
marketCapUsd, fdvUsd, pairCreatedAt | DexScreener's own figures. Null wherever it has none, as pairCreatedAt is above. Nothing is estimated to fill a gap. |
labels | Tags DexScreener attaches to some pools, such as v3 or CLMM. Usually empty. |
🧾 Reading the output
recordType is not a safe filter on its own, because the free sample row says pair too.
| Row | How to spot it | Charged |
|---|---|---|
| A pair | charged: true, recordType: "pair", no _sample field | yes |
| The sample row | _sample: true and charged: false. Written only when all three lists are empty | no |
| A diagnostic row | _diagnostic: true, charged: false, recordType: "diagnostic", with an errorCode, the query it is about, and error and details in plain words | no |
errorCode | What happened |
|---|---|
NO_RESULTS | The search or token matched nothing. A real answer, not a failure. |
NOT_FOUND | No pool exists at that address on that chain. |
WRONG_TARGET | What came back was not the pool or token you asked for, so it was dropped. |
RESULT_TRUNCATED | 30 pairs came back, the most one search or token gives, so you have the top of the list and not all of it. |
BAD_INPUT | The chain or address was not recognised, or a bare address had no chain. |
RATE_LIMITED | DexScreener's rate limit stopped the run at that target. Split the work across two runs. |
SERVER_ERROR, NETWORK | DexScreener errored or did not answer for that target. Usually worth one re-run. |
UNEXPECTED_ERROR | The run hit an error it did not expect. Nothing was charged for it. |
TIME_BUDGET | The run reached its time limit before reading that target. |
NOTHING_MATCHED | The first 25 targets came back empty with no rows anywhere, so the run stopped. It says how many targets went unread. |
CHARGE_ERROR | Some charges could not be recorded. The row gives the rows delivered and the rows charged. |
charged: true is what tells a real row from a sample or diagnostic row. To keep only the data, filter on it, or drop every row carrying _sample or _diagnostic.
▶️ How to run it
1. Open DexScreener Pair Price & Liquidity Scraper and click Try for free. 2. Type into Search terms, or paste into Token addresses or Pair addresses, with the chain in front of each address. 3. Set Skip pools below this liquidity (USD) if you only want real markets. 4. Set Maximum rows, and keep it low while you are testing. 5. Click Start, then download the dataset as JSON, CSV or Excel, or read it from the API.
💰 How much does it cost?
$1.40 per 1,000 pairs, flat on every Apify plan: no volume tiers, no subscription. One hundred pairs come to 14 cents.
Not charged: the sample row, every diagnostic row, pools under your liquidity floor, a pool found twice, and an answer that did not match what you asked for. If you set a maximum charge for the run, it stops at the last row that fits.
💡 What people use it for
- Watching one token's pools across several chains and venues, to see where it actually trades and
where the price differs.
- Keeping a sheet of current prices and pool depth for a basket of tokens, refreshed on a schedule.
- Checking whether a token that looks liquid on a chart has any depth behind it.
liquidityUsdnext
to volumeH24 answers that at a glance.
- Pulling
pairCreatedAt, early volume and starting liquidity for a list of new pools.
🚧 What it does not do
- No advice. No score, rating, signal or prediction anywhere in the output. Just the numbers.
- No live feed. A price can be up to a minute old;
sourceAgeSecondssays how old. For
sub-second prices, use the trading venue's own feed.
- No history. No candles, no OHLC, no time series. Only the current snapshot and the change
percentages DexScreener publishes.
- No holders, wallets or individual trades.
- No second page. 30 pairs per search or token, whatever you set.
- No pools DexScreener does not list. Coverage is what DexScreener has.
- No protection from copycat symbols. Names and symbols are chosen by whoever deployed the
contract, and two tokens can share one. That is why every row carries the addresses.
🧭 Which crypto scraper do you need?
| If you want | Use |
|---|---|
| DEX pair prices, pool liquidity and volume | This one |
| Coin prices, market caps and rankings | CoinGecko Scraper |
| Price history as daily candles, BTC-USD included | Yahoo Finance Scraper |
| Crypto Fear and Greed readings, back to 2018 | Crypto Fear and Greed Index Scraper |
| Large Polymarket trades and the wallets behind them | Polymarket Whale Tracker |
❓ Questions people ask
How fresh is the price? Between zero and about sixty seconds old. sourceAgeSeconds gives the exact age and snapshotAt the moment the figures were true.
What happens if my search matches nothing? You get one free NO_RESULTS row and the run carries on to your other targets. "Nothing there" is a different code from "could not look", so you can tell them apart.
Can I get every pool for a token instead of just the biggest? Yes. Turn on allPoolsPerToken. You get up to 30 pools per token and pay for each, which is why it is off by default.
Which chains work? Any that DexScreener lists, in the same run. Write the chain in front of each address and mix them freely.
Can I run it on a schedule? Yes. Nothing is kept between runs, so the same input on a schedule is safe. Join on pairAddress to compare one run with the last.
Is this financial advice? No. It returns published market data and nothing else.
🆘 If something breaks
Open the Issues tab on the actor page. Send the input and the run ID, and the errorCode rows usually show what went wrong.