Polymarket Odds Monitor: Price Move Alerts avatar

Polymarket Odds Monitor: Price Move Alerts

Pricing

from $6.00 / 1,000 price move signals

Go to Apify Store
Polymarket Odds Monitor: Price Move Alerts

Polymarket Odds Monitor: Price Move Alerts

Tracks Polymarket markets between runs and returns only the ones that moved: price changes past your thresholds, volume spikes, new markets. Pay per signal, not per row.

Pricing

from $6.00 / 1,000 price move signals

Rating

0.0

(0)

Developer

Wiseus Labs

Wiseus Labs

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a month ago

Last modified

Categories

Share

This Actor watches Polymarket and hands back only the markets where something changed: a price move, a volume spike, or a brand new market, not the whole list. You pay per signal, not per market checked, so a run that finds nothing costs almost nothing beyond the Actor start fee. Every comparison is against this Actor's own stored history over the window you choose, not against Polymarket's own weekly change figure, and a market whose event has already ended is skipped before a signal is even computed.

What you get

A typical run checks around 300 of the roughly 17,000 markets Gamma lists, the highest volume ones, and comes back with up to 5 signals, one row per signal in the dataset. Markets whose end_date has already passed are skipped, so a match that already finished playing out does not show up in your results.

  • Price move: the price moved enough during your comparison window to matter, not just drift. It must clear both a points and a percent threshold, 0.03 points and 15 percent by default.
  • Volume spike: trading volume jumped and the price actually moved with it. A jump with no price movement is usually the 24 hour window rolling forward, not real trading, so it is not reported. Three thresholds must be met together, see the table below.
  • New market: a market appeared since the previous run. Off by default, see Limits below.

The first run already returns price_move signals, computed from Polymarket's own 1 hour price change. Volume spike and new market signals need a second run, once the Actor has its own history to compare against.

Volume spike thresholds:

InputDefaultMeaning
minVolumeSpikePct25Minimum relative growth of 24 hour volume, in percent
minVolumeSpikeAbs$5,000Minimum growth of 24 hour volume, in dollars
minPriceMoveForVolumeSpike0.01Minimum price move, in probability points, required alongside the volume growth. A volume spike with no price movement is usually the 24 hour rolling window shifting, not real trading. Set to 0 to report every volume spike regardless of price movement

Every row carries the current and previous price, the change in points and in percent, current and previous volume, liquidity, best bid, best ask, spread, the market question, its tags, event title and a link to the market on Polymarket.

Example output

This is one row from the dataset, one paid signal:

{
"signal_type": "price_move",
"condition_id": "0x6a94c71414b75c00edafa80ebae3a4fe44e624ce074a3bde6dd57c923d0a0d5f",
"question": "Spread: Newcastle United FC (-1.5)",
"outcome_yes": "Newcastle United FC",
"price_now": 0.065,
"price_then": 0.79,
"price_change_points": -0.725,
"price_change_pct": -91.77,
"window_minutes": 60,
"actual_window_minutes": 30.55,
"window_source": "history",
"volume_24h_now": 48140.8,
"volume_24h_then": 35543.02,
"volume_change_pct": 35.44,
"liquidity": 2005.29,
"best_bid": 0.03,
"best_ask": 0.1,
"spread": 0.07,
"end_date": "2026-09-19T14:00:00Z",
"market_url": "https://polymarket.com/event/epl-new-hul-2026-09-19-more-markets",
"detected_at_iso": "2026-09-19T16:01:16.882491+00:00",
"created_at_iso": "2026-09-06T05:00:45.089159Z",
"age_hours": 323,
"volume_direction": "down",
"tags": ["sports", "games", "soccer", "premier-league", "EPL"],
"event_slug": "epl-new-hul-2026-09-19-more-markets",
"event_title": "Newcastle United FC vs. Hull City AFC - More Markets",
"game_id": 90114111,
"signal_strength": 24.17
}

volume_spike and new_market rows have the same structure, only signal_type and which thresholds fired differ.

How it works

The Actor keeps a short price and volume history in a named key-value store on your account. Each run reads that history, compares it against live data, and writes the history back.

The first run has no stored history to compare against, so it records a baseline. It can still return price_move signals right away, computed from Polymarket's own 1 hour price change, see Limits below. Volume spikes and new market signals need a second run before they can fire.

When a run produces no signals, it writes a single free run_summary row instead of leaving the dataset empty. That row tells you how many markets were checked, how many candidates were suppressed, and why nothing fired. It is not charged. Filter on signal_type if you only want real signals.

Set Comparison window, minutes close to how often you schedule the run. If you run hourly, use 60. If you run every 15 minutes, use 15. The Actor looks for the stored point closest to that window and reports the age it actually used in actual_window_minutes, which is almost always a few minutes off the window you asked for. That is the real interval the comparison was made over.

Quick start

  1. Leave the defaults and press Start. This run records a baseline and can already return price_move signals, see Limits below.
  2. Wait roughly as long as your comparison window, then press Start again to get the full set of signal types.
  3. When the output looks right, create a schedule with the same input and the same interval.

Results land in the dataset and can be sent onward through the Integrations tab: webhooks, Slack, Zapier, Make, n8n and the rest.

What a run costs

You pay per signal that reaches the dataset. Suppressed candidates, filtered markets and run_summary rows are not charged. Platform costs are included in the price of each signal, nothing extra is billed on top.

Price per signal depends on your Apify plan:

Signal typeFreeStarterScaleBusiness
Price move$0.0150$0.0100$0.0080$0.0060
Volume spike$0.0150$0.0100$0.0080$0.0060
New market$0.0100$0.0070$0.0050$0.0040

Max signals per run is the ceiling, 5 by default. Signals are ranked by strength first, so the cap keeps the strongest ones. That makes the worst case of any single run:

