API
Take the data
Free, unauthenticated, CORS-open, and served as static files from a CDN. There is no key to request, no quota to exceed and no endpoint that can be slow, because none of this is computed at request time.
Endpoints
GET /api/v1/stats
Current aggregates, the full daily history, and cross-tabs by edge network, platform and top-level domain.
GET /api/v1/domain/{domain}
One domain: score, grade, per-crawler access, detected stack, and the complete archived observation the score was computed from.
GET /data/domains.jsonl
The entire dataset, one JSON object per line. Usually what you actually want.
Reading a response honestly
Two fields decide whether a score means what you think it means. partial is true when some checks could not be observed, usually because the request met a bot wall. The total is then renormalised over the points that remained, so a partial 80 and a complete 80 are not the same claim. Do not put them in the same ranking.
score is null when the site could not be measured at all. That is not a zero and should be excluded from averages rather than coerced to one.
Every response carries observation, the raw evidence the score was derived from, and vantage, the network the measurement was taken from. Scoring is a pure function over the observation, so you can recompute any score and get the identical result.
Rate limits
None. Everything is a static file on a CDN, so there is nothing to protect. The data changes once a day after the nightly crawl, so polling faster returns identical bytes. If you need the whole index, download domains.jsonl once rather than fetching thousands of per-domain files.
Stability
The v1 shape will not change incompatibly. New fields may be added; existing ones will not be renamed or removed under the same version. If the rubric changes, versions.rubric changes with it and historical records keep the version they were scored under.
Credit
Licensed CC BY 4.0. Attribution to Fidget Labs BV is the only condition. The data page carries a ready-made citation.