Skip to content
Diagram: publisher, exchange and buyer nodes; the ads.txt line for seller 4471 matched against seller_id 4471 in sellers.json

Programmatic - 9 min read

ads.txt and sellers.json: How Publishers Declare Who May Sell Their Ad Space, and How Buyers Check It

ads.txt lists the ad companies allowed to sell a website's ad space; sellers.json and the SupplyChain object show who is behind each seller account. The line format, DIRECT vs RESELLER, the crawler rules, and the four checks a buyer runs on one bid request.

On May 16, 2017, the IAB Tech Lab announced ads.txt, a plain text file that a website puts at the root of its domain to name every ad company allowed to sell its ad space (IAB Tech Lab, May 2017).

Short answer

ads.txt is the publisher's list of authorized sellers: one line per ad system, with the publisher's account ID there and the word DIRECT or RESELLER. sellers.json is the ad system's side: it says which company is behind each of those account IDs. The SupplyChain object (schain) travels inside each bid request and lists the companies in its payment path; when it is marked complete, all of them back to the site owner. A buyer who checks all three can tell whether the seller is one the site authorized, and who sits in between. None of them proves a human saw the ad.

What is ads.txt, and what problem does it solve?

ads.txt ("Authorized Digital Sellers") is a public file at /ads.txt on a website's root domain, in which the site owner lists the ad systems and account IDs that may sell its inventory. The specification describes the fraud it targets: ad space "offered to buyers with a misrepresented label", where "the domain of the webpage, or the ID of the mobile app has been falsified" (ads.txt 1.1, section 2). The IAB Tech Lab calls this counterfeit inventory.

Before ads.txt, a buyer had only the seller's word that an impression came from a well-known news site. Now the buyer can fetch the site's own file and see whether the account selling the impression is on it. The publisher writes the list; anyone can read it.

exchange.example, 4471, DIRECT, a1b2c3

  1. Ad system domain (required). The "canonical domain name of the SSP, Exchange, Header Wrapper, etc system that bidders connect to".
  2. Your account ID (required). It "must contain the same value used in transactions", usually publisher.id in an OpenRTB bid request. Copy it exactly from your partner.
  3. Relationship (required). DIRECT or RESELLER, read case-insensitive.
  4. Certification authority ID (optional). The TAG ID of the ad system; the spec says this field "may be deprecated in a future version".
One record of an ads.txt file. Domains and IDs are made-up examples; field rules and quotes from ads.txt 1.1, section 3.3. Anything after a # is a comment.

What do DIRECT, RESELLER and the other terms mean?

DIRECT
The publisher "directly controls the account" on that ad system, which "tends to mean a direct business contract" with it (ads.txt 1.1).
RESELLER
The publisher "has authorized another entity to control the account" and resell the ad space through that ad system (ads.txt 1.1).
OWNERDOMAIN
Added in version 1.1: the business domain of the company that owns the site. It should equal the domain in that publisher's sellers.json entries (section 3.5.1). Without it, buyers assume the owner domain is the site's own domain (ads.txt 1.1, section 4.7).
MANAGERDOMAIN
Also from 1.1, optional: the domain of a primary or exclusive monetization partner, at most one per country (ads.txt 1.1).
seller_id
The account ID in a sellers.json file: "the same ID that appears in an ads.txt file" and in the schain sid (sellers.json 1.0).
seller_type
PUBLISHER when the named company owns the inventory and the ad system pays it directly; INTERMEDIARY when it does not own it or is not paid directly; BOTH when the account sells both kinds (sellers.json 1.0).
schain complete
Set to 1 when the chain "contains all nodes involved in the transaction leading back to the owner" of the site or app, 0 when it does not (SupplyChain object).

How does a buyer check one ad slot against the three files?

Follow one made-up bid request for an ad on news.example. The three files below are what the buyer's system reads; each check marks the lines it relies on with its number and color.

Bid request excerpt

"site": { "domain": "news.example",  "publisher": { "id": "4471" } },"source": { "schain": {  "ver": "1.0", "complete": 1,  "nodes": [  { "asi": "exchange.example",    "sid": "4471", "hp": 1 }] } }

news.example/ads.txt text/plain

# ads.txt for news.example[email protected]OWNERDOMAIN=news-group.exampleexchange.example, 4471, DIRECTresell.example, 88, RESELLER

exchange.example/sellers.json excerpt

{ "version": "1.0", "sellers": [  { "seller_id": "4471",    "seller_type": "PUBLISHER",    "name": "Example News Ltd",    "domain": "news-group.example" }] }
Made-up example files. Field names follow the SupplyChain object, ads.txt 1.1 and sellers.json 1.0.
  1. Read who is selling

    The request says the ad is on news.example. Its schain has one node: account 4471 on exchange.example, with complete set to 1. In a complete chain the first node is the owner's own account and the last is the company sending the request; here they are the same, so no reseller sits in between.

  2. Find the line in ads.txt

    The buyer fetches news.example/ads.txt and looks for the pair exchange.example, 4471. It is there, marked DIRECT. A request selling news.example through an account the file does not list comes from an unauthorized seller, and Display & Video 360 excludes unauthorized sellers (Display & Video 360 help).

  3. Look the account up in sellers.json

    The ad system named in the line publishes /sellers.json on its own root domain. Seller 4471 is a PUBLISHER: the named company owns the inventory and is paid directly. Neither spec formally pairs these words with DIRECT and RESELLER, but the definitions line up: DIRECT means the publisher controls the account itself. A DIRECT line that leads to an INTERMEDIARY account is a mismatch worth asking about (an account marked BOTH can carry either kind).

  4. Match the owner

    The ads.txt file declares OWNERDOMAIN=news-group.example, and the sellers.json entry has the same domain. The spec asks for exactly this: in a complete chain, the first node's seller domain should match the OWNERDOMAIN (ads.txt 1.1, section 3.5.1). All four checks pass.

