GPU Restock Monitor - Verified Alerts with Proof
Pricing
from $60.00 / 1,000 verified transition rows
GPU Restock Monitor - Verified Alerts with Proof
Track RTX 5080 and GPU restocks across Best Buy and Newegg (proven Oct 2026) with verified in-stock transitions and evidence URLs for PC builders. $0.10 per verified-transition-row; checks, blocks, suppressed soft-200s $0. Rows carry source URL, checked timestamp, and verified-transition notice.
Pricing
from $60.00 / 1,000 verified transition rows
Rating
0.0
(0)
Developer
steadyworks
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a month ago
Last modified
Categories
Security
Limited permissionsShare
Get verified GPU restock alerts with proof rows from retailer product pages. Paste one watchlist of GPU SKU URLs in, get one row per verified in-stock or price-drop transition with source URL, checked time, and verified-transition notice. GPU Restock Monitor tracks RTX 5080 and GPU restocks across retailer product pages for PC builders — checks cost $0, verified rows cost $0.10 each, capped at $5.00 per run. [Click Try for free — input opens prefilled. Start as-is, check rows, then raise your watchlist.]
What it does and what you get
Track GPU restocks without watching product pages all day. GPU restock data with verified alerts, restock monitor checks, and evidence URLs on every row.
- One watchlist in (1–50 Newegg + Best Buy product-page URLs), verified transition rows out
- Restock + price-drop detection against your stored baseline — price rises are never reported as restocks
- Every row carries source URL + ISO checked timestamp + verified-transition notice
- Quiet runs emit 0 rows and bill $0 — silence is a correct output, not a failure
- Best Buy pages run on a guarded best-effort path with per-retailer health on every run
- Hourly cadence only (
scheduleHours: 1) — realtime polling is not offered - Buyer ceiling (
ceilingUsd) + per-run cap (perRunCapUsd, max $5.00) bound every run
Quick start
- Click Try for free — input opens prefilled with the 4-URL demo watchlist ($0.20 demo with synthetic URLs, no retailer touched — or delete down to 1 URL for the $0 free check).
- Keep the prefilled
watchlist+storedBaseline+observationsfor the first run (4 observations in → 2 finding rows out). - Click Save & Start, then open the Dataset tab for
findingRowsand the Key-value store tab (OUTPUTrecord) for totals. - Re-run the same input unchanged to see the quiet shape: 0 rows,
quiet: true, $0. - Swap in your own 1–50 Newegg / Best Buy product-page URLs and run again, then raise volume or set a schedule once row shape looks right.
Input
Minimal JSON (required-only, copy-paste — matches the Console prefill byte-for-byte):
{"watchlist":{"partition":"P1","partitionMode":"armed","priceDropPct":5,"scheduleHours":1,"skuUrls":["https://www.newegg.com/p/synthetic-rtx5080-01","https://www.bestbuy.com/site/synthetic-rtx5080-01","https://www.newegg.com/p/synthetic-rx9070-01","https://www.bestbuy.com/site/synthetic-rtx5080-02"],"watchlistId":"syn-watch-01"}}
Full demo JSON (all prefilled defaults — paste as-is for the 4-in → 2-out demo):
{"watchlist":{"partition":"P1","partitionMode":"armed","priceDropPct":5,"scheduleHours":1,"skuUrls":["https://www.newegg.com/p/synthetic-rtx5080-01","https://www.bestbuy.com/site/synthetic-rtx5080-01","https://www.newegg.com/p/synthetic-rx9070-01","https://www.bestbuy.com/site/synthetic-rtx5080-02"],"watchlistId":"syn-watch-01"},"storedBaseline":{"watchlistId":"syn-watch-01","variants":[{"availability":"out-of-stock","checkedAt":"2026-09-28T11:15:00Z","lastPrice":999,"retailer":"newegg","sku":"SYN-RTX5080-16G-NE","variantId":"syn-rtx5080-ne-01"},{"availability":"in-stock","checkedAt":"2026-09-28T11:15:00Z","lastPrice":1099,"retailer":"bestbuy","sku":"SYN-RTX5080-16G-BB","variantId":"syn-rtx5080-bb-01"},{"availability":"in-stock","checkedAt":"2026-09-28T11:15:00Z","lastPrice":599,"retailer":"newegg","sku":"SYN-RX9070-16G-NE","variantId":"syn-rx9070-ne-01"}]},"observations":[{"adapterHealth":"ok","availability":"in-stock","checkedAt":"2026-09-28T12:00:00Z","price":999,"sourceUrl":"https://www.newegg.com/p/synthetic-rtx5080-01","variantId":"syn-rtx5080-ne-01"},{"adapterHealth":"degraded","availability":"in-stock","checkedAt":"2026-09-28T12:00:00Z","price":999,"sourceUrl":"https://www.bestbuy.com/site/synthetic-rtx5080-01","variantId":"syn-rtx5080-bb-01"},{"adapterHealth":"ok","availability":"in-stock","checkedAt":"2026-09-28T12:00:00Z","price":599,"sourceUrl":"https://www.newegg.com/p/synthetic-rx9070-01","variantId":"syn-rx9070-ne-01"},{"adapterHealth":"degraded","availability":"in-stock","checkedAt":"2026-09-28T12:00:00Z","price":899,"sourceUrl":"https://www.bestbuy.com/site/synthetic-rtx5080-02","variantId":"syn-rtx5080-bb-02"}],"nowIso":"2026-09-28T12:00:00Z"}
| field | type | required | default | units | limits |
|---|---|---|---|---|---|
watchlist.watchlistId | string (slug) | yes | — | id | lowercase a-z0-9-, 1–64 chars; same id reuses state, new id forks state |
watchlist.skuUrls | array of string (URL) | yes | — | items | 1–50 https Newegg/Best Buy product-page URLs per run; 51st URL is rejected pre-run at $0; each URL max 500 chars |
watchlist.partition | enum P1/P2/P3 | yes | — | — | P1 is day-1; P2/P3 stay quiet until their signal fires |
watchlist.partitionMode | enum armed/quiet | yes | — | — | armed checks this run; quiet emits nothing |
watchlist.priceDropPct | number | yes | — | percent | 0–100; drop vs stored baseline that arms a price verdict |
watchlist.scheduleHours | number | yes | — | hours | const 1; hourly only |
watchlist.ceilingUsd | number or null | no | omitted = none | USD | minimum 0; optional buyer price ceiling for drop alerts |
storedBaseline | object | no | — | — | pass every run; watchlistId must match or every observation is ignored; unknown variantIds ignored, never billed |
observations | array of object | no | — | — | evidence vectors: price, availability, sourceUrl, checkedAt per variantId |
partitionSignal | object | no | omitted | — | arming signal for P2/P3 only; omit when there is none |
perRunCapUsd | number | no | 5 | USD | 0–5 max; worst case 50 URLs × $0.10 = $5.00; a capped run stops with counts published |
capMode | enum capped/complete-input | no | capped | — | capped = max $5.00 for up to 50 rows; complete-input = processes the entire input, worst case $Y (your URL count × $0.10) quoted before any charge, never above the absolute $5.00 ceiling; $Y over $5.00 fails closed to capped; schedules/tasks always run capped |
nowIso | string | no | 2026-09-28T12:00:00Z | ISO-8601 date | evidence clock; override for live timestamps |
Job recipes (one line each):
single-GPU smoke check: 1 Newegg URL + 1 baseline variant + 1 observation → 1 restock rowbuyer restock watch: 4-URL retailer-pair watchlist (above) → 1 restock + 1 price-dropquiet re-run proof: resend settled state → 0 rows,quiet: true, $0price-drop only: setpriceDropPct: 10on an in-stock baseline → drops ≥10% alert onlycapped sweep: 50 URLs +perRunCapUsd: 5→ at most 50 rows / $5.00 per run
Output
Dataset default (findingRows): one row per verified transition. Key-value record OUTPUT (runReport): billedRows, billedAmountUsd, rowIds, quiet flag, per-retailer health, typed misses. Runs that verify with no new transitions emit 0 rows with quiet: true — a correct-empty SUCCEEDED run.
| field | type | notes |
|---|---|---|
rowId | string slug | stable <variantId>-<transition> id |
watchlistId | string slug | back-reference to input watchlist |
sku / variantId | string | normalized SKU + baseline identity |
retailer | enum newegg/bestbuy | newegg full-fidelity; bestbuy guarded best-effort |
partition | enum P1/P2/P3 | scope key part 2 |
transition | enum restock/price-drop/price-rise | price-rise is reserved and never emitted by the detector |
sourceUrl | string (URL) | evidence URL of the transition |
checkedAt | string | ISO-8601 verification time |
notice | string ≤280 chars | required notice with verified-transition literal |
oldPrice / newPrice | number or null | baseline vs post-transition price; null on pure availability moves |
adapterHealth | enum ok/degraded | per-row adapter health |
billable / billableEvent / unitPriceUsd | boolean / const / const | true / verified-transition-row / 0.1 on every emitted row |
Real example rows (shortened for viewing — full rows carry all 16 fields above):
{"rowId":"syn-rtx5080-ne-01-restock","watchlistId":"syn-watch-01","sku":"SYN-RTX5080-16G-NE","retailer":"newegg","partition":"P1","variantId":"syn-rtx5080-ne-01","transition":"restock","sourceUrl":"https://www.newegg.com/p/synthetic-rtx5080-01","checkedAt":"2026-09-28T12:00:00Z","notice":"verified transition: restock; evidence URL https://www.newegg.com/p/synthetic-rtx5080-01; checked at 2026-09-28T12:00:00Z; partition P1","adapterHealth":"ok","billable":true,"billableEvent":"verified-transition-row","unitPriceUsd":0.1,"oldPrice":999,"newPrice":999}
{"rowId":"syn-rtx5080-bb-01-price-drop","watchlistId":"syn-watch-01","sku":"SYN-RTX5080-16G-BB","retailer":"bestbuy","partition":"P1","variantId":"syn-rtx5080-bb-01","transition":"price-drop","sourceUrl":"https://www.bestbuy.com/site/synthetic-rtx5080-01","checkedAt":"2026-09-28T12:00:00Z","notice":"verified transition: price-drop; evidence URL https://www.bestbuy.com/site/synthetic-rtx5080-01; checked at 2026-09-28T12:00:00Z; partition P1","adapterHealth":"degraded","billable":true,"billableEvent":"verified-transition-row","unitPriceUsd":0.1,"oldPrice":1099,"newPrice":999}
Rows above shortened for viewing. Input URLs match output sourceUrl values. Login-walled pages return requiresAuth with no row — never a guessed value. Oversize, unreachable, or unknown-variant observations are skipped at $0 with typed misses in OUTPUT.
How much will it cost?
from $100.00 / 1,000 verified-transition rows. Billable event: verified-transition-row — fires once per row that passes verification and is published. Checks, blocks, suppressed soft-200 pages, seed runs, and quiet re-runs are never billed. Empty runs bill $0 plus the platform run-start line below.
| plan | $/1k verified rows |
|---|---|
| Free / Starter / Scale / Business | $100.00 (that is $0.10 per row on every tier) |
Worked math (realistic transition rates, + $0.00005 platform run-start per run):
- Demo run: 4 URLs → 2 verified rows = 2 × $0.10 = $0.20 + start.
- Quiet month: 10 SKUs × hourly checks × 30 days, 0 transitions → $0.00 + starts (720 starts ≈ $0.04).
- Active builder month: 8 verified transitions → 8 × $0.10 = $0.80 + starts.
- Spike month: 15 verified transitions → 15 × $0.10 = $1.50 + starts.
- Capped worst case: full 50-URL run → at most 50 × $0.10 = $5.00; the run stops with counts published.
- Max $5.00/run for up to 50 rows — lands SUCCEEDED at the cap;
complete-inputkeeps the same $5.00 ceiling with an explicit quote (worst case $Y computed from your input, never above $5.00). A complete-input run quotes its $Y in the first log line + OUTPUT before any charge; $Y over $5.00 fails closed to capped; schedules and tasks always run capped.
Cap and quiet-cost notes: perRunCapUsd (max $5.00) is the spend ceiling — omitted caps default to $5.00 and the ceiling never rises above $5.00. A buyer max-charge pin only lowers how many rows publish before the same counts-published stop. Machine line: one $0.00005 platform run-start per run; no proxy or AI add-on charges from this Actor; compute units apply per platform pricing. See the Pricing tab — the Console price is authoritative.
event:verified-transition-row | $/1k per tier Free/Starter/Scale/Business 100.00/100.00/100.00/100.00 | includes_usage:false | billed_on_empty:false | caps:[perRunCapUsd,maxItems:50] | quiet:[actor-start]
Trial and free tier
Click Try for free — input opens prefilled. Start as-is, check rows, then raise cap.
- $5 platform credit ≈ 50 verified rows at $0.10 each (or hundreds of $0 quiet checks).
- Free check: 1 SKU URL one-shot per watchlistId at $0 — run once with a single SKU to see a verified transition with proof; 0 charge calls.
- Second use of the same watchlistId converts to the paid full watch with an upgrade notice (
Free check used — full watch $0.10 per verified-transition-row; checks $0; per-run cap $5.00), $0 billed on the conversion run, nothing emitted, state unchanged. - No card required for the trial. Paid plans unlock higher caps and volume.
Compatibility
Works with any retailer product page exposing price + availability literals. Verified live:
- Newegg — in-stock / out-of-stock product-page pair, Oct 2026 (one verified restock row, out-of-stock side correctly quiet)
- Best Buy — live in-stock product page, Oct 2026 (correctly quiet clean-read on the guarded path)
Not covered: search / list result pages, login-walled pages, JavaScript-rendered prices with no readable literals. These return nothing (quiet) or requiresAuth — never a guessed price.
Not affiliated with, sponsored, or endorsed by Newegg or Best Buy. Store names belong to their owners.
What people use it for and what it does NOT do
- PC-builder RTX 5080 restock watch across Newegg + Best Buy
- Single-GPU smoke check before wiring a schedule or task
- Quiet re-run proof that no-change nights cost $0
- Price-drop watch with a buyer ceiling on stocked SKUs
- Hourly standing watch via schedule with alert-only-on-rows handling
What this Actor does NOT do:
- Does not buy, reserve, checkout, or hold any GPU
- Does not read search / list pages, login-walled pages, or cart state
- Does not poll faster than hourly; does not render bot-walled pages into guessed rows
- Does not report price rises as restocks
Use with schedules, webhooks, API, and MCP
Schedule (alert only when rows > 0): create a daily/hourly schedule on the Actor or its published task, then add a webhook on ACTOR.RUN.SUCCEEDED that posts run + dataset IDs to your URL; your receiver fetches dataset items and alerts only when item count > 0.
Webhook (ID-only payload): ACTOR.RUN.SUCCEEDED + ACTOR.RUN.FAILED → POST JSON with run ID + dataset ID; fetch rows via Get-Dataset-Items in batches. Never push row contents through the webhook body.
MCP (Apify Actors MCP server):
{"mcpServers":{"apify":{"command":"npx","args":["-y","@apify/mcp-server"],"env":{"APIFY_TOKEN":"<your-token>"}}}}
Then call call-actor on steadyworks/gpu-restock-monitor with the Input JSON above, poll get-actor-run, then get-dataset-items. call-actor waits ≤45s — poll the run or use webhooks for longer watches, never block.
API one-liners (replace <TOKEN>, <RUN-ID>, <DATASET-ID>):
$curl -H "Authorization: Bearer <TOKEN>" -H "Content-Type: application/json" -d '{"watchlist":{"watchlistId":"syn-watch-01","skuUrls":["https://www.newegg.com/p/synthetic-rtx5080-01"],"partition":"P1","partitionMode":"armed","priceDropPct":5,"scheduleHours":1}}' "https://api.apify.com/v2/acts/steadyworks~gpu-restock-monitor/runs?token=<TOKEN>"
await client.actor("steadyworks/gpu-restock-monitor").call({ watchlist: { watchlistId: "syn-watch-01", skuUrls: ["https://www.newegg.com/p/synthetic-rtx5080-01"], partition: "P1", partitionMode: "armed", priceDropPct: 5, scheduleHours: 1 } });
client.actor("steadyworks/gpu-restock-monitor").call(run_input={"watchlist": {"watchlistId": "syn-watch-01", "skuUrls": ["https://www.newegg.com/p/synthetic-rtx5080-01"], "partition": "P1", "partitionMode": "armed", "priceDropPct": 5, "scheduleHours": 1}})
Troubleshooting
| symptom | cause | fix |
|---|---|---|
| 0 rows on first run | settled state — baseline already matches observations | expected when nothing changed; check OUTPUT.quiet: true and misses for the per-variant reason |
| 0 rows on a live watch | out-of-stock pages or quiet partitions | check sourceUrl pages show an in-stock literal; set partitionMode: armed and send a partition signal for P2/P3 |
requiresAuth in misses | login-walled page | use a public product URL; login-walled pages are never guessed |
| 51st URL rejected, $0 | over the 50-URL per-run boundary | split across runs or schedules; each run takes 1–50 URLs |
| run stops with counts only | per-run cap, lifted-ceiling trip, or buyer max-charge reached | capped runs: raise perRunCapUsd (max $5.00) and re-run to collect rows; complete-input runs already cover the whole input up to $5.00 — re-check the lifted-cap-trip / pin line in OUTPUT; counts stay in OUTPUT |
| unknown variantIds ignored | observation id has no baseline match | add the variant to storedBaseline.variants with matching watchlistId |
| degraded Best Buy health | guarded path under load or blocks | retry next hour; repeated blocks pause that adapter per its kill-switch, Newegg rows still publish |
FAQ and legality
Does this change my data? No — read-only checks of public product pages; it never edits carts, accounts, or listings.
How much for one watch? Demo watch (4 URLs → 2 rows) ≈ $0.20. A quiet 10-SKU month ≈ $0 + starts. An 8-transition month ≈ $0.80. Worst case is $5.00 per run (50 rows).
Why did a quiet run bill $0? Only published verified-transition rows bill. Checks, blocks, suppressed pages, and re-runs of settled state emit nothing and bill nothing.
Do I need logins or API keys? No. Public https product pages only; sign-in-walled pages return requiresAuth, never a row.
Personal data / GDPR? Processes public price + availability literals only. No buyer credentials are collected; pass only product-page URLs you are allowed to check.
Terms? Check retailer Terms and robots rules before scheduling watches; hourly cadence is the maximum. Store names belong to their owners; no affiliation, endorsement, or sponsorship implied.
Other Actors you might need
| need | actor |
|---|---|
| single-product price history | search Store for a price-tracker with history charts |
| multi-site search-page breadth | search Store for a search-results scraper (this Actor reads product pages, not search pages) |
| full-catalog crawl | search Store for a site crawler, then feed URLs here as a watchlist |
Changelog and support
./CHANGELOG.md · Questions or breakage: Actor Discussion / Issues tab (replies stay visible); charge disputes to platform support. No SLA on this validation build.