# GPU Restock Monitor - Verified Alerts with Proof (`steadyworks/gpu-restock-monitor`) Actor

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.

- **URL**: https://apify.com/steadyworks/gpu-restock-monitor.md
- **Developed by:** [steadyworks](https://apify.com/steadyworks) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $60.00 / 1,000 verified transition rows

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## GPU Restock Monitor - Verified Alerts with Proof

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

1. 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).
2. Keep the prefilled `watchlist` + `storedBaseline` + `observations` for the first run (4 observations in → 2 finding rows out).
3. Click **Save & Start**, then open the **Dataset** tab for `findingRows` and the **Key-value store** tab (`OUTPUT` record) for totals.
4. Re-run the same input unchanged to see the quiet shape: 0 rows, `quiet: true`, $0.
5. 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):

```json
{"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):

```json
{"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 row
- `buyer restock watch`: 4-URL retailer-pair watchlist (above) → 1 restock + 1 price-drop
- `quiet re-run proof`: resend settled state → 0 rows, `quiet: true`, $0
- `price-drop only`: set `priceDropPct: 10` on an in-stock baseline → drops ≥10% alert only
- `capped 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):

```json
{"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}
```

```json
{"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}
```

<details>
<summary>Full run report (OUTPUT record, shortened for viewing)</summary>

```json
{"watchlistId":"syn-watch-01","partition":"P1","quiet":false,"transitionCount":2,"billedRows":2,"billedAmountUsd":0.2,"rowIds":["syn-rtx5080-ne-01-restock","syn-rtx5080-bb-01-price-drop"],"adapterHealth":{"bestbuy":"degraded","newegg":"ok"},"notice":"verified transition scan complete; evidence URL set syn-rtx5080-ne-01-restock syn-rtx5080-bb-01-price-drop; checked at 2026-09-28T12:00:00Z; partition P1"}
```

</details>

*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-input` keeps 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):

```json
{"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>`):

```bash
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>"
```

```javascript
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 } });
```

```python
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](./CHANGELOG.md) · Questions or breakage: Actor **Discussion / Issues tab** (replies stay visible); charge disputes to platform support. No SLA on this validation build.

# Changelog

This Actor's version history is a separate document: https://apify.com/steadyworks/gpu-restock-monitor/changelog.md

# Actor input Schema

## `nowIso` (type: `string`):

Run time for this check (ISO instant). Default uses the sample time. Omit to run against live time.

## `observations` (type: `array`):

Current store state for this run (price and availability with source URL and checked time per product). Sample shape: 4 checks.

## `partitionSignal` (type: `object`):

Optional signal for extra region groups. Omit when there is none.

## `perRunCapUsd` (type: `number`):

Per-run spend cap in USD, 0 to 5 max, defaults to 5 when omitted. 50 URLs x $0.10 = $5.00 worst case; the cap stops the run with no rows on trip. Increase the cap and run again to collect rows.

## `capMode` (type: `string`):

Run scope: capped (default, max $5.00 for up to 50 rows) or complete-input (processes the entire input; worst case (your URL count x $0.10) is quoted before any charge, never above $5.00).

## `storedBaseline` (type: `object`):

Saved per-product state (shop plus price and availability). Sample shape: 3 products. Unknown products in checks are ignored, never billed.

## `watchlist` (type: `object`):

Your watchlist: 1-50 Newegg/Best Buy product URLs with region, mode, drop threshold %, and hourly schedule.

## Actor input object example

```json
{
  "nowIso": "2026-09-28T12:00:00Z",
  "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"
    }
  ],
  "partitionSignal": {
    "armedPartitions": [
      "P2"
    ]
  },
  "perRunCapUsd": 5,
  "capMode": "capped",
  "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"
      }
    ]
  },
  "watchlist": {
    "partition": "P1",
    "partitionMode": "armed",
    "priceDropPct": 5,
    "scheduleHours": 1,
    "skuUrls": [
      "https://www.newegg.com/p/synthetic-rtx5080-01"
    ],
    "watchlistId": "syn-watch-01"
  }
}
```

# Actor output Schema

## `findingRows` (type: `string`):

Verified restock/price rows (source URL, checked time, and verified-transition notice per row; $0.10 per row). Empty when quiet.

## `runReport` (type: `string`):

Summary for this run: row count, billed total, row IDs, quiet result, per-shop access health, and skipped checks.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "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"
        }
    ],
    "storedBaseline": {
        "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"
            }
        ],
        "watchlistId": "syn-watch-01"
    },
    "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"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyworks/gpu-restock-monitor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "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",
        },
    ],
    "storedBaseline": {
        "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",
            },
        ],
        "watchlistId": "syn-watch-01",
    },
    "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",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("steadyworks/gpu-restock-monitor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "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"
    }
  ],
  "storedBaseline": {
    "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"
      }
    ],
    "watchlistId": "syn-watch-01"
  },
  "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"
  }
}' |
apify call steadyworks/gpu-restock-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,steadyworks/gpu-restock-monitor"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/pPnmznEwZ4oIq6U76/builds/FdZI8r1AsxExziu8F/openapi.json
