Knowledge base: programmatic supply

ads.txt and sellers.json explained

Two small public files decide who is allowed to sell ad space on a website. This guide walks through ads.txt, app-ads.txt, sellers.json and the SupplyChain object, how they connect, and where they stop being enough.

/ads.txtPublished by the website. Lists the ad systems and account IDs allowed to sell its inventory.
/app-ads.txtThe same idea for mobile and CTV apps, hosted on the developer's website.
/sellers.jsonPublished by the ad system. Says who owns each seller account ID.
schainTravels inside the bid request. Lists every party that touched the impression.

Why these files exist

Before ads.txt, anyone could put any domain name into a bid request. Fraudsters sold cheap inventory labelled as famous news sites, and buyers had no way to check the claim. The files below close that gap by letting each side publish what it authorizes.

Domain spoofing

A seller claims an impression comes from a premium site when it actually comes from somewhere else. ads.txt lets the buyer check whether that seller account was ever authorized by the real site.

Unauthorized resale

Inventory gets passed through intermediaries the publisher never approved. Each extra hop takes a fee and hides where the money goes.

Opaque intermediaries

Account IDs alone say nothing about who is behind them. sellers.json adds names and domains so buyers can see which business they are paying.

Long supply paths

The same impression can reach a buyer through many routes. The SupplyChain object shows each route hop by hop, which feeds supply path decisions.

How the pieces connect

Think of it as a handshake checked from both ends. The publisher declares who may sell; the ad system declares who it is selling for; the bid request carries the path so the buyer can compare the two.

1

Publisher declares

The site places ads.txt at its root, naming each ad system domain, its account ID there, and whether the relationship is DIRECT or RESELLER.

2

Ad system declares

The exchange or SSP publishes sellers.json at its own root, mapping each seller ID to a business name, domain and seller type.

3

Request carries the path

When an impression is offered, the bid request includes the SupplyChain object listing each seller node and its ID.

4

Buyer verifies

The buyer matches the chain against the site's ads.txt and each node's sellers.json entry, then decides whether to bid.

Short version: ads.txt answers "who may sell this site", sellers.json answers "who is this seller", and the SupplyChain object answers "who touched this impression".

ads.txt line by line

The format is plain text, one record per line, with comma separated fields. Lines starting with a hash are comments. Variables use a name, an equals sign and a value.

# ads.txt for example-news-site.com OWNERDOMAIN=example-news-site.com MANAGERDOMAIN=example-sales-house.com [email protected] # ad system domain, seller account ID, relationship, optional certification ID exchange-one.com, 12345, DIRECT, abc123def456 exchange-two.com, pub-998877, RESELLER SUBDOMAIN=video.example-news-site.com

The domains and IDs above are invented for illustration. The table explains what each part does.

Field or variableWhat it meansWhat buyers check
Ad system domainThe canonical domain of the exchange or SSP that sells the inventory.That it matches the domain of the system sending the bid request.
Seller account IDThe publisher's or reseller's account ID inside that ad system.That it matches the seller ID in the request and in sellers.json.
RelationshipDIRECT if the publisher controls the account, RESELLER if another party sells on its behalf.That it agrees with the seller type declared in sellers.json.
Certification authority IDOptional ID of the ad system in a certification program.Used by some buyers as an extra trust signal.
OWNERDOMAINThe business domain of the company that owns the property. Added in version 1.1.That it matches a PUBLISHER or BOTH entry in sellers.json for DIRECT lines.
MANAGERDOMAINThe main or exclusive monetization partner, if there is one. Can be limited to a country.Helps explain why many DIRECT looking lines point to one sales house.
CONTACT and SUBDOMAINA contact for the file, and pointers to subdomains that host their own ads.txt.Crawlers follow SUBDOMAIN to find the right file for each host.

sellers.json fields that matter

sellers.json is a JSON file listing every seller account an ad system has. Each entry tells a buyer what kind of business is behind the ID, which turns a number into an accountable company.

seller_id

The account ID inside the ad system. It is the join key to ads.txt lines and to the sid values in the SupplyChain object.

seller_type

PUBLISHER, INTERMEDIARY or BOTH. A PUBLISHER owns the inventory, an INTERMEDIARY resells someone else's, and BOTH covers companies that do each.

name and domain

The legal or trading name and the business domain of the seller. For publishers this is where OWNERDOMAIN should line up.

is_confidential

