Schedules & monitoring
Run a request or a template on a schedule, and get told what changed, or only what's new.
A schedule is a /scrape, /batch or /crawl request, or a template, that the platform runs for you on a cron, on your credits. Create one in the dashboard under Automation → Schedules, or from any playground: Schedule opens the editor with the request you were trying, and Save as template keeps it as a template you can schedule.
It has its own page: whether it's running right now (live), when it runs next, its runs, what they found, and its settings.
What it runs
- A page or a request: a URL is enough. Without
fields, the whole page is kept as text (markdown), which is what you watch for changes. The playground's configurator, under Advanced options, edits the full request: fields, steps, browser, proxies, the JSON. - A template, yours or the marketplace's, with its parameters. Each run goes through the template: the fields it learned are reused, and fields that break are repaired. Edit its request instead copies the request into the schedule, no longer tied to the template.
When it runs
A cron has five fields: minute, hour, day of the month, month, day of the week, read in the time zone you choose.
| Cron | Runs |
|---|---|
*/15 * * * * | every 15 minutes |
0 * * * * | every hour, on the hour |
0 9 * * * | every day at 9:00 |
0 9 * * 1-5 | weekdays at 9:00 |
0 9 * * 1 | Mondays at 9:00 |
- Runs are at least 5 minutes apart.
- The editor shows the next runs as you type.
- Run now runs it at once, outside the schedule.
- Each run is logged like any request (source Scheduled in Logs), and listed in the schedule's history.
What it costs
- Each run costs what the same request costs when you send it (credits).
- Each active schedule also costs a small upkeep per day, taken when its day starts (see the price list on the credits page). A paused schedule costs nothing.
- When your balance can't pay a run or a day of upkeep, the schedule pauses and you get an email. Turn it back on once you've added credits.
- A schedule whose request fails 10 times in a row pauses too, with the reason shown.
What to watch
Pick one of three modes:
| Mode | What you hear about |
|---|---|
| Just collect | nothing: the runs are logged (and exported), without comparison |
| Any change | each run compared with the previous one: items added and removed, values that moved |
| New items only | items never seen before; what's already been seen, even if it comes back later, stays quiet |
How lists are compared:
- Items are told apart by what identifies them: an
id, aurl/link, atitle/name, whichever is unique in the list. So one new listing at the top is one addition, not every item moving down by one; an item whose price changed is one change (products[url=/oak-chair].price: 89 → 79); an item gone is one removal. - Without such a key, lists are compared as sets of items.
- A page kept as text (no
fields) is compared line by line: a new line is one addition. - With several pages (
/batch,/crawl,steps), each page is compared with itself, by its URL.
The first run of New items only remembers what's there; the next ones report what appears (up to the last 5,000 items remembered).
Values that change on every run (a date, a view counter) would make everything look changed: list their keys in Keys to ignore, they're left out at any depth.
Alerts
When something is found, you're told on the channels you pick for the schedule:
- your alert channels, set up under Automation → Alert channels (email, SMS and WhatsApp are coming):
- Telegram, your own chat: Open the bot, press Start, done: the page sees it by itself.
- Telegram, a group (a team, a family…): choose A group, Telegram asks which group to add our bot to; everyone in it gets the alerts. Without the link, add the bot to the group and send
/codethere, then type the code in the dashboard. /stopin a chat or group disconnects it.- Discord and Slack: paste a channel's webhook URL (Discord: Server settings → Integrations → Webhooks; Slack: an app with Incoming Webhooks).
- a webhook, if you give a URL: a
POSTwith the changes as JSON ("event": "monitor.new_items"in New items only).
{
"event": "monitor.changed",
"schedule": { "id": "4de3120c-d44d-4289-8b1f-522be876c9fb", "name": "Competitor prices" },
"run": { "id": 128, "at": "2026-10-24T09:00:03.418Z", "log_id": 974 },
"changes": [
{ "path": "price", "kind": "changed", "before": 89, "after": 79 },
{ "path": "products[]", "kind": "added", "after": { "name": "Oak chair", "price": 120 } }
]
}Each webhook is signed: X-Signature: sha256=<hex> is the HMAC-SHA256 of the raw body with the schedule's signing secret (shown in its editor). Check it before trusting the call:
import { createHmac, timingSafeEqual } from "node:crypto";
function verify(rawBody, header, secret) {
const expected = `sha256=${createHmac("sha256", secret).update(rawBody).digest("hex")}`;
return header.length === expected.length && timingSafeEqual(Buffer.from(header), Buffer.from(expected));
}The webhook must be a public http(s) address. It has 10 seconds to answer; redirects aren't followed.
With the API
Everything above is also in the API, with your API key, in snake_case:
GET /v1/schedules | your schedules, with their next and last runs |
POST /v1/schedules | { "name", "cron", "timezone", "path": "/scrape", "body": { … }, "monitor", "watch": "changes" | "new", "ignore", "alert_targets": ["<channel id>"], "webhook_url", "enabled" } → { "id" }. A template instead of path and body: "template_id", "variant_key", "params": { … } |
GET /v1/schedules/{id} | one schedule, with running_since while a run is under way |
PATCH /v1/schedules/{id} | change any of them; "enabled": true lifts a pause |
DELETE /v1/schedules/{id} | |
POST /v1/schedules/{id}/run | runs it now: { "status", "changes" } |
GET /v1/schedules/{id}/runs | the last runs (?limit=), with what changed |
GET /v1/schedules/preview?cron=…&timezone=… | the next runs of a cron, or why it can't be used |
GET /v1/monitors | the runs that found changes, newest first (?schedule=, ?before=, ?limit=) |
Put export in the body to send every run's result to your storage, sheet or database.