/sites/{siteId}/scans/latestHas a scan finished yet
The latest run's progress, and — separately — whether this site's inventory is established at all.
Auth header
Authorization: Bearer tsk_live_…The key needssites:read
Parameters
siteIdstringin pathrequiredThe site id, from GET /v1/sites.
Example request
curl "https://app.tagsentry.ai/api/v1/sites/3f6c1b8e-2d4a-4c7e-9a51-0b8f2e6d7c10/scans/latest" \ -H "Authorization: Bearer tsk_live_…"Response 200
scanIdstring | nullrequiredThe latest tier-1 run's id: the scan POST /scans starts, and the
scanRunIdascan.completedwebhook carries for it.tierstringrequiredAlways tier 1. A deeper tier-2 crawl can follow it; its own
scan.completedsaystier: tier2.Always
tier1statusstringrequiredThe LATEST run. "none" means this site has never been scanned, and "partial" means the crawl budget ran out part-way — which does NOT establish the inventory, because "found nothing" would then cover only the pages it reached. Read
everSucceededfor whether a banner can be served, not this.One of
queued,running,completed,partial,failed,nonestartedAtstring | nullrequiredfinishedAtstring | nullrequiredeverSucceededbooleanrequiredTHE FIELD THAT MATTERS. True when SOME tier-1 scan has reached
completedand none is in flight — which is the compiler's own rule for whether this site's inventory is established, and therefore whether it can serve a banner at all. It is about the SITE, not the latest run: a later failed rescan does not un-see what a completed scan saw.detailstringrequired
Example response
{ "scanId": "3f6c1b8e-2d4a-4c7e-9a51-0b8f2e6d7c10", "tier": "tier1", "status": "queued", "startedAt": "2026-09-26T14:02:00.000Z", "finishedAt": "2026-09-26T14:02:00.000Z", "everSucceeded": false, "detail": "…"}More about this endpoint
READ everSucceeded, NOT status. status describes the latest RUN; everSucceeded describes the SITE, and it is the one that decides whether a banner can be served. A site whose most recent rescan failed but whose first scan completed still serves a banner; a site whose first scan is still running does not.
Errors401 · 403 · 404 · 500
401Missing, malformed, unknown, revoked or expired API key. These are deliberately indistinguishable in the response -- distinguishing them would confirm to a caller that a token was once real.403The key authenticated but does not carry the scope(s) this operation requires, or (`domain_not_verified`) the site's domain is not verified, so its consent records are not released.404No such resource on this account. A site id belonging to a DIFFERENT account answers 404, never 403 -- a 403 would confirm the id exists somewhere.500Something failed on our side. The requestId in the body is what to quote.
Every error has the same body: { error: { code, message, requestId } }.
From the OpenAPI document, version 2026-08-26. Raw OpenAPI