Publisher Independence

    ads.txt and sellers.json Validator: Check Your Files Free

    Published · Last updated
    Next scheduled review:

    ads.txt and sellers.json Validator: Check Your Files Free

    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.

    API documentation

    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

    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).

    Match asi and sid in the bid request with the publisher’s authorization and the advertising system’s seller identity.
    Match asi and sid in the bid request with the publisher’s authorization and the advertising system’s seller identity.

    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 JSON

    Table 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 JSON

    Table 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 inventorypartnerdomain is passed in the bid request; references ads.txt, not app-ads.txt

    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 domain, [ISO 3166-1 alpha-2 country]; blank country means global; one manager per country; country entries override the global entry

    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 JSON

    Table by AdSovereign, CC BY 4.0.

    sellers

    array

    Yes

    Every seller the system represents, including confidential ones

    version

    string

    Yes

    Only valid value is "1.0"

    identifiers

    array

    No

    Objects with name and value; standard names TAG-ID and DUNS

    contact_email

    string

    No

    Contact for questions about the file

    contact_address

    string

    No

    Business address of the system

    ext

    object

    No

    System-specific extensions

    8 of 8 rows

    Download JSON

    Table by AdSovereign, CC BY 4.0.

    seller_id

    string

    Yes

    Matches the ads.txt account ID and the schain sid; usually also publisher.id in OpenRTB; each ID maps to one legal entity, though one entity may hold several IDs

    seller_type

    string

    Yes

    PUBLISHER (inventory on the entity's own property, paid directly), INTERMEDIARY (not owned, or not paid directly) or BOTH; case-insensitive

    is_confidential

    integer

    No, default 0

    1 hides name and domain; the seller must still be listed

    is_passthrough

    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

    name

    string

    Yes unless confidential

    Legal entity name paid for the inventory

    domain

    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

    comment

    string

    No

    Describes the inventory, useful when one entity has several IDs

    ext

    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 JSON

    Table by AdSovereign, CC BY 4.0.

    SupplyChain

    complete

    integer

    Yes

    1 if the chain includes every node back to the inventory owner, else 0

    SupplyChain

    nodes

    array

    Yes

    Ordered; the last node is the sender of the request

    SupplyChain

    ver

    string

    Yes

    "major.minor", currently "1.0"

    SupplyChain

    ext

    object

    No

    Extensions

    Node

    asi

    string

    Yes

    Canonical domain of the SSP, exchange or other system; should match the ads.txt value

    Node

    sid

    string

    Yes

    Seller or reseller account ID as used in bid requests (typically publisher.id); max 64 characters; "It is invalid for a Seller ID to represent multiple entities"

    Node

    hp

    integer

    Yes

    1 if the node is in the payment flow; must be 1 in version 1.0

    Node

    rid

    string

    No

    The request ID this seller issued

    Node

    name

    string

    No

    Legal name; omit if in the system's sellers.json

    Node

    domain

    string

    No

    Business domain; omit if in sellers.json

    Node

    ext

    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

    1. Wrong location. The file is at /ads.txt on 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).
    2. Wrong Content-Type. Served as text/html (often an error page with a 200 status); the spec requires text/plain and treats anything else as an error to ignore (ads.txt 1.1).
    3. 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).
    4. 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).
    5. Account ID mismatch. Field 2 differs from the ID in bid requests and from seller_id in the partner's sellers.json, usually a typo or an old seat (ads.txt 1.1; sellers.json 1.0).
    6. Missing OWNERDOMAIN. The guidance says to publish it even when the site and owner domains are the same, and flags PUBLISHER entries whose sellers.domain does not match OWNERDOMAIN (Implementation Guidance).
    7. 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).
    8. 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).
    9. sellers.json structural faults. version not "1.0", a seller with is_confidential 0 but no name, a domain given as a URL rather than a root domain, or a seller_id reused for two legal entities (sellers.json 1.0).
    10. Broken chain. complete set to 1 while a node is missing; hp not 1; sid longer than 64 characters; asi that 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

    1. 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
    2. IAB Tech Lab, app-ads.txt specification (version 1.0). https://github.com/InteractiveAdvertisingBureau/Supply-Chain-Validation/blob/main/app-ads.txt.md
    3. IAB Tech Lab, sellers.json specification version 1.0 (July 2019). https://iabtechlab.com/wp-content/uploads/2019/07/Sellers.json_Final.pdf
    4. IAB Tech Lab, OpenRTB SupplyChain object specification (version 1.0). https://github.com/InteractiveAdvertisingBureau/openrtb/blob/master/supplychainobject.md
    5. IAB Tech Lab, Supply Chain Validation Implementation Guidance (OWNERDOMAIN and MANAGERDOMAIN). https://github.com/InteractiveAdvertisingBureau/Supply-Chain-Validation/blob/main/Implementation%20Guidance.md
    6. IAB Tech Lab, ads.txt standards page with version history (accessed 17 October 2026). https://iabtechlab.com/standards/ads-txt/
    7. IAB Tech Lab, sellers.json and SupplyChain object page (finalized 31 July 2019; accessed 17 October 2026). https://iabtechlab.com/sellers-json/
    8. 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
    9. Google AdSense Help, "ads.txt guide" (accessed 17 October 2026). https://support.google.com/adsense/answer/7532444
    10. Google AdSense Help, "sellers.json" (accessed 17 October 2026). https://support.google.com/adsense/answer/9889911
    11. Google Ad Manager Help, "About ads.txt and app-ads.txt" (accessed 17 October 2026). https://support.google.com/admanager/answer/7441288
    12. Prebid.org, Prebid Server feature index (schain compatibility; accessed 17 October 2026). https://docs.prebid.org/prebid-server/features/pbs-feature-idx.html
    13. 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