Reports

The runs, as data.

1 published run, 31 recorded checks, failures and retractions included. CC BY 4.0, no key, CORS open.

Download

FileContents
/reports/all.jsonEvery run, under a runs key.
/reports/all.csvEvery check from every run, one row each.
/api/v1/reportsThe same data over the public API. No key, no rate limit worth mentioning.

Runs

RunChecksFiles
Detection run, August 2026 31 JSON · CSV

Fields

Field names are fixed once published. A correction ships as a new file; it does not rename a column under whoever is already parsing it.

Envelope

FieldTypeMeaning
run_idstringIdentifies the run. Stable, and reused as the key everything else joins on.
slugstringThe written report this data belongs to, under /reports.
titlestringHuman-readable name of the run, and what a citation quotes.
started_at, finished_atISO 8601Date-only where only a date was recorded. Times are never back-filled.
kernelstringThe browser build the run was headlined on. Individual checks may override it.
hoststringThe machine the run was driven from. It is a variable, so it is published.
proxyobjectThe run-level exit: type, exit_ip, optional exit_block, geo. Checks may override it.
subjects[]arrayWhat was compared: id, name, version (null when not recorded), config.
segments[]arrayMeasurement sessions within the run, each with its own window, description and optionally what the browser presented.
checks[]arrayOne object per detector per subject per round. The rows everything else exists to explain.
notes[]arrayObservations, limits and retractions that are not a check result.
license, canonicalstringCC-BY-4.0, and the page this data belongs to.

checks[]

FieldTypeMeaning
detectorstringWhat was measured: a detector site, a commercial wall, or a coherence probe such as timezone-vs-exit.
targetstring | nullThe site the detector was met on. Null for probes that need no target.
subjectstringThe subjects[].id this row is about.
resultenumpass, fail, blocked, inconclusive or error. The meanings are on the method page and they are not interchangeable.
detailstringWhat actually happened, in one sentence.
metricsobject?Readable values behind the verdict: a score, an HTTP status, what the OS was read as.
segmentstringThe segments[].id this check ran in.
roundnumber?Set when a segment pairs subjects round by round.
kernelstring?Present when this check did not run on the run-level build.
proxyobject?Present when this check did not use the run-level exit.
evidence_urlstring | nullA capture, where one exists. Null rather than a broken link.
checked_atISO 8601Date-only where only a date was recorded.

What each result value means, why a blocked check and a failed check are different things, and how a run is designed in the first place: the method page.

Using it

const res = await fetch('https://antibrow.com/reports/all.json')
const { runs } = await res.json()

// every check that a commercial wall blocked, across every run
const blocked = runs.flatMap((r) =>
  r.checks.filter((c) => c.result === 'blocked').map((c) => ({ run: r.run_id, ...c }))
)

The CSV carries the same rows with the run-level kernel and proxy folded into each line, so a row is readable on its own in a spreadsheet.

How to cite

Attribution is the licence condition, and a link is how attribution is normally given.

AntiBrow, “Detection runs dataset.”
<a href="https://antibrow.com/reports/data">antibrow.com/reports/data</a>
(CC BY 4.0)
AntiBrow. Detection runs dataset. https://antibrow.com/reports/data. CC BY 4.0.

To cite one run rather than the collection, the run's own page carries a citation with its date and a BibTeX entry.