/api/rank-check-runs and
/api/check-schedules, plus /api/operations. These routes require a signed-in
session and project access. They are separate from the versioned REST API
described in API overview.
Unless noted otherwise, successful responses use this envelope:
meta.next_cursor. Validation failures return a
problem response with status 400; authentication, project access, missing
resources, and conflicting commands return 401, 403, 404, and 409
respectively.
REST check correlation
The versioned REST check request,POST /api/v1/keywords/{id}/checks, returns
202 with { "id": "rcr_...", "status": "queued" } when it queues work. Its
id is the run ID, not a rank-check ID. Poll
GET /api/v1/keywords/{id}/rank-checks?status=completed and select the history
row whose run_id equals that ID. The matching row includes the final position
and rank-check ID. run_id is null only for legacy history rows that predate
runs.
Operations snapshot
GET /api/operations?project=prj_... returns active rank-check runs and active
Search Console imports for the app header. A rank-check operation includes
provider, a nullable SERP provider catalogue ID, and providerLabel, its
nullable catalogue label. The label is present only when the run’s recorded
launch policy names a known provider; otherwise both fields are null.
nextCheckAt is the earliest queued check for a queued or running run, or null
while a target is in flight or no queued check has a start time.
firstNotBefore exposes that time before the first target starts, otherwise null.
startedTargets counts targets with execution evidence, excluding unstarted
queued, skipped, and cancelled targets. hasRunningTargets reports whether a
target is currently in flight. scheduleTiming explains the schedule’s spread
or start window, or is null for a run without a schedule.
launchedAt records materialization; startedAt is null until the first target
is claimed or started, and is not reset by subsequent checks. A run completed
without materializing targets has equal startedAt and finishedAt.
etaSeconds is a nullable server-side throughput estimate:
it is available only after at least three completed targets and 30 seconds of
elapsed execution. snapshotAt is the server time used for relative operation copy.
Selection payload
POST /api/rank-check-runs/preview and POST /api/rank-check-runs both take a
spec. It is one of these strict objects:
selected form accepts 1 to 1,000 unique keyword public IDs. The filter
form carries the full rank-tracker query state: filters, grouped: false,
lens, page, pageSize, savedViewId, search, and sort.
depth, when supplied, is one of 10, 20, 50, or 100. providerId is
optional.
Runs
Preview a run
previewToken, counts, exclusions, a cost
estimate, and budget state. Send that token unchanged when launching the run.
excluded[].reason is one of paused, manual, in_progress, no_provider,
or other_project. Budget reason is budget_exhausted, duplicate,
no_provider, or null.
Launch a run
idempotencyKey may be sent in the body instead of the header. It must contain
8 to 128 characters. A normal success returns data containing the run object
described below. When all selected keywords already have checks in progress,
the successful response is:
List and retrieve runs
project (required), segment (history by default or
planned), status (a comma-separated list), limit (1 to 200, default 50),
and cursor. The allowed status values are planned, blocked, queued,
running, cancelling, completed, and cancelled. The planned segment
returns unlaunched planned and blocked runs. History returns launched runs,
including ones later blocked during launch, and skipped scheduled occurrences.
A skipped occurrence is retained as an audit trace but does not count as a
launched run.
Run lists use keyset pagination. History is ordered by its launch instant
(launchedAt, or finishedAt for a skipped occurrence) then public ID
descending; planned runs are ordered by plannedFor then public ID ascending.
The opaque cursor is base64url JSON with version 3, timestamp t, and
public_id; pass it back unchanged as cursor.
The list response is { "data": [run], "meta": { "next_cursor": string | null } }.
The detail response adds selectionSpec to the same run object.
outcome is succeeded, partial, failed, deferred, or null. trigger
is manual, scheduled, api, or retry. selectionKind is single,
selected, filter, all, scheduled_due, retry_failed, rerun, or
legacy_schedule.
List run items
status, limit, and cursor in addition to required
project. Its allowed item statuses are queued, running, completed,
failed, deferred, cancelled, skipped, and blocked. Items are keyset
ordered by creation time and a private database tie-breaker. The cursor is opaque;
pass it back unchanged.
Each item includes an opaque stable id, status, estimatedCostCents, actualCostCents,
blockedReason, notBefore, startedAt, finishedAt, keyword (publicId,
text, location, device), and rankCheck when one exists. rankCheck
contains publicId, position, rankingUrl, and errorCode.
Change a run
All commands below take{ "projectId": "prj_..." } and return the updated
run in data.
As with launch, a retry can return the
nothing_to_run response instead of a
run object.
Schedules
List, create, and retrieve schedules
projectId, name, and
frequency. name is 1 to 80 characters. The frequency is paused, manual,
daily, weekly, monthly, or custom_cron. custom_cron requires
cronExpression; accepted expressions run no more often than hourly.
Optional fields are cronExpression, jitterMinutes (0 to 120, default 60),
timezone (an IANA time zone or null for the project time zone),
providerPolicy, serpDepth, and timeOfDay (HH:mm or null).
{ "data": { "publicId": "sch_..." } }. A schedule
resource contains publicId, name, enabled, isDefault, keywordCount,
frequency, cronExpression, jitterMinutes, timezone, timeOfDay,
providerPolicy, and serpDepth.
Update, delete, and set the default
PATCH accepts projectId plus any create field and enabled. DELETE and
set-default require only projectId. Create, update, and set-default return
{ "data": { "publicId": "sch_..." } }; delete returns
{ "data": { "deleted": true } }.
Manage members
{ "data": { "updated": number } }. Adding a keyword moves it to this
schedule; deleting it from this membership returns it to manual checking.
Operations snapshot
kind: "gsc_import", with id, state,
and progress: { "done": number, "total": number }.