Publisher Independence
ads.txt and sellers.json Validator: Check Your Files Free
Published · Last updated
Next scheduled review:

Validate supply-chain files
Fetch public files or paste content. The service checks syntax, seller relationships and an optional SupplyChain object. A valid file does not establish a seller’s reputation or guarantee access to demand.
Inputs are sent only when you choose Validate. Pasted content and reports are discarded after the request. Seller registries, robots policies and app metadata use temporary memory caches. Optional public badges retain a hostname and result counts for up to 24 hours. The API does not log inputs or reports. This tool sends no analytics events.
A badge starts as “not checked” and links to a fresh report. Checks can be incomplete when robots rules, rate limits or unreachable files prevent retrieval. Badge summaries expire after one day.
ads.txt and app-ads.txt are text files a publisher or app developer hosts to list who may sell its inventory. sellers.json is a JSON file each exchange hosts to name the sellers it pays. The OpenRTB SupplyChain object carries the chain of sellers inside each bid request. A validator checks syntax, location and that the three agree.
Key facts
- ads.txt is on version 1.1. The 1.1 specification went to public comment in April 2022 and was finalized in July 2022 per its change log; IAB Tech Lab's standards page lists it as August 2022 and records earlier releases 1.0 (June 2017), 1.0.1 (August 2017), 1.0.2 (March 2019) and 1.0.3 (March 2021) (IAB Tech Lab, ads.txt 1.1 specification; IAB Tech Lab, ads.txt standards page, accessed 17 October 2026).
- sellers.json and the SupplyChain object are both version 1.0, from July 2019. The OpenRTB working group finalized them for adoption on 31 July 2019 (IAB Tech Lab, sellers.json page, accessed 17 October 2026; sellers.json 1.0 specification).
- The chain lives in
Source.schainfrom OpenRTB 2.6. The 2.6 specification definesschainin the Source object and says the SupplyChain object "can be used with OpenRTB 2.5" atsource.ext.schain(OpenRTB 2.6 specification, section 3.2.2; SupplyChain object specification). - Four fields per ads.txt line, one of them optional. Advertising system domain, publisher account ID, DIRECT or RESELLER, and an optional certification authority ID that the spec says "may be deprecated" in favor of sellers.json identifiers (ads.txt 1.1 specification).
- Google's crawl is not instant. Changes "may take a few days" to show in AdSense and "up to a month" on sites with few ad requests (Google AdSense Help, ads.txt guide, accessed 17 October 2026). Google's own sellers.json is at realtimebidding.google.com/sellers.json, and switching a seat to transparent shows within 24 hours (Google AdSense Help, sellers.json, accessed 17 October 2026).
- Caches expire in 7 days by default. Both ads.txt and sellers.json consumers should honor the HTTP Expires header and otherwise refresh after 7 days (ads.txt 1.1 specification; sellers.json 1.0 specification).
Definitions
ads.txt (Authorized Digital Sellers): a plain-text file at /ads.txt on a publisher's root domain listing, one per line, the advertising systems and account IDs authorized to sell that domain's inventory (ads.txt 1.1 specification).
app-ads.txt: the same format for mobile and CTV apps, hosted at /app-ads.txt on the developer domain that the app store listing points to (app-ads.txt specification).
sellers.json: a JSON file at /sellers.json on an advertising system's root domain listing every seller the system pays, with a seller ID, type and, unless confidential, name and domain (sellers.json 1.0 specification).
SupplyChain object (schain): an OpenRTB object listing, in order, every seller that handled a bid request, each node identified by the advertising system's domain and the seller ID used in that system (SupplyChain object specification). Glossary entries for all four will live under /glossary/.
How the four fit together
A buyer receives a bid request with a SupplyChain object. For each node it reads asi (the system's domain) and sid (the seller ID). It fetches https://{asi}/sellers.json and looks up sid to learn the seller's legal name, domain and type. It then fetches https://{site domain}/ads.txt (or the developer domain's /app-ads.txt) and checks that a line exists for that asi and that account ID, with DIRECT or RESELLER matching the seller's type. IAB Tech Lab's implementation guidance adds the 1.1 step: compare sellers.domain with the ads.txt OWNERDOMAIN (owner), MANAGERDOMAIN (manager, optionally per country) or neither (reseller) (IAB Tech Lab, Implementation Guidance, accessed 17 October 2026).
Diagram by AdSovereign, CC BY 4.0.
ads.txt 1.1, field by field
Data records (one per line, comma-separated; all fields required except the fourth) (ads.txt 1.1 specification):
4 of 4 rows
Download JSONTable by AdSovereign, CC BY 4.0.
1 | Advertising system domain | "The canonical domain name of the SSP, Exchange, Header Wrapper, etc system that bidders connect to"; must match the system bidders receive requests from |
2 | Publisher account ID | "The identifier associated with the seller or reseller account within the advertising system in field #1"; must match the ID sent in transactions |
3 | Account type | DIRECT: "the Publisher (content owner) directly controls the account"; RESELLER: "the Publisher has authorized another entity to control the account"; case-insensitive |
4 | Certification authority ID (optional) | "An ID that uniquely identifies the advertising system within a certification authority," for example a TAG ID; may be deprecated in favor of sellers.json identifiers |
Variables (NAME=VALUE lines) (ads.txt 1.1 specification):
5 of 5 rows
Download JSONTable by AdSovereign, CC BY 4.0.
CONTACT | Optional | Human-readable contact for the file owner |
SUBDOMAIN | Optional | Points to a subdomain with its own ads.txt; only root domains may refer to subdomains, and subdomains may not refer onward |
INVENTORYPARTNERDOMAIN | Recommended where relevant | Domain of a partner authorized to monetize the content; one hop; applies only when |
OWNERDOMAIN | Recommended | Business domain that owns the site or app, in PSL+1 form; only the first instance is used; if absent, the monetized domain is assumed to be the owner |
MANAGERDOMAIN | Optional | Domain of a primary or exclusive monetization partner, in the form |
File rules (ads.txt 1.1 specification): hosted at /ads.txt on the root domain (public suffix plus one label, derived with the Public Suffix List); subdomain files count only when declared with SUBDOMAIN; Content-Type must be text/plain; # starts a comment to end of line; CR, LF and CRLF accepted; 301, 302 and 307 redirects followed within the root domain, plus exactly one redirect to a third-party domain; a 404 means no declarations; a 401 means the crawler should contact the site; other errors fall back to the last good copy; a file with no sellers should carry a placeholder line such as placeholder.example.com, placeholder, DIRECT, placeholder, because the empty-file convention was deprecated and consumers were told to ignore it after 1 March 2020.
Annotated example
# ads.txt for publisher.example, updated 2026-10-17
CONTACT=adops@publisher.example # optional, human-readable
OWNERDOMAIN=publisher.example # PSL+1; first instance only
MANAGERDOMAIN=saleshouse.example, DE # exclusive manager for Germany only
SUBDOMAIN=video.publisher.example # video.publisher.example/ads.txt governs that subdomain
google.com, pub-0000000000000000, DIRECT, f08c47fec0942fa0 # Google's required line format (replace the pub ID)
ssp.example, 1942009976, DIRECT # field 4 optional
ssp.example, 1397382429, RESELLER, 28cb65e5bbc0bd5f # a reseller seat on the same SSP, with TAG ID
exchange.example, EB_0001, RESELLER # account controlled by the sales house
The Google line format is from Google's own guide, which says the file "must be formatted as specified by the IAB Tech Lab in order to be verified" (Google AdSense Help, ads.txt guide, accessed 17 October 2026).
app-ads.txt
The format is the same; discovery is different. The app store listing exposes a developer website (as an appstore:developer_url meta tag); the verifier takes its host, keeps the first one or two labels before the public suffix, drops www. or m., appends /app-ads.txt, tries HTTPS then HTTP, and checks the subdomain's file before the parent domain's (app-ads.txt specification). The SUBDOMAIN variable is ignored in app-ads.txt. Apps are indexed by bundle ID (for example an Android package name) or store ID (an iTunes numeric ID or ASIN), and store URLs are treated as opaque; the spec names connected television app stores as a distribution channel and uses a Roku Channel Store URL as an example (same). IAB Tech Lab lists app-ads.txt 1.0 as final; the specification document carries no version date (IAB Tech Lab, ads.txt standards page).
sellers.json 1.0, field by field
Top-level object (sellers.json 1.0 specification):
6 of 6 rows
Download JSONTable by AdSovereign, CC BY 4.0.
| array | Yes | Every seller the system represents, including confidential ones |
| string | Yes | Only valid value is |
| array | No | Objects with |
| string | No | Contact for questions about the file |
| string | No | Business address of the system |
| object | No | System-specific extensions |
Seller object (sellers.json 1.0 specification):
8 of 8 rows
Download JSONTable by AdSovereign, CC BY 4.0.
| string | Yes | Matches the ads.txt account ID and the schain |
| string | Yes |
|
| integer | No, default 0 | 1 hides name and domain; the seller must still be listed |
| integer | No, default 0 | 1 means the seller has an account-control relationship with the downstream system; if it is the last node, the buyer must have that relationship with it |
| string | Yes unless confidential | Legal entity name paid for the inventory |
| string | Yes if the seller has a web presence and is not confidential | Root domain of the entity; for INTERMEDIARY or BOTH, the root domain of that seller's own sellers.json |
| string | No | Describes the inventory, useful when one entity has several IDs |
| object | No | System-specific extensions |
File rules (sellers.json 1.0 specification): /sellers.json on the advertising system's root domain; HTTPS preferred; redirects followed within the root domain plus one off-domain redirect; on a 404 or error, consumers use the last good copy; honor Expires, otherwise 7 days.
Annotated example (values follow the IAB sample)
{
"contact_email": "adops@ssp.example", // optional
"contact_address": "SSP Example Inc., 101 Main Street, New York, NY 10101",
"version": "1.0", // the only valid value
"identifiers": [ { "name": "TAG-ID", "value": "28cb65e5bbc0bd5f" } ],
"sellers": [
{ "seller_id": "1942009976", "name": "Publisher One", "domain": "publisher.example",
"seller_type": "PUBLISHER" }, // owns the inventory; matches ads.txt field 2
{ "seller_id": "1397382429", "name": "Exchange One", "domain": "exchange.example",
"seller_type": "INTERMEDIARY" }, // domain is where exchange.example/sellers.json lives
{ "seller_id": "00000001", "seller_type": "INTERMEDIARY", "is_confidential": 1 }, // listed, but unnamed
{ "seller_id": "EB_0001", "name": "Sales House", "domain": "saleshouse.example",
"seller_type": "PUBLISHER", "is_passthrough": 1,
"comment": "buyer must hold an account relationship with Sales House" }
]
}
(JSON does not allow comments; remove them before publishing.) Google's file lists each AdSense, AdMob and Ad Manager seat under its 16-digit pub- ID, and a seat set to confidential appears without name or domain (Google AdSense Help, sellers.json, accessed 17 October 2026).
The SupplyChain object, field by field
Placement (SupplyChain object specification; OpenRTB 2.6 specification): BidRequest.source.schain in OpenRTB 2.6 and later; BidRequest.source.ext.schain in 2.5; BidRequest.ext.schain in 2.4 and earlier. Prebid Server Go can copy the legacy locations into source.schain (Prebid Server feature index, accessed 17 October 2026).
11 of 11 rows
Download JSONTable by AdSovereign, CC BY 4.0.
SupplyChain |
| integer | Yes | 1 if the chain includes every node back to the inventory owner, else 0 |
SupplyChain |
| array | Yes | Ordered; the last node is the sender of the request |
SupplyChain |
| string | Yes | "major.minor", currently "1.0" |
SupplyChain |
| object | No | Extensions |
Node |
| string | Yes | Canonical domain of the SSP, exchange or other system; should match the ads.txt value |
Node |
| string | Yes | Seller or reseller account ID as used in bid requests (typically |
Node |
| integer | Yes | 1 if the node is in the payment flow; must be 1 in version 1.0 |
Node |
| string | No | The request ID this seller issued |
Node |
| string | No | Legal name; omit if in the system's sellers.json |
Node |
| string | No | Business domain; omit if in sellers.json |
Node |
| object | No | Extensions |
Annotated example (OpenRTB 2.5 placement; move schain up one level for 2.6)
"source": {
"ext": {
"schain": {
"ver": "1.0",
"complete": 1, // every node back to the owner is present
"nodes": [
{ "asi": "ssp.example", "sid": "1942009976", "rid": "req-100", "hp": 1 }, // publisher's seat on the SSP
{ "asi": "exchange.example", "sid": "x42", "rid": "req-205", "hp": 1 } // the exchange that forwarded it; last node = sender
]
}
}
}
For tag-based and VAST requests the chain is serialized as {ver},{complete}!{asi},{sid},{hp},{rid},{name},{domain},{ext} with ! between nodes and commas within, for example 1.0,1!ssp.example,1942009976,1,req-100,,; values containing commas or bangs must be URL-encoded (SupplyChain object specification).
Ten common errors
- Wrong location. The file is at
/ads.txton a subdomain or a path, not the root domain (PSL+1), or the root file does not declare the subdomain with SUBDOMAIN (ads.txt 1.1). - Wrong Content-Type. Served as
text/html(often an error page with a 200 status); the spec requirestext/plainand treats anything else as an error to ignore (ads.txt 1.1). - Too many redirects. More than one hop to a third-party domain, or a redirect chain that leaves the root and redirects again (ads.txt 1.1; sellers.json 1.0).
- DIRECT on a seat you do not control. The guidance lists marking DIRECT for accounts the publisher does not directly control as a mistake SSPs can check (Implementation Guidance).
- Account ID mismatch. Field 2 differs from the ID in bid requests and from
seller_idin the partner's sellers.json, usually a typo or an old seat (ads.txt 1.1; sellers.json 1.0). - Missing OWNERDOMAIN. The guidance says to publish it even when the site and owner domains are the same, and flags PUBLISHER entries whose
sellers.domaindoes not match OWNERDOMAIN (Implementation Guidance). - MANAGERDOMAIN misuse. Two managers declared for the same country (invalid), or a manager declared when the inventory is also sold directly or through others (Implementation Guidance).
- Empty file instead of a placeholder. Consumers were told to ignore the empty-file convention after 1 March 2020; use the placeholder record (ads.txt 1.1).
- sellers.json structural faults.
versionnot"1.0", a seller withis_confidential0 but noname, adomaingiven as a URL rather than a root domain, or aseller_idreused for two legal entities (sellers.json 1.0). - Broken chain.
completeset to 1 while a node is missing;hpnot 1;sidlonger than 64 characters;asithat does not match the ads.txt field 1 domain (SupplyChain object specification).
How validators check them
A validator runs four layers.
Fetch and transport. Resolve the root domain with the Public Suffix List; request /ads.txt (or the developer domain's /app-ads.txt); follow redirects within the rules; check status (404 means no declarations, 401 means contact the site), Content-Type text/plain, and encoding; record Expires or default to 7 days (ads.txt 1.1).
Syntax. Parse comments, variables and records; require fields 1 to 3; check field 3 is DIRECT or RESELLER; check variables against the five defined names and the MANAGERDOMAIN country format; reject tabs, unencoded commas and whitespace inside fields (ads.txt 1.1).
Cross-reference. For each record, fetch https://{field 1}/sellers.json, confirm it parses with version "1.0", find seller_id equal to field 2, and compare: DIRECT should pair with PUBLISHER (or BOTH) and sellers.domain should equal OWNERDOMAIN; RESELLER should pair with INTERMEDIARY (or BOTH); a sellers.domain matching MANAGERDOMAIN for the right country marks a manager (Implementation Guidance). If a bid request sample is supplied, check each schain node's asi and sid against the same files (SupplyChain object specification).
Timing. Report that crawlers refresh on their own schedule. Google says changes take "a few days" and up to a month for low-traffic sites, and offers "Check for updates" in AdSense; a transparent sellers.json entry appears within 24 hours (Google AdSense Help, ads.txt guide; Google AdSense Help, sellers.json). The app-ads.txt spec asks verifiers to crawl store listings no more than weekly (app-ads.txt specification).
A validator cannot tell you whether a seat should exist; that question comes up every time a demand path changes: adding a Prebid Server with its own seats (Prebid Server self-hosting guide), moving to a second ad server (how to switch ad servers without losing AdX demand), running an owned exchange with its own sellers.json (private ad exchange setup guide), or receiving AdX bids through a new path after the Google remedies, which will add Google-side seats to your files (Google ad tech remedies explained for publishers). The ad servers those paths run through are compared in Google Ad Manager alternatives, the request flow itself in RTB architecture explained, the auction options in header bidding vs server-side bidding, and the hub for this direction is publisher independence.
FAQ
What is the difference between ads.txt and sellers.json?
Direction. ads.txt is published by the publisher and names the systems and seats allowed to sell its inventory; sellers.json is published by the advertising system and names the sellers it pays. The seller_id in sellers.json must match the account ID in ads.txt and the sid in the SupplyChain object, which is how a buyer joins the three (sellers.json 1.0).
Where do I put app-ads.txt?
At /app-ads.txt on the developer website listed in your app store entry, after stripping www. or m.; verifiers check the listed subdomain first and then its parent domain (app-ads.txt specification).
What does DIRECT vs RESELLER mean? DIRECT means "the Publisher (content owner) directly controls the account" on that advertising system; RESELLER means "the Publisher has authorized another entity to control the account" (ads.txt 1.1). In sellers.json the counterpart is PUBLISHER versus INTERMEDIARY, and the implementation guidance tells SSPs to check that the two agree (Implementation Guidance).
How long does it take Google to crawl ads.txt? Google does not publish a crawl interval. Its guide says changes "may take a few days" to be reflected and "up to a month" for sites with few ad requests(Google AdSense Help, accessed 17 October 2026). The IAB default cache expiry for consumers is 7 days (ads.txt 1.1).
Is ads.txt mandatory? Not by the specification, and Google describes declaring authorized sellers as "not mandatory, but is highly recommended" (Google Ad Manager Help, accessed 17 October 2026). In practice buyers and exchanges treat a missing or failing file as a reason not to bid, and Google surfaces unauthorised seats as alerts in the publisher's account (Google AdSense Help).
How this works on owned infrastructure
A publisher that runs its own exchange and Prebid Server becomes an advertising system in its own right: it must publish a sellers.json for the seats it pays, its seat must appear in partners' files, and every bid it forwards must carry a correct SupplyChain node. AdSovereign is an enterprise RTB stack deployed on the publisher's own infrastructure, and it generates and serves sellers.json from the same account database that drives the exchange, appends the schain node on every outbound request, and runs the checks on this page against partner files on a schedule. The architecture page shows where the supply-chain services sit, integrations lists the exchanges and bidders whose files are checked, security covers the signing and hosting of the files, and the pilot page describes a 60-day deployment. This explainer and the validator stay neutral; the product is mentioned only here.
Sources
- IAB Tech Lab, ads.txt specification version 1.1 (final July 2022 per change log). https://github.com/InteractiveAdvertisingBureau/Supply-Chain-Validation/blob/main/ads.txt%20v1.1.md
- IAB Tech Lab, app-ads.txt specification (version 1.0). https://github.com/InteractiveAdvertisingBureau/Supply-Chain-Validation/blob/main/app-ads.txt.md
- IAB Tech Lab, sellers.json specification version 1.0 (July 2019). https://iabtechlab.com/wp-content/uploads/2019/07/Sellers.json_Final.pdf
- IAB Tech Lab, OpenRTB SupplyChain object specification (version 1.0). https://github.com/InteractiveAdvertisingBureau/openrtb/blob/master/supplychainobject.md
- IAB Tech Lab, Supply Chain Validation Implementation Guidance (OWNERDOMAIN and MANAGERDOMAIN). https://github.com/InteractiveAdvertisingBureau/Supply-Chain-Validation/blob/main/Implementation%20Guidance.md
- IAB Tech Lab, ads.txt standards page with version history (accessed 17 October 2026). https://iabtechlab.com/standards/ads-txt/
- IAB Tech Lab, sellers.json and SupplyChain object page (finalized 31 July 2019; accessed 17 October 2026). https://iabtechlab.com/sellers-json/
- IAB Tech Lab, OpenRTB 2.6 specification, section 3.2.2 Object: Source (accessed 17 October 2026). https://raw.githubusercontent.com/InteractiveAdvertisingBureau/openrtb2.x/main/2.6.md
- Google AdSense Help, "ads.txt guide" (accessed 17 October 2026). https://support.google.com/adsense/answer/7532444
- Google AdSense Help, "sellers.json" (accessed 17 October 2026). https://support.google.com/adsense/answer/9889911
- Google Ad Manager Help, "About ads.txt and app-ads.txt" (accessed 17 October 2026). https://support.google.com/admanager/answer/7441288
- Prebid.org, Prebid Server feature index (schain compatibility; accessed 17 October 2026). https://docs.prebid.org/prebid-server/features/pbs-feature-idx.html
- IAB Tech Lab, Digital Supply Chain Info Sheet (draft dated 7 October 2026; no version changes listed). https://iabtechlab.com/wp-content/uploads/2026/10/Digital-Supply-Chain-Info-Sheet-Oct-2026.pdf