Download
| File | Contents |
|---|---|
/reports/all.json | Every run, under a runs key. |
/reports/all.csv | Every check from every run, one row each. |
/api/v1/reports | The same data over the public API. No key, no rate limit worth mentioning. |
Runs
| Run | Checks | Files |
|---|---|---|
| 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
| Field | Type | Meaning |
|---|---|---|
run_id | string | Identifies the run. Stable, and reused as the key everything else joins on. |
slug | string | The written report this data belongs to, under /reports. |
title | string | Human-readable name of the run, and what a citation quotes. |
started_at, finished_at | ISO 8601 | Date-only where only a date was recorded. Times are never back-filled. |
kernel | string | The browser build the run was headlined on. Individual checks may override it. |
host | string | The machine the run was driven from. It is a variable, so it is published. |
proxy | object | The run-level exit: type, exit_ip, optional exit_block, geo. Checks may override it. |
subjects[] | array | What was compared: id, name, version (null when not recorded), config. |
segments[] | array | Measurement sessions within the run, each with its own window, description and optionally what the browser presented. |
checks[] | array | One object per detector per subject per round. The rows everything else exists to explain. |
notes[] | array | Observations, limits and retractions that are not a check result. |
license, canonical | string | CC-BY-4.0, and the page this data belongs to. |
checks[]
| Field | Type | Meaning |
|---|---|---|
detector | string | What was measured: a detector site, a commercial wall, or a coherence probe such as timezone-vs-exit. |
target | string | null | The site the detector was met on. Null for probes that need no target. |
subject | string | The subjects[].id this row is about. |
result | enum | pass, fail, blocked, inconclusive or error. The meanings are on the method page and they are not interchangeable. |
detail | string | What actually happened, in one sentence. |
metrics | object? | Readable values behind the verdict: a score, an HTTP status, what the OS was read as. |
segment | string | The segments[].id this check ran in. |
round | number? | Set when a segment pairs subjects round by round. |
kernel | string? | Present when this check did not run on the run-level build. |
proxy | object? | Present when this check did not use the run-level exit. |
evidence_url | string | null | A capture, where one exists. Null rather than a broken link. |
checked_at | ISO 8601 | Date-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.