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.
- 16,085 sites in the frame
- 500 domains drawn
- 462 checked relationships
- 426 confirmed by both files
- Coverage
- 2026-09-02
- Last measured
- Licence
- CC BY 4.0
- 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.
Plain Reckoner (2026) 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 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
- Neither file carries a date. Nothing in an ads.txt or a sellers.json says when an account was added or last confirmed, so a disagreement cannot be blamed on either side. What can be said is what a buyer reading both files on the day would have seen.
- There are two denominators and they must not be mixed. A row is one publisher against one network, so a publisher on two networks contributes two rows. The number of publishers behind this table is 457, not the number of rows.
- A file that could not be fetched says nothing about a publisher. The 43 domains that refused are excluded from the denominator rather than counted as having no file.
- These are small, advertising-funded content businesses named by six advertising networks. They are not the web, and a publisher with no ad network is not in the frame at all.
- The domain is not published. Every field the comparison used is, so the counts can be recomputed; which site each row is cannot be recovered from it.
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.