Dexscreener Token Price Monitor avatar

Dexscreener Token Price Monitor

Pricing

from $3.30 / 1,000 pool records

Go to Apify Store
Dexscreener Token Price Monitor

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

angel nguyen

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

16 days ago

Last modified

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.

Actor icon

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 as chain: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. minLiquidityUsd drops 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. changesOnly emits a row only when a watched field moved, and minChangePct sets 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. watchFields defaults to priceUsd, liquidityUsd and volume24h, but any output field is valid.

How it works

  1. You supply token addresses, pair addresses or search terms, each prefixed with a Dexscreener chain ID such as bsc, ethereum, solana or base.
  2. Token lookups are batched — up to 30 tokens per request — and by default reduced to each token's deepest pool.
  3. Pair lookups go straight to the named pool, which is the cheapest and most precise path.
  4. Search terms return up to resultsPerSearchTerm pools each; a search result set changes between runs, so for monitoring you resolve once and then watch the pair addresses.
  5. Pools thinner than minLiquidityUsd are dropped.
  6. If changesOnly is on, each pool is compared against the previous run's snapshot and emitted only when a watched field moved by at least minChangePct.

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

FieldTypeDefaultWhat it does
tokensarray["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, …
allPoolsPerTokenbooleanfalseOff: 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.
pairsarray[]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.
searchTermsarray[]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.
resultsPerSearchTerminteger20Cap on pools kept per search term. Ignored for token and pair lookups.
minLiquidityUsdinteger0Drop pools thinner than this. A price quoted off a near-empty pool is not a price anyone can trade at; 0 keeps everything.
changesOnlybooleanfalseCompare 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.
watchFieldsarray["priceUsd","liquidityUsd","volume24h"] (prefilled)Fields compared when 'Emit changes only' is on. Any output field is valid — priceUsd, liquidityUsd, volume24h, fdv, marketCap, txns24hBuys, …
minChangePctinteger0Noise 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.
maxConcurrencyinteger5Concurrent 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.

FieldTypeValue from a real run
chainIdstringethereum
dexIdstringuniswap
pairAddressstring0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640
labelsarray["v3"]
baseTokenAddressstring0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
baseTokenNamestringWrapped Ether
baseTokenSymbolstringWETH
quoteTokenAddressstring0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
quoteTokenNamestringUSD Coin
quoteTokenSymbolstringUSDC
pairstringWETH/USDC
priceUsdnumber2416.75
priceNativenumber2416.7574
liquidityUsdnumber103847112.19
liquidityBasenumber11304
liquidityQuotenumber76526705
fdvnumber5071541263
marketCapnumber5062217390
volume24hnumber164137382.9
volume6hnumber23279753.37
volume1hnumber2825081.24
priceChange24hPctnumber1.94
priceChange6hPctnumber-0.63
priceChange1hPctnumber-0.29
txns24hBuysnumber5001
txns24hSellsnumber4876
pairCreatedAtstring2021-05-05T21:42:11.000Z
pairUrlstringhttps://dexscreener.com/ethereum/0x88e6a0c2ddd26feeb64f039a2c41…
scrapedAtstring2026-08-22T14:21:18.765Z
changedFieldsarray["priceUsd","liquidityUsd","volume24h"]
previousobject{"priceUsd":2415.62,"liquidityUsd":103834272.47,"volume24h":164…
changePctobject{"priceUsd":0.046778880784233826,"liquidityUsd":0.0123655896021…
previousSeenAtstring2026-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.

EventPriceCharged when
Actor start$0.00001Charged once when a run starts, at the platform minimum. A run-start allowance, not a revenue line.
Pool record$0.0033One DEX pool with its live price, liquidity, 24h volume and 24h buy/sell split.
Price change$0.004Charged 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, changesOnly with 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

  • resultsPerSearchTerm caps pools kept per search term at 100; it is ignored for token and pair lookups.
  • maxConcurrency is 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.
  • minChangePct is 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.

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.