# Run a scraper on a schedule

> I want a script that checks a few websites four times a day and saves what it finds, without paying for a machine that sits idle.

A scheduled scraper runs for minutes a day and is idle the rest. What matters is where the schedule lives and where the results go, not the machine. A schedule inside a sleeping machine does not fire, so look for providers whose platform starts the run.

Guide page: https://botperch.com/use-cases/scheduled-scraper/

**Short answer:** The cheapest machine that runs it as described is Modal at $0.00 a month, then Agent 37 ($0.15) and Runtime ($0.50). 16 of 16 providers run it without a catch. Any AI model is billed separately and not priced here. List prices checked 29 October 2026.

A scraper fetches a set of pages, picks out the fields you care about (prices, listings, headlines) and writes them to a file or database. Pages that build themselves with JavaScript need a **headless browser**, a real browser such as Chromium running without a screen, driven by a tool like [Playwright](https://playwright.dev/docs/intro). Plain pages only need a download.
The schedule is usually written as a **cron** expression, a short line such as "run at 6, 12, 18 and 24 o'clock" named after the Unix tool that runs jobs on a timetable. The key question is who keeps that clock. Agent 37 says it directly: "a crontab inside the container only runs while the container is running" ([Agent 37](https://www.agent37.com/docs/agents-api/crons)).
So there are two designs: a scheduler run by the platform that starts a fresh machine for each run (cheap), or a machine that stays on all month with its own timer (simple, and billed around the clock).

## What it needs

- **Machine size:** No vendor publishes one. 1 vCPU / 2 GiB / 10 GiB fits a headless browser and logs; Battleships models one browser visit at 1 vCPU / 2 GiB / 5 GiB. Plain downloads fit in 1 GiB. [source](https://battleships.dev/data/presets.json)
- **Does it stay on?:** No, if the schedule lives outside the machine. Four ten-minute runs a day is about 20 machine-hours a month, not 730. A timer inside the machine only works if the machine stays on. [source](https://www.agent37.com/docs/agents-api/crons)
- **What must survive a restart:** The results, kept outside the run: Runtime's jobs, for example, start "a fresh sandbox" every time and tell you to put data on a volume. Also cookies if a site needs a login, and a marker of what was already saved so a rerun does not duplicate rows. [source](https://withruntime.com/docs/jobs)
- **Browser, Docker, GPU:** A browser only for pages built with JavaScript; it is the largest memory cost. Docker is optional. A database is optional on the machine but needed somewhere. No GPU. [source](https://playwright.dev/docs/intro)
- **How busy it is:** Busy while a run is open: about 40% CPU in Battleships' scraping workload, because a browser does real work. Idle for the rest of the day. [source](https://battleships.dev/data/rankings/scrape.json)

## Picks

- **boxd**, If you want the machine to wake for the schedule: The platform keeps the schedule and wakes the machine shortly before each run, so it can sleep in between. Four ten-minute runs a day is about $1.50 a month. Watch: The schedule is written as a script file, and the $30 of starting credit needs a card. https://docs.boxd.sh/guides/automations/jobs
- **Runtime**, If you want a fresh machine each run: Scheduled jobs start a clean sandbox on a cron and keep each run's output on a Jobs page. CPU is billed only while it works: about $0.50 a month here. Watch: Nothing on a job's own disk survives the run; save results to a volume or your own database. One US region. https://withruntime.com/docs/jobs
- **Lizard**, If you do not want to write code: The one-click n8n template gives you a visual schedule, web and browser steps, and a database for the results, inside the $19 monthly plan. Watch: n8n stays on all month to keep its schedule, so it costs more than the run itself. It runs on Lizard's app platform, not the sandbox the calculator prices. https://lizard.build/deploy/n8n--n8n

## How to run it on each provider

- **Lizard** (one-click; no terminal: yes): Lizard's sandboxes have no scheduler, but its one-click n8n template gives you n8n's Schedule Trigger and a PostgreSQL database for the results. Build the scrape as a workflow. [Lizard: Deploy n8n](https://lizard.build/deploy/n8n--n8n)
- **boxd** (guide; no terminal: partly): The best fit among the sandboxes: a schedule in a script, and the platform "wakes a sleeping machine, on standby or hibernated, shortly before" it is due. A missed slot runs once on wake. [boxd: jobs](https://docs.boxd.sh/guides/automations/jobs)
- **Runtime** (guide; no terminal: partly): Scheduled jobs run a command in a fresh sandbox on a cron, keep its output and exit code, and show up on a Jobs page in your account. Results go to a volume or your own storage. [Runtime: scheduled jobs](https://withruntime.com/docs/jobs)
- **Cloudflare Sandbox** (guide; no terminal: partly): The schedule is a Workers feature, Cron Triggers: the scheduled Worker can start a sandbox for the scrape. Each run gets up to 15 minutes of CPU on the paid plan. [Cloudflare: Cron Triggers](https://developers.cloudflare.com/workers/configuration/cron-triggers/)
- **Vercel Sandbox** (guide; no terminal: partly): Vercel Cron Jobs call a function, which can start a sandbox. The free Hobby plan runs crons only once a day, which is too rare here; Pro allows once a minute. [Vercel: cron job limits](https://vercel.com/docs/cron-jobs/usage-and-pricing)
- **Agent 37** (guide; no terminal: partly): Platform crons fire "whether the instance is awake or asleep", but they wake an agent and give it a prompt, and are not offered on the base or n8n templates. For a script, the n8n template with auto-sleep off is the other route. [Agent 37: crons](https://www.agent37.com/docs/agents-api/crons)
- **Modal** (guide; no terminal: no): A schedule attaches to a Modal function written in code; the function can do the scrape or start a sandbox. [Modal: scheduled functions](https://modal.com/docs/guide/cron)
- **Blaxel** (guide; no terminal: no): Sandbox schedules run a command inside a sandbox on a cron, with a run history; up to 100 per sandbox. Set up from code or the API. [Blaxel: schedules](https://docs.blaxel.ai/Sandboxes/Schedules)
- **Boat** (manual; no terminal: partly): No scheduler. A timer inside a machine left on works, but the machine is billed all month; otherwise something outside has to start a sandbox per run. [Boat: always-on services](https://docs.boat.dev/long-running-tasks/always-on-services)
- **Daytona** (manual; no terminal: no): No scheduler found. A scheduler of your own calls Daytona's API to create a sandbox for each run. [Daytona docs](https://www.daytona.io/docs/en/)
- **E2B** (manual; no terminal: no): No scheduler found. E2B is driven from code, so the schedule lives in your app or another service. [E2B docs](https://e2b.dev/docs)
- **InstaBox** (manual; no terminal: no): No scheduler found. A machine wakes on an API call or a visit to its public address, so an outside scheduler can start each run. [InstaBox: concepts](https://instabox.sh/docs/concepts)
- **Morph** (manual; no terminal: no): No scheduler found. An outside scheduler can wake a Devbox with a web request, but its own clock stops while it is paused. [Morph: wake on request](https://cloud.morph.so/docs/documentation/instances/wake-on)
- **Sandboxer** (manual; no terminal: no): No scheduler found. Idle pause and auto-stop are adjustable, so an outside scheduler plus the API is the route. [Sandboxer: long-running tasks](https://sandboxer.com/docs/long-running)
- **Sprites** (manual; no terminal: no): No scheduler found. The Tasks API keeps a Sprite awake during a run, but something outside has to start it. [Sprites: keeping Sprites running](https://docs.fly.io/sprites/keeping-sprites-running.md)

## Monthly machine cost (preset `scraper`)

Four ten-minute runs a day, 120 a month (20 machine-hours), each on a fresh 1 vCPU / 2 GiB / 10 GiB machine thrown away afterwards; the results go to your own storage. The CPU is about 40% busy while a headless browser renders pages. No model.

- Modal: $0.00
- Agent 37: $0.15
- Runtime: $0.50
- Morph: $1.00
- Tensorlake: $1.20
- Sprites: $1.33
- boxd: $1.52
- Blaxel: $1.66
- E2B: $1.66
- Daytona: $1.67
- Cloudflare Sandbox: $5.99
- Lizard: $19.00
- Boat: $20.00
- InstaBox: $20.00
- Sandboxer: $20.00
- Vercel Sandbox: $20.00

## Outside a sandbox

Many scrapes need no sandbox at all. [Cloudflare Workers Cron Triggers](https://developers.cloudflare.com/workers/platform/pricing/) can fetch and parse pages for free up to 100,000 requests a day, or within the $5 monthly paid plan. [Vercel Cron Jobs](https://vercel.com/docs/cron-jobs/usage-and-pricing) are included on every plan but run only once a day on Hobby. [Modal](https://modal.com/docs/guide/cron) schedules have no plan fee. [n8n's Schedule Trigger](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger) is free self-hosted, or from €20 a month on n8n Cloud.

## Sources

- [Agent 37: crons](https://www.agent37.com/docs/agents-api/crons)
- [boxd: jobs](https://docs.boxd.sh/guides/automations/jobs)
- [Runtime: scheduled jobs](https://withruntime.com/docs/jobs)
- [Cloudflare: Cron Triggers](https://developers.cloudflare.com/workers/configuration/cron-triggers/)
- [Vercel: cron jobs](https://vercel.com/docs/cron-jobs)
- [Playwright: introduction](https://playwright.dev/docs/intro)
- [Battleships: scraping workload (built by the Boat team)](https://battleships.dev/data/rankings/scrape.json)