A flag that hides the name and domain of a seller. It is allowed, but heavy use of it makes a supply path harder to judge.

is_passthrough

Marks intermediaries that pass inventory straight through without taking it over, which affects how a path is read.

Contact and version fields

File level fields carry the ad system's contact details and the spec version. They are useful when you need to report a mismatch.

The SupplyChain object in the bid request

IAB Tech Lab published the SupplyChain object alongside sellers.json in 2019. In OpenRTB 2.6 it moved from an extension into the core request, at source.schain.

Object level fields

  • complete: 1 if the chain claims to include every party back to the owner, 0 if it does not.
  • ver: the version of the object being used.
  • nodes: an ordered list, one entry per seller that handled the impression.

Node level fields

  • asi: the ad system domain for that hop, which should match an ads.txt line.
  • sid: the seller ID in that system, which should match sellers.json.
  • hp: whether that party is in the flow of payment for the impression.

Read with care: the complete flag is declared by the sellers themselves. Buyers often treat an incomplete chain, or one with confidential nodes, as a reason to discount rather than as proof of fraud.

app-ads.txt for mobile and CTV

Apps have no web root of their own, so app-ads.txt lives on the developer website listed in the app store. The buyer finds that site through the store listing, then reads the file there.

Same record format

Lines use the same ad system domain, account ID and relationship fields as web ads.txt, so most tooling handles both.

Store link is the anchor

The developer URL in the store listing ties the app to a domain. If that URL is wrong or missing, verification breaks.

Connected TV

CTV apps follow the same pattern, which matters because CTV inventory is expensive and a common target for spoofing.

Common errors and what they cause

Most problems are housekeeping, not fraud. They still cost money, because buyers that cannot verify a path tend to skip it.

1

Stale lines after a partner change

Old partners stay in the file for years. Buyers see authorizations nobody uses, and the file grows into hundreds of lines that are hard to audit.

2

DIRECT versus RESELLER mismatch

The site says DIRECT but sellers.json says INTERMEDIARY for that ID. Many buyers treat this as a red flag and filter the path.

3

Wrong or typo account IDs

One missing digit means the real seller account is unauthorized. Revenue drops without any visible error on the site.

4

File not reachable

Redirects to another host, login walls, bot protection or a wrong content type can stop crawlers from reading the file at all.

5

Confidential entries everywhere

An ad system that hides most of its sellers makes supply paths through it hard to assess, even if each seller is legitimate.

6

Missing OWNERDOMAIN

Without it, buyers cannot easily tie a site to the business that owns it, which weakens the link between ads.txt and sellers.json.

What these files do not tell you

An authorized seller can still sell inventory you would never want. The files prove permission, not quality or context.

Answered by seller files

  • Is this seller account allowed to sell this domain?
  • Which business sits behind the account?
  • Is the seller the owner or a reseller?
  • How many hops did the impression take?

Needs domain context

  • What is the site about, in IAB and filtering terms?
  • Is the domain parked, for sale or a thin ad page?
  • Is it a known, widely visited site or a long tail one?
  • Does it fall into a sensitive or blocked category for your brand?

That second column is what a categorized domain database covers. Our URL category taxonomy describes each domain with web filtering categories and IAB Content Taxonomy categories, and the made for advertising sites list covers one of the gaps directly.

Joining seller files with domain categories

Buyers and verification teams often crawl ads.txt across their whole bid stream. Adding a category for every domain in that crawl turns a permission list into a map of where money can go.

QuestionSeller file dataDomain category dataCombined answer
Which resellers carry mostly parked inventory?Reseller account IDs per domainParked / For-Sale Domains categoryPaths to drop or cap
Where does our news budget really flow?Seller names and typesNews/Media and IAB news categoriesDirect news paths versus resold ones
Which exchanges reach our niche?Ad system domains per siteIAB tier 2 and tier 3 categoriesShortlist of exchanges for the niche
Is an unfamiliar site worth testing?Authorized sellers and OWNERDOMAINCategory, country and popularity bandA quick yes, no or watch list decision

For the next step, where these joins drive which routes you buy through, see our guide to supply path optimization with domain data.

Checklist for buyers

