Checks
Monitoring check management
List monitoring checks
List monitoring checks
Create monitoring check
Create monitoring check
Update several checks at once
Applies one set of `changes`, shaped like a single-check PATCH body, to every check of `checkUids`, with exactly the semantics of that PATCH (spec 2026-11-05-01). Only the fields of `BulkCheckChanges` are accepted; any other field is a `VALIDATION_ERROR`, never silently ignored. Per-check: a check the changes cannot apply to (a placement change on a passive check, a value its PATCH would reject, a read-only demo check, a check not in this organization) is reported in `skipped` and the others are still updated. `dryRun` runs every validation and writes nothing; it checks each check against the current state, so it cannot see a plan limit only the earlier checks of the same batch would exhaust.
Aggregate check counters for an organization
Org-wide check counters computed server-side with a single SQL aggregation, so they are unaffected by the list endpoint's 100-row page clamp. Scope is the same set the list endpoint shows by default: non-deleted, non-internal checks. `total`, `byStatus`, `down` and `hardDown` span enabled and disabled checks alike; `enabled` and `disabled` partition the same set.
Create or update check by slug (upsert)
Create or update check by slug (upsert)
Get check details
Get check details
Update monitoring check
Update monitoring check
Soft delete check
Soft delete check
Validate a check configuration, or a whole config-as-code document
Runs the same validation the create/update paths run, but never writes.
Switch pinned checks to automatic placement
**Deprecated, removed after 2026-12-15**: use `PATCH /api/v1/orgs/{org}/checks` with `{'placement': 'auto'}`. Responses carry `Deprecation` and `Sunset` headers. The checks list's bulk action (spec 2026-09-25-06). Each eligible check becomes `placement: auto` with `regionCount` = its current region count and an empty pool; its regions and jobs are untouched, so neither its cost nor where it runs today changes — it only gains failover when one of its regions goes dark. Passive checks and checks naming a private (`@`) region are skipped. With no `checkUids`, every eligible pinned, non-internal check of the organization is switched.
Clone an existing check
Creates a near-identical copy of an existing check. Runtime state (status, results, incidents, scheduler row) is not copied; labels and channel bindings are re-linked to the new check.
Rotate a heartbeat check's ping token
Mints a fresh ping token for a heartbeat check (heartbeat checks only) and persists it, invalidating every previously issued ping URL immediately — unlike webhook signing-secret rotation, there is no grace period, since heartbeat pings are frequent and the operator is expected to update the sender right away. Returns 400 for non-heartbeat checks.
List a check's versions
The check's version history, newest first (spec 2026-10-03-06). A version is recorded on every change of the check definition (name, slug, description, type, public config, group, placement, quorum, enabled, period, labels), whoever made it. Secrets are never versioned. Proposed and rejected versions are listed too. The list items carry no snapshot. The last 100 applied versions are kept.
Get one version of a check
One version with its snapshot. The snapshot is redacted like an export: secret and export-redacted config keys are never present.
Diff a version against another one
The fields that differ between this version and `against` (default: the applied version before it). Config and labels diff per key (`config.url`, `labels.env`). `against` is null for the first version, which is diffed against nothing.
Restore a version of a check
Applies an applied version's definition again, through the same path as a PATCH (validation, job reconciliation, labels). This records a new version with origin `user` (or `api`) and reason `restored vN`. Secrets are not versioned: the check keeps its current ones. 409 when the version is a proposal or was rejected.
Approve a proposed version
Applies a proposed version. The proposal becomes the applied version and the caller is recorded as the decider. 409 when the version is not a pending proposal, or when it was built on an applied version that is no longer the latest (`baseVersion`).
Reject a proposed version
Marks a proposed version rejected. The check is not changed. 409 when the version is not a pending proposal.
Turn a prompt into a contract for an AI-authored js check
First step of the 'Describe it' flow (spec 2026-10-03-07): the LLM turns the user's description into an ordered list of human-readable assertions, returned for the user to confirm. Nothing is saved. 404 when no AI provider is configured (SP_AI_PROVIDER empty). 429 when the organization spent its daily AI token budget (maxAiTokensPerDay).
Write and test a js check script from a confirmed contract
Runs SolidPing's agent loop: the LLM explores the target (fetch_page, browser_snapshot) and tests its script (run_script) until a run returns up or the turn cap (SP_AI_MAX_TURNS) is hit. Returns the script, its last run and the js config to save through POST /checks (without the secrets, which only the caller holds). The LLM only ever sees secret names. Nothing is saved. 422 with the last attempt when no script passed. 404 when no AI provider is configured, or when checkUid names no js check of the org. Send `Accept: application/x-ndjson` to get the progress streamed: a 200 whose body is one JSON object per line, `turn`, `message`, `tool`, `toolResult` and `ping` lines while it runs, then a last `result` line (`result` holds the 200 body) or `error` line (`httpStatus` and `response` hold what the plain call would have answered).
List a check's latest screenshots
The check's latest page captures, newest first: the screenshots its incidents carry, the captures of failing runs that opened no incident (a validating run, a blip, a regional failure, a run of an outage whose incident already holds its onset capture), and 'Capture now' captures. A check keeps at most 5 captures of its own (the oldest is retired on the sixth); incident captures live as long as their incident. Any check type answers — a type that never captures returns an empty list. Next to `data`, `captureOutcome` reports the latest 'Capture now' request that produced no screenshot, and why (browser and js checks only). Captures are viewport-only, 1280x800. Operator-only: never exposed on a status page, badge or subscriber payload. Same authorization as reading the check.
Capture a screenshot now
'Capture now': runs a browser or js check once, on demand, with the screenshot forced whatever the verdict (and whether or not the check's own `screenshot` option is on). The run goes through the check's own scheduling, so it executes where the check executes — one of its regions, on a shared worker or on the organization's private agent — and its result is recorded like any other run. The call returns as soon as the run is scheduled; the capture appears in `GET …/screenshots` (trigger `capture-now`, or `agent-upload` from a private agent) once the run completes. A run that completes without a capture is reported as `captureOutcome` on that listing, matched by `requestedAt`. A js check only yields a capture if its script calls `page.screenshot()`. Rate limited to one request per check per minute and 20 per organization per hour; a refusal carries `Retry-After`. Requires write access (viewers get 403).
Run a check once, now
'Run now': runs any check once, on demand, in every region, instead of waiting for its next period. Each region's job is made due at once and the workers are told; a region whose job is mid-run keeps the request and runs again as soon as that run ends (its current run started before the request, so it is not the answer). Every region is reported `queued`. The results go through the normal path, so they can open or resolve an incident like any scheduled result. A result with `periodStart >= requestedAt` is this request's answer. This is an action path: it does not create the multi-step run resource at `…/run`. Rate limited per check and per organization (3 per minute and 60 per hour; browser, js, rdp and vnc checks 1 per minute and 20 per hour); a refusal carries `Retry-After`. Requires write access (viewers get 403).
Get the run in progress of a multi-step check
A multi-step check (the website crawl) runs as a series of short slices, each saving its progress. This returns the run in progress: its uid, start, completed slices and the progress of its last slice (for a crawl `pagesDone`, `maxPages`, `queued`, `findings`, `phase`). `{'running': false}` when no run is in progress, and for every check type that does not run in steps.
Cancel the run in progress of a multi-step check
Drops the run in progress: its saved progress is deleted and the check is scheduled for its next regular run. No result is written for the canceled run. A no-op when no run is in progress. Requires write access (viewers get 403).
List the crawl reports of a check
The full findings report of the last 5 finished crawl runs, newest first. Each entry carries a short-lived signed `downloadUrl` to the report JSON: `{'findings': [{type, url, source, status, error, fingerprint}], 'pagesCrawled', 'incomplete'}`. The result of a run names its report in `output.reportFileUid`.
Org-wide check dependency graph
Returns every check (node) and every dependency edge in the organization.
List dependencies for a check
Returns the dependsOn (parents) and dependedOnBy (children) edges of the given check.
Add a dependency edge to a check
Add a dependency edge to a check
Update a dependency edge
Update a dependency edge
Remove a dependency edge
Remove a dependency edge
List the components of a vendor status page
Fetches `<url>/api/v2/summary.json` through the egress guard and returns its components (group headers left out). Used by the vendor-status check form.