Skip to main content

No matching sections.

Instant checks

An instant check runs now, from the same distributed fleet your monitors run on, and is gone when you have read it. Use it to test a url before you monitor it, verify a fix, or run a diagnostic - without creating a permanent monitor, and without spending a monitor slot.

Start a check

POST /check, scope check:write. The only member you really need is the address:

request
curl -X POST 'https://api2.host-tracker.com/check' \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{ "url": "https://example.com", "type": "http" }'
202 Accepted  ·  Retry-After: 5
{
  "id": "3f0a…-…",
  "dbId": 2,
  "retryAfter": 5,
  "estimatedDurationSec": 20,
  "resultUrl": "/check/2/3f0a…-…",
  "created": 1785712608
}
Follow resultUrl; do not assemble the path yourself. The result is addressed by two values - dbId (an integer naming which store holds it) and id (a GUID) - and only the pair identifies the check. That is exactly the kind of composite a client gets wrong once and then debugs for an hour.

retryAfter and estimatedDurationSec are the poll contract, in seconds: wait retryAfter before the first poll, and expect the whole thing to take about estimatedDurationSec. They differ per check type - a ping concludes in a moment, a waterfall does not.

A refusal is honest: if the checking pipeline is unavailable the request is refused outright. A check that was never registered never happened, and answering 202 anyway would hand back an id that never resolves - a poll loop that spins forever on a check nobody is running.

Poll it to a result

GET /check/{dbId}/{id}, scope check:read. Poll until state is done:

200 OK  ·  still running
{
  "id": "3f0a…-…", "dbId": 2,
  "state": "running",          // running | done
  "url": "https://example.com",
  "type": "http",
  "created": 1785712608,
  "doneAt": null,
  "retryAfter": 3,
  "events": [ /* the locations that have reported so far */ ]
}

The response is incremental: events[] grows as locations report, so a poll before the end is useful rather than empty. retryAfter comes back on each non-terminal poll; when state is done, doneAt is stamped and there is nothing left to wait for.

Two spellings changed on 2026-08-17, with no aliases. The lifecycle member is state (it was status) - the same word every other resource on this surface uses - and the creation stamp is created (it was createdAt), because an entity's own creation instant is created surface-wide. doneAt keeps its At: it names an event, not the resource's own stamp.

Per-location events

An instant check is not one answer - it is one answer per monitoring location, which is the whole point of running it on the fleet rather than curling from your laptop. Each entry of events[] is one location's result:

MemberMeaning
agentIdWhich agent ran it.
location"Country, State, City", resolved from the fleet.
doneAtWhen this location finished, Unix seconds.
ipThe address the agent actually resolved and dialled - the member that answers "is your DNS the same as mine?"
errorThe failure, when this location failed. Absent on success - never an empty object, so presence alone is the test.
metricsThe per-type measurement blob: response time, status codes, records, and whatever else the type measures.

A check where some locations succeed and others fail is the normal, interesting case - it is a routing or regional problem, and it is visible here and nowhere else.

What you can check

GET /check/type is anonymous - no token - and lists every instant-check type with its label, description, an example address, and its own retryAfter / estimatedDurationSec. Read it rather than hardcoding the list.

Today's vocabulary for type:

httppingporttracednsdnsblwhoiswebRiskrusRegBLcrawlwaterfall

Omitting type means http. A row's experimental flag marks a type that may still change, and options carries the type's own extra members where it has any - dnsQuery (which record types a dns check asks for) and deviceEmulation (which device profile a waterfall check's browser emulates) are the two on the request body itself.

Choosing locations

By default a check runs from every location your account may use. Three members narrow that, and they are the same vocabulary a monitor uses:

MemberMeaning
poolsWhich location pools to run from. Absent means every location the account may use.
locationsWhere the check runs from. Each clause's own members are ANDed and its values ORed; the clauses themselves are ORed.
excludeLocationsWhere it must NOT run from, in the same clause shape. Exclusion wins where the two overlap.

GET /agent/pool and GET /agent - both anonymous, no token - are where the pool and location names come from. See Monitors for the same clause shape in its permanent form.

An agent row's administrative division is region - a US state, a Canadian province, a German Land. It was spelled state until 2026-08-17, which collided head-on with the lifecycle word every other resource on this surface uses; there is no alias.

History

GET /check lists the account's past instant checks, cursor-paged, narrowed by from/to and type. It is ordered newest-first by design and takes no sort - see the query surface.

Instant check or monitor?

Instant checkMonitor
RunsOnce, nowOn a schedule, forever
Scopecheck:write / check:readmonitor:write / monitor:read
Alerts youNoYes - see Alerting
Costs a slotNoYes, against the package's monitor limit
Keeps historyA list of past checksResults, incidents, uptime and SLA
The scope family is check, and the paths are /check…. Both were ic until 2026-08-17. The ic paths now 404 and ic, ic:read and ic:write are refused by the mint - one resource, one url, one scope name that reads like the resource it gates.