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.
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.
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.
Request carries the path
When an impression is offered, the bid request includes the SupplyChain object listing each seller node and its ID.
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.
The domains and IDs above are invented for illustration. The table explains what each part does.
| Field or variable | What it means | What buyers check |
|---|---|---|
| Ad system domain | The 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 ID | The publisher's or reseller's account ID inside that ad system. | That it matches the seller ID in the request and in sellers.json. |
| Relationship | DIRECT 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 ID | Optional ID of the ad system in a certification program. | Used by some buyers as an extra trust signal. |
OWNERDOMAIN | The 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. |
MANAGERDOMAIN | The 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 SUBDOMAIN | A 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.
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.
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.
Wrong or typo account IDs
One missing digit means the real seller account is unauthorized. Revenue drops without any visible error on the site.
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.
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.
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.
| Question | Seller file data | Domain category data | Combined answer |
|---|---|---|---|
| Which resellers carry mostly parked inventory? | Reseller account IDs per domain | Parked / For-Sale Domains category | Paths to drop or cap |
| Where does our news budget really flow? | Seller names and types | News/Media and IAB news categories | Direct news paths versus resold ones |
| Which exchanges reach our niche? | Ad system domains per site | IAB tier 2 and tier 3 categories | Shortlist of exchanges for the niche |
| Is an unfamiliar site worth testing? | Authorized sellers and OWNERDOMAIN | Category, country and popularity band | A 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.
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.
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.
Check the seller file
exchange-two.com's sellers.json lists pub-998877 as an INTERMEDIARY with a named business domain. Types agree.
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 casesIAB, 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.