Dexscreener Token Price Monitor
Pricing
from $3.30 / 1,000 pool records
Dexscreener Token Price Monitor
Dexscreener Monitor that returns USD price, liquidity, 24h volume and buy/sell counts. 33 typed fields per pool record. Watch pools and get only the moves. Export to JSON, CSV or Excel, run it on a schedule, or call it from the Apify API.
Pricing
from $3.30 / 1,000 pool records
Rating
0.0
(0)
Developer
angel nguyen
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
16 days ago
Last modified
Categories
Share
What this Actor does
Dexscreener pool data, typed and diffed: get live USD price, liquidity, 24-hour volume and buy/sell counts for any token or pair you track, on every chain Dexscreener indexes. Turn on changesOnly and you are told about the moves instead of re-reading the whole book every run.

By default one token gives you one row — its deepest pool, which is the price anyone can actually trade at. Turn on allPoolsPerToken and you get every pool that token trades in on that chain, which is where cross-DEX price differences become visible.
Key features
- Three ways in. Token addresses as
chain:address, specific pool addresses aschain:pairAddress, or free-text pool search. - 33 fields per record, counted from a real run — USD and native price, liquidity in USD and in both sides of the pool, FDV, market cap, 24h/6h/1h volume, 24h/6h/1h price change, 24h buy and sell counts, pool age and its Dexscreener URL.
- Deepest-pool-by-default. One row per token, batched up to 30 tokens per request, so a fifty-token watchlist is a couple of requests rather than fifty.
- A liquidity floor.
minLiquidityUsddrops pools thinner than you care about — a price quoted off a near-empty pool is not a price anyone can trade at. - Change detection with a noise gate.
changesOnlyemits a row only when a watched field moved, andminChangePctsets how far it has to move before it counts. On a live pool, a gate of 0 means almost every run reports. - Any field is watchable.
watchFieldsdefaults topriceUsd,liquidityUsdandvolume24h, but any output field is valid.
How it works
- You supply token addresses, pair addresses or search terms, each prefixed with a Dexscreener chain ID such as
bsc,ethereum,solanaorbase. - Token lookups are batched — up to 30 tokens per request — and by default reduced to each token's deepest pool.
- Pair lookups go straight to the named pool, which is the cheapest and most precise path.
- Search terms return up to
resultsPerSearchTermpools each; a search result set changes between runs, so for monitoring you resolve once and then watch the pair addresses. - Pools thinner than
minLiquidityUsdare dropped. - If
changesOnlyis on, each pool is compared against the previous run's snapshot and emitted only when a watched field moved by at leastminChangePct.
The first run in changesOnly mode has no baseline, so it emits everything and says so in the log.
Input
At least one of tokens, pairs or searchTerms must be non-empty. Chain IDs are Dexscreener's own.
Input fields
| Field | Type | Default | What it does |
|---|---|---|---|
tokens | array | ["bsc:0xbb4CdB9CBd36B01bD1cBaEBF2De08d9… (prefilled) | Tokens to look up, as chain:address. By default you get the token's single deepest pool — one row per token. Chain IDs are Dexscreener's own: bsc, ethereum, solana, base, polygon, arbitrum, avalanche, … |
allPoolsPerToken | boolean | false | Off: one row per token — its deepest pool (batched, up to 30 tokens per request). On: every pool the token trades in on that chain, which is where cross-DEX price differences show up. On costs more, because it returns many more rows. |
pairs | array | [] | Specific pools to look up, as chain:pairAddress. Use this when you already know the exact pool you care about — it is the cheapest and most precise input. |
searchTerms | array | [] | Free-text pool search, e.g. "WBNB USDT". Handy for discovery, but a search result set changes between runs — for monitoring, resolve once and then watch the pair addresses. |
resultsPerSearchTerm | integer | 20 | Cap on pools kept per search term. Ignored for token and pair lookups. |
minLiquidityUsd | integer | 0 | Drop pools thinner than this. A price quoted off a near-empty pool is not a price anyone can trade at; 0 keeps everything. |
changesOnly | boolean | false | Compare each pool against the previous run's snapshot and emit a row ONLY when a watched field changed. The first run has no baseline, so it emits everything and says so in the log. |
watchFields | array | ["priceUsd","liquidityUsd","volume24h"] (prefilled) | Fields compared when 'Emit changes only' is on. Any output field is valid — priceUsd, liquidityUsd, volume24h, fdv, marketCap, txns24hBuys, … |
minChangePct | integer | 0 | Noise gate for 'Emit changes only'. A numeric watched field must move at least this much before it counts as a change. 0 reports every movement — on a live pool that is almost every run. |
maxConcurrency | integer | 5 | Concurrent requests to api.dexscreener.com. Dexscreener publishes a 300 requests/minute limit on these endpoints; the default sits far below it on purpose. |
Example input
One real token — the WBNB contract on BSC — with a $50,000 liquidity floor so thin pools are dropped.
{"tokens": ["bsc:0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c"],"minLiquidityUsd": 50000}
Output
One dataset item per pool per run. The record below is a real row from a real run of this Actor, copied unedited.
Example output
{"chainId": "ethereum","dexId": "uniswap","pairAddress": "0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640","labels": ["v3"],"baseTokenAddress": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2","baseTokenName": "Wrapped Ether","baseTokenSymbol": "WETH","quoteTokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48","quoteTokenName": "USD Coin","quoteTokenSymbol": "USDC","pair": "WETH/USDC","priceUsd": 2416.75,"priceNative": 2416.7574,"liquidityUsd": 103847112.19,"liquidityBase": 11304,"liquidityQuote": 76526705,"fdv": 5071541263,"marketCap": 5062217390,"volume24h": 164137382.9,"volume6h": 23279753.37,"volume1h": 2825081.24,"priceChange24hPct": 1.94,"priceChange6hPct": -0.63,"priceChange1hPct": -0.29,"txns24hBuys": 5001,"txns24hSells": 4876,"pairCreatedAt": "2021-05-05T21:42:11.000Z","pairUrl": "https://dexscreener.com/ethereum/0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640","scrapedAt": "2026-08-22T14:21:18.765Z","changedFields": ["priceUsd","liquidityUsd","volume24h"],"previous": {"priceUsd": 2415.62,"liquidityUsd": 103834272.47,"volume24h": 164157881.83},"changePct": {"priceUsd": 0.046778880784233826,"liquidityUsd": 0.012365589602131112,"volume24h": -0.01248732608601493},"previousSeenAt": "2026-08-22T14:20:24.448Z"}
Output fields
Every field below is taken from that same real record. Values are truncated for width, never invented.
| Field | Type | Value from a real run |
|---|---|---|
chainId | string | ethereum |
dexId | string | uniswap |
pairAddress | string | 0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640 |
labels | array | ["v3"] |
baseTokenAddress | string | 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 |
baseTokenName | string | Wrapped Ether |
baseTokenSymbol | string | WETH |
quoteTokenAddress | string | 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 |
quoteTokenName | string | USD Coin |
quoteTokenSymbol | string | USDC |
pair | string | WETH/USDC |
priceUsd | number | 2416.75 |
priceNative | number | 2416.7574 |
liquidityUsd | number | 103847112.19 |
liquidityBase | number | 11304 |
liquidityQuote | number | 76526705 |
fdv | number | 5071541263 |
marketCap | number | 5062217390 |
volume24h | number | 164137382.9 |
volume6h | number | 23279753.37 |
volume1h | number | 2825081.24 |
priceChange24hPct | number | 1.94 |
priceChange6hPct | number | -0.63 |
priceChange1hPct | number | -0.29 |
txns24hBuys | number | 5001 |
txns24hSells | number | 4876 |
pairCreatedAt | string | 2021-05-05T21:42:11.000Z |
pairUrl | string | https://dexscreener.com/ethereum/0x88e6a0c2ddd26feeb64f039a2c41… |
scrapedAt | string | 2026-08-22T14:21:18.765Z |
changedFields | array | ["priceUsd","liquidityUsd","volume24h"] |
previous | object | {"priceUsd":2415.62,"liquidityUsd":103834272.47,"volume24h":164… |
changePct | object | {"priceUsd":0.046778880784233826,"liquidityUsd":0.0123655896021… |
previousSeenAt | string | 2026-08-22T14:20:24.448Z |
The last four fields — changedFields, previous, changePct and previousSeenAt — are populated only in changesOnly mode; they are what turns a row into an explanation of why it was emitted.
Pricing
Pay-per-event. You are charged per pool record delivered and per detected price change; platform compute is not billed on top.
| Event | Price | Charged when |
|---|---|---|
| Actor start | $0.00001 | Charged once when a run starts, at the platform minimum. A run-start allowance, not a revenue line. |
| Pool record | $0.0033 | One DEX pool with its live price, liquidity, 24h volume and 24h buy/sell split. |
| Price change | $0.004 | Charged in addition to the pool record when a watched field moved since your previous run. |
What a run actually costs
Worked from the prices in the table above:
- 20 tokens, once an hour, full snapshot. 20 records x $0.0033 = $0.066 per run, about $1.58 a day at hourly cadence.
- 20 tokens, once an hour,
changesOnlywith a 2% gate. You pay only for pools that actually moved 2% or more. A run in which three pools moved costs 3 x $0.0033 for the records plus 3 x $0.004 for the change events = $0.0219. - One pool, checked once. $0.00001 to start plus $0.0033 = $0.00331.
allPoolsPerToken multiplies the record count by however many pools the token trades in, so it is the switch to think about before scheduling.
FAQ
Do I need a wallet, a node or an API key?
No. The Actor reads Dexscreener's public HTTP API. It holds no keys, signs nothing and sends no transactions. It is a read-only price and liquidity reader.
Which chains are supported?
Every chain Dexscreener indexes. You name it with Dexscreener's own chain ID as a prefix — bsc, ethereum, solana, base, polygon, arbitrum, avalanche and the rest.
What is the difference between a token lookup and a pair lookup?
A token lookup finds pools for a token; by default it returns the deepest one. A pair lookup goes straight to a pool you already named. Pair lookups are the cheapest and most precise, and are what you want once a watchlist is settled.
Why would I set minLiquidityUsd?
Because a price quoted off a near-empty pool is not a price anyone can trade at. The floor drops those pools before they reach your dataset. Zero keeps everything.
How do I stop changesOnly reporting on every single run?
Raise minChangePct. A live pool moves constantly, so a gate of 0 reports almost every run. The gate is what turns "it changed" into "it moved enough to care".
Is this financial advice, or a trading signal?
No. It reads public market data and hands it to you as rows. See "Legal and responsible use" below.
How fresh is the data?
It is read live from Dexscreener on every run; nothing is cached between runs. Dexscreener's own indexing latency applies on top, as it would for anyone reading the same source.
Limits and error handling
resultsPerSearchTermcaps pools kept per search term at 100; it is ignored for token and pair lookups.maxConcurrencyis capped at 20 and defaults to 5. Dexscreener publishes a 300 requests-per-minute limit on these endpoints, and the default sits far below it deliberately.- Token lookups batch up to 30 tokens per request, so large watchlists cost far fewer requests than they look like they should.
minChangePctis capped at 100 and applies only to numeric watched fields.- A search result set is not stable between runs. For monitoring, resolve once and then watch pair addresses.
Integrations and API
Everything below works on any Apify account, including the free tier.
Run it from the Apify API
Start a run and wait for the dataset in one call. Replace <YOUR_TOKEN> with your own Apify API token.
curl -X POST "https://api.apify.com/v2/acts/praise-most-high~dex-token-price-monitor/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-H "Content-Type: application/json" \-d '{"tokens":["bsc:0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c"],"minLiquidityUsd":50000}'
Use it from JavaScript or Python
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_TOKEN>' });const run = await client.actor('praise-most-high/dex-token-price-monitor').call({"tokens":["bsc:0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c"],"minLiquidityUsd":50000});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Schedules, webhooks and integrations
Run it on a schedule — hourly, daily, or a cron expression — and have the output pushed where you already work. Apify ships first-party integrations for Zapier, Make, n8n, Slack, Google Drive, GitHub and generic webhooks, and any run can fire a webhook on success or failure. The dataset is also readable directly as JSON, CSV, XLSX, XML or RSS from its own URL, so a spreadsheet or a BI tool can point straight at it.
Where the data comes from
Dexscreener's public HTTP API (api.dexscreener.com), read live on every run. Nothing is cached between runs.
The Actor is read-only in the strongest sense: it holds no private key, signs no transaction, submits nothing on-chain, and has no wallet. Dexscreener publishes a 300 requests-per-minute limit on these endpoints and the default concurrency of 5 sits far below it on purpose.
Legal and responsible use
Unofficial. This Actor is not affiliated with, endorsed by, or sponsored by Dexscreener or by any exchange, protocol or token issuer. Their names are used only to describe the public data source it reads.
Not financial advice. This Actor returns public market data. It does not recommend, rank or endorse any token, pool or venue, and nothing in its output is a signal to buy or sell. On-chain prices move continuously and a row is a reading, not a quote you can trade on.
No personal data. Pool and token addresses and their public trading statistics. No wallet identities, no counterparties, no attempt to link an address to a person.
Support and feedback
Found a bug, a wrong field, or a source that changed shape? Open an issue on the Issues tab of this Actor and it goes straight to the maintainer. Feature requests are welcome on the same tab. If a run failed, include the run ID — the log is what makes it fixable.