Esc

API reference

Scan a site

POST/v1/scans

Starts a scan of a site with the checks you ask for.

If a result from the last day already has those checks, the API returns it with 200. If a scan of the site is already running, it returns that scan with 202; otherwise it starts a new scan and returns 202. Read the scan at links.self until complete is true: the first results arrive within seconds, and slower sources follow. A scan runs only what its checks need, so fewer checks are faster and cost less. A read-only key gets a recent result or a running scan, but never starts a new one (read_only_key). To check a fix, ask for the readiness check with again: true: once its last result is a few minutes old, the check runs again.

Credits

Each check costs its scan price, up to 15 for every check, when a new scan starts; its stored price, up to 3, when a recent result or a running scan answers.

Request

cURL
curl -X POST "https://api.checkanysite.com/v1/scans" \
  -H "Authorization: Bearer $CHECKANYSITE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"domain": "wikipedia.org", "checks": ["ai"]}'
Python
from checkanysite import CheckAnySite

client = CheckAnySite()  # Reads the key from CHECKANYSITE_API_KEY.

scan = client.scans.create("wikipedia.org", checks=["ai"])
JavaScript
const url = 'https://api.checkanysite.com/v1/scans';
const response = await fetch(url, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.CHECKANYSITE_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ domain: 'wikipedia.org', checks: ['ai'] }),
});
const scan = await response.json();

Parameters

  • Idempotency-Keystringheader

    A unique value for this request, such as a UUID. A retry with the same key within 24 hours returns the first response (Idempotent-Replayed: true), and never starts a second scan or charges twice. The same key with a different request returns idempotency_key_reused.

Request body

JSON, with Content-Type: application/json. A field we don’t know is refused, so a typo never passes silently.

  • domainstringrequiredbody

    A domain, or a URL whose host is used.

  • checksarray of one of: ai, readiness, popularity, tech, dns, trust, summary, historybody

    The checks to answer; left out, every check. A scan runs only what they need, and the call costs what they cost.

  • againbooleanbody

    With the readiness check: ask it again once its answer is 3 minutes old, to check a fix. Without it, and for other checks, a result from the last 24 hours answers.

    Default: false

Response

StatusBodyWhen
200 OKScanA recent result had the checks; the scan is complete.
202 AcceptedScanA scan is running. Read it at links.self, which the Location header also gives.
Response 202: A scan on its way
{
  "id": "0b5a7a6e-1f7e-4d7c-9a4e-2f0d8b1c6a11",
  "domain": "wikipedia.org",
  "checks": [
    "ai"
  ],
  "status": "queued",
  "createdAt": "2026-11-10T09:30:00.000Z",
  "finishedAt": null,
  "complete": false,
  "failure": null,
  "result": null,
  "links": {
    "self": "https://api.checkanysite.com/v1/scans/0b5a7a6e-1f7e-4d7c-9a4e-2f0d8b1c6a11?checks=ai",
    "result": "https://checkanysite.com/site/wikipedia.org?focus=ai"
  }
}
  • idstring

    The scan’s id.

  • domainstring

    The domain scanned.

  • checksarray of one of: ai, readiness, popularity, tech, dns, trust, summary, history

    The checks its result holds: those asked that the scan answers.

  • statusstring

    Where it is: queued, running, completed or failed.

    One of: queued, running, completed, failed.

  • createdAtdate-time

    When it was asked for.

  • finishedAtdate-time or null

    When it finished; null while it runs.

  • completeboolean

    True once the scan failed, or completed with every slow source in.

  • failureobject or null

    Why the scan couldn’t finish; null unless status is failed.

  • resultobject or null

    The result once status is completed.

  • linksobject

    Where to poll the scan, and where its result is shown.

Once completed, result holds the site’s result, as on the result object.

Errors

StatusCodeWhat happened
400invalid_jsonInvalid JSON
400invalid_parameterInvalid parameter
400invalid_domainNot a public domain
415unsupported_media_typeUnsupported content type
413request_too_largeBody too large
401missing_api_keyNo API key
401invalid_api_keyUnknown API key
401revoked_api_keyRevoked API key
401expired_api_keyExpired API key
429rate_limitedToo many requests
422idempotency_key_reusedIdempotency key reused
409idempotency_key_in_useRequest in progress
403read_only_keyRead-only key
422site_refusedSite not checked
429quota_exceededMonthly credits used up
429key_limit_reachedKey limit reached
429scan_limit_reachedDaily scan limit reached
503capacityNo scan capacity
500internal_errorInternal error