Which file answers which question?

The IAB Tech Lab sums up the three standards in one line each: ads.txt, "Who's allowed to sell my inventory?"; sellers.json, "Who actually is the seller?"; the SupplyChain object, "How is the bid request generated and handled?" (Digital Supply Chain info sheet, October 2026).

FileWho publishes itWhere it livesFinal version
ads.txtThe website owner/ads.txt on the root domain, served as text/plain1.0 in June 2017; 1.1, with OWNERDOMAIN and MANAGERDOMAIN, in 2022
app-ads.txtThe app developer/app-ads.txt on the developer website listed in the app storeMarch 2019
sellers.jsonThe ad system (SSP, exchange)/sellers.json on the ad system's root domain, as application/jsonJuly 2019
SupplyChain objectEvery seller that handles the request, each adding its own nodeInside the bid request: source.schain in OpenRTB 2.6, source.ext.schain in 2.5July 2019

Dates: ads.txt change log, IAB Tech Lab on app-ads.txt, IAB Tech Lab on sellers.json and SupplyChain. For apps, publishing a website and listing its URL in the store "is required for the app's ad inventory to participate" in the scheme; the app-ads.txt file goes on that website (app-ads.txt spec).

Why do buyers care which companies sit between them and the publisher?

15%

of advertiser spend could not be traced to any company in the ISBA and PwC study of the UK programmatic supply chain. Publishers received about half.

  • 51% reached publishers
  • 34% went to supply chain costs that could be traced (100% minus the other two)
  • 15% "unknown delta": spend no one could attribute, about a third of all supply chain costs
Source: ISBA and PwC, Programmatic Supply Chain Transparency Study, executive summary, May 2020. 15 advertisers and 12 publishers, data from 1 January to 20 March 2020. The shares are measured on the 31 million of 267 million impressions (12%) that could be matched from end to end, not on all UK programmatic spend.

The study is small and dated, but it shows the problem these files help with: money leaves the advertiser, passes through several companies, and part of it cannot be followed. ads.txt, sellers.json and schain do not show fees. They show who is in the path, so a buyer can choose shorter, known paths. The money question has not gone away: in its December 2023 study of 21 advertisers' log-level data, the ANA found that "only 36 cents of every dollar that enters a demand-side platform (DSP) effectively reaches the consumer" (ANA).

What should a publisher check before publishing ads.txt?

  • One line for every account each ad partner sells through, with the account ID exactly as the partner uses it in bid requests.
  • DIRECT only for accounts you control yourself; RESELLER for accounts a partner controls on your behalf.
  • The file at /ads.txt on the root domain, sent as Content-Type: text/plain. The spec says any other content type is an error and the content is ignored (ads.txt 1.1, section 3.2).
  • HTTP requests for the file redirected to HTTPS, which the spec recommends when spoofing of the file is a concern. Redirects may hop around inside your root domain; only one redirect to another domain is allowed (ads.txt 1.1, sections 3.1 and 5.4).
  • If the file lives on www, the bare domain redirecting to it: Google crawls www.domain.com/ads.txt only if domain.com/ads.txt redirects there, and a robots.txt rule that blocks the file can make Google ignore it (AdSense help).
  • OWNERDOMAIN= set to the domain your ad partners show for you in their sellers.json files.
  • Subdomains with their own file listed with subdomain= in the root file; crawlers look only at subdomains listed there (ads.txt 1.1, section 5.5).
  • No ad partners at all? Publish the placeholder line placeholder.example.com, placeholder, DIRECT, placeholder; the old empty-file method is deprecated (ads.txt 1.1, section 3.2.1).
  • Lines removed for partners you have stopped working with, so the list stays a true picture of who may sell.

Questions buyers and publishers ask about ads.txt

Is ads.txt required?

No law requires it; Google's AdSense help says its use "is not mandatory, but it's highly recommended" (AdSense help). Under the spec, a site that returns 404 for /ads.txt is read as having no declarations, so no seller counts as unauthorized. Buyers can be stricter: Display & Video 360 buys from authorized sellers only by default, and inventory from publishers without a file only if the buyer opts in, "at your own risk" (Display & Video 360 help). And if a site's file exists but leaves out its Google publisher ID, Ad Manager stops monetizing the site and Google stops buying there (Google Ad Manager help).

How long until a change counts?

Crawlers cache the file: with no cache headers, the spec's default is 7 days (ads.txt 1.1, section 3.6). Google says AdSense can take a few days, and up to a month for a site with few ad requests (AdSense ads.txt guide).

What happens if my server errors on the file?

The spec reads a 404 as "no declarations" and, for other errors, tells crawlers to keep using the last file they fetched. Google purges earlier entries on a 404 too. After a soft 404 or a 500 error it keeps them only for up to 5 days, where the spec sets no limit (AdSense help).

Does ads.txt stop ad fraud?

Only one kind: inventory sold under a false site or app label. The app-ads.txt spec warns that a dishonest ad platform can still swap in an authorized publisher ID, and that "authorized inventory must still be screened and monitored for invalid traffic" (app-ads.txt spec). A bot visiting a real, correctly listed site would pass every check above.

What is a confidential seller in sellers.json?

An entry with is_confidential set to 1. It must still be listed, but its name and domain may be left out (sellers.json 1.0). The spec does not say how buyers should treat such entries.

What is the difference between ads.txt and app-ads.txt?

Same record format, different home. A website hosts /ads.txt itself; an app's file sits on the developer website named in the app store listing, with any www. or m. prefix removed from the domain, and the subdomain= variable is not used (app-ads.txt spec).

Sources