A practical list for media buyers, DSP operators and verification teams who want seller files to actually change spending.

  • Crawl ads.txt and app-ads.txt for every domain and app in your bid stream, at least weekly.
  • Keep sellers.json snapshots for every exchange you buy from, with the date you fetched them.
  • Reject or flag paths where the seller ID is missing from the site's file.
  • Flag DIRECT lines that point to INTERMEDIARY sellers.
  • Track the share of confidential sellers per exchange.
  • Prefer complete chains with fewer hops for the same domain.
  • Add a category, country and popularity band to every domain you crawl.
  • Exclude parked and for-sale domains even when they are technically authorized.
  • Review new domains in the bid stream with a newly registered domains list.
  • Document your rules so traders can explain why a path was cut.

Checklist for publishers

Most publishers lose money to messy files, not fraud. A short routine keeps the file clean.

Prune every quarter

Remove partners you no longer work with. Ask active partners to confirm the exact lines they need.

Declare ownership

Add OWNERDOMAIN to every file, even on a single site, and MANAGERDOMAIN if one partner runs your sales.

Test reachability

Fetch the file from outside your network. Check that it returns plain text with no redirect to another host.

Match sellers.json

For each DIRECT line, confirm the ad system lists you as PUBLISHER or BOTH under your own business domain.

A worked verification example

Here is how one impression is checked, step by step, using invented names. The same logic runs millions of times a day inside buying platforms.

A

The request arrives

A bid request says the page is on example-news-site.com, sold by exchange-two.com under seller ID pub-998877, with two nodes in the chain.

B

Check the site file

The buyer's cached ads.txt for the site lists exchange-two.com, pub-998877, RESELLER. The path is authorized as a resale.

C

Check the seller file

exchange-two.com's sellers.json lists pub-998877 as an INTERMEDIARY with a named business domain. Types agree.

D

Add domain context

The category file says the site is News/Media, in a popular band, not parked. The buyer bids, but may prefer a DIRECT path if one exists.

When it fails: if the seller ID is missing from the site's file, most buyers drop the request. If the domain turns out to be parked or a thin ad page, a good buyer drops it even when the files match.

Quick glossary

Terms you will meet in seller file reports and supply path reviews.

SSP

Supply side platform. Software that publishers use to offer inventory to many buyers at once. It usually publishes a sellers.json file.

DSP

Demand side platform. Software that buyers use to bid. It reads seller files and applies the buyer's rules before each bid.

Hop

One party in the chain between the site and the buyer. Fewer hops usually means lower fees and clearer accountability.

Seller graph

The network you get by joining every ads.txt line with every sellers.json entry. Analysts use it to spot resellers and duplicate paths.

Spoofing

Pretending an impression comes from a different domain or app than the real one. Seller files make simple spoofing easy to catch.

Arbitrage

Buying traffic cheaply and reselling the ad impressions at a higher price. It often shows up as long tail sites with many reseller lines.

Frequently asked questions

What is the difference between ads.txt and sellers.json?

ads.txt is published by the site owner and lists which ad systems and account IDs may sell its inventory. sellers.json is published by the ad system and lists who sits behind each seller ID. Together they let a buyer check both ends of a relationship.

Is ads.txt mandatory?

It is a voluntary industry standard, not a law. In practice many buyers will not bid on, or will discount, web inventory from domains that do not authorize the seller in an ads.txt file.

What did ads.txt version 1.1 add?

Version 1.1, released in 2022, added OWNERDOMAIN and MANAGERDOMAIN. They declare the business that owns the property and, where one exists, the main partner that manages its monetization.

What does DIRECT or RESELLER mean in ads.txt?

DIRECT means the publisher controls the seller account. RESELLER means another party sells the inventory through that account. The value should agree with the seller type in sellers.json.

Can ads.txt stop all ad fraud?

No. It mainly stops unauthorized resale and simple spoofing. It says nothing about traffic quality or what the site is about, so buyers pair it with ad fraud prevention checks and domain context.

How does domain category data help with ads.txt and sellers.json?

The seller files say who may sell a domain. Category data says what the domain is: topic, IAB category, parked status and popularity. You can check a domain to see the labels we hold for it.

Add context to every domain in your bid stream

Web filtering and IAB categories, country and popularity bands for over 120 million domains, delivered as files with a lookup API included. Join them with your ads.txt crawl in minutes.

See plans and pricing Programmatic use cases

IAB, IAB Tech Lab and OpenRTB are trademarks of the Interactive Advertising Bureau and IAB Technology Laboratory. They are named here only to identify the standards discussed. URL Categorization Database is not affiliated with, sponsored or endorsed by either organization.

echo '';