A Watch re-runs a saved (query, surfaces, regions, extract) on a cadence. Add a webhookUrl to receive each dispatched run exactly like any other async search. Use watches for continuous GEO and rank monitoring without operating a scheduler on your side. Create watches three equivalent ways — same validation, plan limits, and billing on every path:
Creating a watch is free. Each dispatched run bills per surface × region exactly like a normal async search, with the same success-only refunds for empty or failed captures. A skipped run costs nothing. See Credits.

Schedules

Use a named token for common cadences:
Allowed tokens are 15m, 30m, 1h, 6h, 12h, 1d, and 7d. For an off-grid cadence, send a positive integer:
The public Watch always echoes both fields:
For an off-grid interval, every is a display convenience using the nearest token. intervalMinutes is the source of truth.

Plan limits

Each plan sets an active-watch ceiling and a minimum interval. An interval below the plan floor returns 422 WATCH_INTERVAL_TOO_SHORT; the message names the floor and plan. Creating past the active-watch ceiling returns 403 WATCH_LIMIT_EXCEEDED; the message names the ceiling and plan.

Lifecycle

A watch is always in one of three states: Pause or resume with PATCH /v1/watches/:id. A manual pause sets pausedReason: "user". Resuming a paused watch clears pausedReason and sets nextRunAt to now + intervalMinutes. Use DELETE /v1/watches/:id to cancel. Cancellation preserves the watch row and run history.

Automatic pause

If three scheduled runs in a row are skipped for insufficient credits, the watch becomes paused with pausedReason: "insufficient_credits". A successful dispatch resets the consecutive-failure counter to zero.
Auto-pause prevents an underfunded watch from producing an unbounded stream of skipped ticks. After restoring credits, resume it explicitly; the next run is scheduled from the resume time.

Run history

Every scheduled tick that reaches a watch creates one run-history row. Read the ten newest runs with GET /v1/watches/:id, or page through the full history with GET /v1/watches/:id/runs. For dispatched, read jobId with GET /v1/jobs/:id exactly like any other async parent job. If the watch has a webhookUrl, each child delivery uses the same signature, retry, and dedupe semantics described in Webhooks.

Create and inspect a watch

Create a daily watch, then read it to see lastRunAt, lastJobId, and the newest run records as ticks dispatch.

Create a watch

Request fields, schedules, and creation errors.

Get a watch

Read configuration and the ten newest runs.

Update a watch

Pause, resume, or change the cadence and delivery.

Watch runs

Page through complete run history.

Webhooks

Verify the signed deliveries from dispatched runs.

Credits

Per-surface, success-only billing for each dispatch.