Esc

API reference

Retrieve stored results for many sites

POST/v1/sites/batch

Looks up as many as 50 sites at once, and returns each site’s stored result as GET /sites/{domain} does, in the order you sent them.

A site sent twice gets one item. A site without a stored result, or an input that isn’t a domain, gets an error in its place, and the other sites are still returned. It never starts a scan.

Credits

Each result found costs its checks’ stored price, up to 3 each; sites without a result cost nothing. The batch is charged as a whole: if your credits don’t cover every result found, the request is refused and nothing is charged.

Request

cURL
curl -X POST "https://api.checkanysite.com/v1/sites/batch" \
  -H "Authorization: Bearer $CHECKANYSITE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"domains": ["stripe.com", "lovable.dev"], "checks": ["ai", "tech"]}'
Python
from checkanysite import CheckAnySite

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

batch = client.sites.batch(["stripe.com", "lovable.dev"], checks=["ai", "tech"])
JavaScript
const url = 'https://api.checkanysite.com/v1/sites/batch';
const response = await fetch(url, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.CHECKANYSITE_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    domains: ['stripe.com', 'lovable.dev'],
    checks: ['ai', 'tech'],
  }),
});
const batch = 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.

  • domainsarray of stringrequiredbody

    1 to 50 domains, or URLs whose host is used. A domain sent twice is answered once, in its first place.

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

    The checks to answer for each domain; left out, every check.

  • maxAgeDaysintegerbody

    Answer only with results at most this many days old; older ones are no_result.

Response

StatusBodyWhen
200 OKSiteBatchA result or an error for each site.
Response 200: A result, and a site we have none for
{
  "data": [
    {
      "input": "wikipedia.org",
      "domain": "wikipedia.org",
      "result": {
        "domain": "wikipedia.org",
        "checks": [
          "ai"
        ],
        "scanId": "0b5a7a6e-1f7e-4d7c-9a4e-2f0d8b1c6a11",
        "scannedAt": "2026-11-10T09:30:06.000Z",
        "complete": true,
        "pending": [],
        "limited": null,
        "finalUrl": "https://www.wikipedia.org/",
        "resultUrl": "https://checkanysite.com/site/wikipedia.org?focus=ai",
        "versions": {
          "signatures": "0.6.1",
          "score": "1.1"
        },
        "ai": {
          "level": "none",
          "builders": [],
          "patterns": []
        },
        "readiness": null,
        "popularity": null,
        "tech": null,
        "dns": null,
        "trust": null,
        "score": null,
        "summary": null,
        "history": null,
        "notes": []
      }
    },
    {
      "input": "example.org",
      "domain": "example.org",
      "error": {
        "code": "no_result",
        "message": "We have no result for example.org yet. Scan it with POST /v1/scans."
      }
    }
  ]
}
  • dataarray of value

    One item per domain: its result, or an error.

Errors

StatusCodeWhat happened
400invalid_jsonInvalid JSON
400invalid_parameterInvalid parameter
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
429quota_exceededMonthly credits used up
429key_limit_reachedKey limit reached
500internal_errorInternal error