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 -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"]}'from checkanysite import CheckAnySite
client = CheckAnySite() # Reads the key from CHECKANYSITE_API_KEY.
scan = client.scans.create("wikipedia.org", checks=["ai"])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-KeystringheaderA 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 returnsidempotency_key_reused.
Request body
JSON, with Content-Type: application/json. A field we don’t know is refused, so a typo never passes silently.
domainstringrequiredbodyA domain, or a URL whose host is used.
checksarray of one of: ai, readiness, popularity, tech, dns, trust, summary, historybodyThe checks to answer; left out, every check. A scan runs only what they need, and the call costs what they cost.
againbooleanbodyWith the
readinesscheck: 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
| Status | Body | When |
|---|---|---|
| 200 OK | Scan | A recent result had the checks; the scan is complete. |
| 202 Accepted | Scan | A scan is running. Read it at links.self, which the Location header also gives. |
{
"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"
}
}idstringThe scan’s id.
domainstringThe domain scanned.
checksarray of one of: ai, readiness, popularity, tech, dns, trust, summary, historyThe checks its result holds: those asked that the scan answers.
statusstringWhere it is:
queued,running,completedorfailed.One of:
queued,running,completed,failed.createdAtdate-timeWhen it was asked for.
finishedAtdate-time or nullWhen it finished; null while it runs.
completebooleanTrue once the scan failed, or completed with every slow source in.
failureobject or nullWhy the scan couldn’t finish; null unless
statusisfailed.resultobject or nullThe result once
statusiscompleted.linksobjectWhere to poll the scan, and where its result is shown.
Once completed, result holds the site’s result, as on the result object.
Errors
| Status | Code | What happened |
|---|---|---|
| 400 | invalid_json | Invalid JSON |
| 400 | invalid_parameter | Invalid parameter |
| 400 | invalid_domain | Not a public domain |
| 415 | unsupported_media_type | Unsupported content type |
| 413 | request_too_large | Body too large |
| 401 | missing_api_key | No API key |
| 401 | invalid_api_key | Unknown API key |
| 401 | revoked_api_key | Revoked API key |
| 401 | expired_api_key | Expired API key |
| 429 | rate_limited | Too many requests |
| 422 | idempotency_key_reused | Idempotency key reused |
| 409 | idempotency_key_in_use | Request in progress |
| 403 | read_only_key | Read-only key |
| 422 | site_refused | Site not checked |
| 429 | quota_exceeded | Monthly credits used up |
| 429 | key_limit_reached | Key limit reached |
| 429 | scan_limit_reached | Daily scan limit reached |
| 503 | capacity | No scan capacity |
| 500 | internal_error | Internal error |