Plain Reckoner

Dataset

Where a publisher’s ads.txt and their ad network’s own seller list disagree, across 462 checked relationships

Two files are meant to say the same thing and nobody publishes how often they do not. A publisher hosts a file called ads.txt naming every company allowed to sell their advertising space, with the account number each one holds for them. The advertising network publishes a matching file, sellers.json, naming every account it may sell for and the site that account belongs to. The specification says the account number is the same in both, so the comparison is exact — and a publisher cannot run it on themselves, because the network’s file sits on a third domain that a browser is not permitted to fetch. We ran it across 462 relationships between one publisher and one network, drawn from 500 domains sampled at random from the 16,085 that six networks name as their customers. 426 matched. In 35 the network claims a site whose own file does not name it, which is the direction that costs the publisher: a buyer reading both files sees a seller nobody authorised.

Coverage
2026-09-02
Last measured
Licence
CC BY 4.0
DOI
10.5281/zenodo.22280372
What a row is
One relationship between a publisher and an advertising network: whether both files agree about it, and what the publisher’s own file looked like when it was read.
Subjects
ads.txt, sellers.json, authorised digital sellers, programmatic advertising, ad fraud, domain spoofing, supply chain transparency, IAB Tech Lab

Download the summary 462 rows · 10 columns · CSV · no account, no email

How to cite this

Use it commercially, change it, build on it. The only condition is credit, and a link satisfies it.

In a chart, where space is short Plain Reckoner (2026)
In full Plain Reckoner (2026). "Where a publisher’s ads.txt and their ad network’s own seller list disagree, across 462 checked relationships" [dataset]. https://doi.org/10.5281/zenodo.22280372
As HTML, ready to paste Source: <a href="https://plainreckoner.com/data/ads-txt-against-seller-lists/">Plain Reckoner, Where a publisher’s ads.txt and their ad network’s own seller list disagree, across 462 checked relationships</a>

What you should know about this data

How it was measured

500 domains were drawn at random from the 16,085 that six advertising networks name in their own published seller lists, using a published seed so the same draw can be repeated. 457 served a readable ads.txt and 43 refused or could not be reached; the ones that could not be reached are excluded rather than counted as having no file. Each domain was then compared against the seller lists of all six networks, one publisher-and-network pair at a time, matching on the account number, because that is the field the specification says the two files share. A pair is confirmed when the publisher’s file names the network and the network files that number against that site. It is roster-only when the network claims the site and the publisher’s file says nothing about it, and not-in-roster when the file names the network and that number appears on the network’s list nowhere. Rows are in the order the sample was drawn.

The summary

The first 60 of 462 rows. The download has all of them. Free to use with credit, commercially included.

network agreement why_unconfirmed other_network_named site_under_another_number ads_txt_status ads_txt_present records_declared unparsed_lines served_as_html
Raptive roster-only no-ads-txt no 404 no 0 0 no
Mediavine confirmed no 200 yes 144 0 no
Raptive confirmed no 200 yes 71 0 no
Mediavine confirmed no 200 yes 144 0 no
Mediavine confirmed no 200 yes 144 0 no
Mediavine confirmed no 200 yes 144 0 no
Mediavine confirmed no 200 yes 144 0 no
Raptive confirmed no 200 yes 71 0 no
Raptive confirmed no 200 yes 71 0 no
Mediavine roster-only names-another-network Raptive no 200 yes 71 0 no
Raptive confirmed no 200 yes 71 0 no
Mediavine confirmed no 200 yes 144 0 no
Raptive confirmed no 200 yes 71 0 no
Raptive confirmed no 200 yes 71 0 no
Raptive confirmed no 200 yes 71 0 no
Raptive confirmed no 200 yes 71 0 no
Playwire roster-only names-another-network Raptive no 200 yes 71 0 no
Mediavine confirmed no 200 yes 144 0 no
Raptive confirmed no 200 yes 71 0 no
Raptive confirmed no 200 yes 71 0 no
Mediavine confirmed no 200 yes 144 0 no
Raptive confirmed no 200 yes 71 0 no
Raptive confirmed no 200 yes 71 0 no
Mediavine confirmed no 200 yes 144 0 no
Raptive confirmed no 200 yes 71 0 no
Raptive confirmed no 200 yes 71 0 no
Mediavine confirmed no 200 yes 144 0 no
Raptive confirmed no 200 yes 71 0 no
Raptive confirmed no 200 yes 71 0 no
Mediavine confirmed no 200 yes 136 0 no
Mediavine confirmed no 200 yes 144 0 no
Raptive confirmed no 200 yes 71 0 no
Mediavine confirmed no 200 yes 144 0 no
Raptive confirmed no 200 yes 71 0 no
Raptive confirmed no 200 yes 71 0 no
Raptive confirmed no 200 yes 71 0 no
Raptive confirmed no 200 yes 71 0 no
Mediavine confirmed no 200 yes 144 0 no
Raptive confirmed no 200 yes 71 0 no
Mediavine confirmed no 200 yes 144 0 no
Raptive roster-only names-no-network no 200 yes 207 0 no
Raptive confirmed no 200 yes 71 0 no
Raptive confirmed no 200 yes 71 0 no
Mediavine roster-only no-ads-txt no 404 no 0 0 no
Raptive confirmed no 200 yes 72 0 no
Mediavine confirmed no 200 yes 67 0 no
Mediavine confirmed no 200 yes 144 0 no
Mediavine confirmed no 200 yes 144 0 no
Mediavine confirmed no 200 yes 144 0 no
Raptive confirmed no 200 yes 71 0 no
Raptive confirmed no 200 yes 71 0 no
Mediavine roster-only no-ads-txt no 404 no 0 0 no
Mediavine confirmed no 200 yes 139 0 no
Mediavine roster-only names-another-network Raptive no 200 yes 71 0 no
Raptive confirmed no 200 yes 71 0 no
Raptive confirmed no 200 yes 73 0 no
Mediavine confirmed no 200 yes 144 0 no
Raptive confirmed no 200 yes 71 0 no
Raptive confirmed no 200 yes 71 0 no
Mediavine confirmed no 200 yes 144 0 no

What each column means

network
The advertising network in this relationship
agreement
confirmed, roster-only or not-in-roster, as the method defines them
why_unconfirmed
For a roster-only row, what the publisher’s file did instead
other_network_named
The network the file named instead, where it named one of the six
site_under_another_number
yes when the network holds this site under an account number the site’s own file does not carry
ads_txt_status
The HTTP status the publisher’s address answered with
ads_txt_present
yes when that address served a usable ads.txt
records_declared
How many seller records the publisher’s file carries
unparsed_lines
Lines in the file that are neither a seller record nor a variable declaration
served_as_html
yes when the body began as a web page rather than as records

Want the record underneath this?

The download above is the complete dataset — all 462 rows, no account, no email, free to reuse with attribution. Nothing is held back from it.

What is not on the page is the working: the ads.txt bodies as they were served, the account numbers on each side of every comparison, and the 43 domains that could not be read at all. If you are checking our method, writing about this, or need something cut a different way, ask — we will send what we can and say plainly where we cannot.

No confirmation step and nothing to click. We log the request, email you to say so, and a person sends it — usually within a day. You are not added to any list, and unless you subscribe separately that acknowledgement is the only email you will get. What we collect.

← Every dataset