5 x $0.015 = $0.075 on Free, down to 5 x $0.006 = $0.03 on Business.

On an hourly schedule, that worst case works out to $54.00 a month on Free and $21.60 a month on Business, with Starter and Scale in between. Most runs return fewer than five signals, so the real figure is lower. Raise the cap for full coverage, lower it to tighten the ceiling.

The Actor start fee is $0.00005 at 512 MB of memory, the same on every plan, and one such fee per extra gigabyte above 1 GB.

Tuning the output

Too many signals: raise Minimum price move, percent, raise Minimum 24 hour volume to work on a smaller and more liquid universe, raise Min price move for volume spikes to drop volume spikes with no real price movement, raise Minimum hours until market end to skip markets that are about to conclude, or lower Max signals per run.

Too few signals: lower the move thresholds, lower Minimum liquidity and Minimum 24 hour volume, or raise Max markets per run.

Check signals_dropped_by_cap on your rows. If it is regularly above 0, the market is producing more qualifying signals per run than Max signals per run lets through, and raising that cap will get you the rest of them.

Only the markets you care about: fill Market slugs or Condition IDs to watch a fixed list, or use Include tags to keep a theme such as politics or crypto. In watchlist mode the liquidity and volume filters do not apply, since you named the markets yourself. The end_date filters still apply even in watchlist mode.

Limits worth knowing before you start

Schedule interval and comparison window belong together. If the interval is much longer than the window, a market may have no usable history point. It accepts points between a quarter and four times the window, so a missed run or a few minutes of drift will not break the chain. When a market still has nothing usable, price move signals fall back to Polymarket's own 1 hour price change, see below. Volume spikes and new market signals have no such fallback and simply will not fire for that market until it has a real comparison point.

Above 180 minutes the Actor falls back to Polymarket's own 24 hour price change until it has collected enough history of its own. In those rows window_source is gamma_1d and actual_window_minutes is 1440, so the comparison really is against 24 hours ago, not against the window you set. Volume spikes have no such fallback and simply will not fire until history builds up.

When a market has no usable comparison point, price moves fall back to Polymarket's own 1 hour price change. This covers two cases: the very first run, when there is no history at all yet, and any later run where a specific market's own history has nothing recent enough, for example after a missed schedule or a market that just fell outside the accepted age range. In both cases the Actor reads Polymarket's oneHourPriceChange and can emit a price_move signal from it, with window_source set to gamma_1h and actual_window_minutes at 60. Check window_source on any row to see whether the comparison came from the Actor's own stored history or from this fallback. Volume spikes and new market signals have no such fallback and simply will not fire until a market has a real comparison point.

New market signals are off by default. In a broad scan they mostly surface sports sub-markets with no trading yet, which is noise you would be paying for. Turn them on together with a watchlist or a tag filter.

Markets near either end of the price scale are skipped. By default a signal is suppressed when the old or the new price sits outside 0.05 to 0.95, because a market that is already settling produces large percentage moves that mean nothing. Set Minimum price for a signal to 0 if you want to see those collapses.

A volume spike needs a price move too, not just a percent. In testing, about 64 percent of raw volume spikes moved the price by less than 0.01 points, usually the 24 hour window rolling forward rather than real trading. Volume growth above 500 percent also looked dramatic on its own, but 72 percent of those rows started from under $5,000 in 24 hour volume, so the percentage was inflated by a small base. Min price move for volume spikes and Minimum volume spike, dollars filter both cases out.

Watching by slug is more reliable than by condition ID. A few markets cannot be looked up by condition ID directly. The Actor logs them and carries on with the rest.

Auto-generated recurring markets are excluded, such as the five-minute crypto up or down contracts Polymarket creates around the clock. Turn them back on with the checkbox if you want them.

Markets whose end_date has already passed are always skipped, for every signal type, with no input to turn this off. A market past its listed end date is settling, not repricing: its price sliding toward 0 or 1 reflects an outcome that is already known, not new information worth paying for. Set Minimum hours until market end above 0 to also skip markets that are still open but about to conclude, for the same reason.

Output fields

FieldMeaning
signal_typeprice_move, volume_spike, new_market, or run_summary for a run with no signals
signal_strengthHow many times over its threshold the signal went. Used for ranking
signals_dropped_by_capHow many signals this run's maxSignalsPerRun cap dropped. Same value on every row of the run, 0 if nothing was dropped. Not set on a run_summary row
noteOn a run_summary row, why the run produced no signals
markets_checked, candidates_suppressedOn a run_summary row, how many markets passed the filters and how many candidates were suppressed
volume_spikes_suppressed_min_price_moveOn a run_summary row, how many volume spike candidates were suppressed by minPriceMoveForVolumeSpike specifically. Counted within candidates_suppressed
price_now, price_thenPrice at this run and at the comparison point, on the 0 to 1 scale
price_change_points, price_change_pctAbsolute and relative change
volume_24h_now, volume_24h_then, volume_change_pctSame for 24 hour volume
window_minutes, actual_window_minutesRequested window and the age of the point actually used
window_sourcehistory for a stored point, gamma_1d for the long window fallback, gamma_1h for the 1 hour price change fallback, used on the first run and on any later run where a market has no usable history point
liquidity, best_bid, best_ask, spreadOrder book context at the time of the signal
question, slug, outcome_yes, end_dateMarket identity
event_title, event_slug, tags, market_urlEvent context and link
condition_idStable market identifier, use it for a watchlist
detected_at_iso, created_at_iso, age_hoursWhen the signal fired and how old the market is

Running several monitors

All runs on your account share one history store by default, which is what you want: change a threshold and the history stays. If you run two monitors with different watchlists and want their histories kept apart, give each a different State key.