ads.txt is a public file at /ads.txt on a publisher’s root domain that lists which advertising systems may sell its inventory. The 1.1 spec reached final release in July 2022 and added the OWNERDOMAIN and MANAGERDOMAIN variables. A DSP reads the file, and the DIRECT or RESELLER label on each record, before it decides whether a seller in a bid request is authorized.

What is in a DIRECT or RESELLER record?

Each record has up to four comma-separated fields, according to the 1.1 spec: the ad system’s domain, the publisher’s account ID in that system, the relationship, and an optional certification authority ID. DIRECT means the publisher controls the account itself. RESELLER means the publisher authorized another entity to control the account and resell the ad space through that system.

Here is a small sample file. The names publisher.example, ssp.example and reseller.example are placeholders, not real companies.

OWNERDOMAIN=publisher.example
ssp.example, pub-123, DIRECT
reseller.example, acct-9, RESELLER

The certification field is optional, and the spec says its role is superseded by the identifiers object in sellers.json. It also says redirects are followed only within the same root domain, with one allowed hop outside it.

The DSP matches field two against the seller ID in the bid request. The same spec recommends that SSPs place the seller’s account ID in publisher.id and set site.domain to the domain that hosts the file. It also says a 404 response means no declarations exist, so no system counts as unauthorized, and that cached copies expire after seven days when no cache headers are present.

Which variables does a DSP read besides the records?

Section 3.5.1 of the spec defines the variables:

  • OWNERDOMAIN: the business domain of the entity that owns the site or app. It should match sellers.domain in the publisher’s sellers.json entries, and the first node of a complete SupplyChain object should match it too.
  • MANAGERDOMAIN: the primary or exclusive monetization partner, with an optional country code. It is meant for a seller that is not the publisher but is the main programmatic seller.
  • INVENTORYPARTNERDOMAIN: a pointer to another entity authorized to monetize ads within an app’s content. The change log says it arrived in version 1.0.3 (final release March 2021). A crawler follows one hop only.

The Tech Lab’s implementation guidance turns these into a lookup. If sellers.domain equals OWNERDOMAIN, the seller is the owner. If it equals MANAGERDOMAIN, the seller is the manager. If it equals neither, the seller is a reseller.

The same guidance recommends that DSPs act on this data for risk mitigation and supply path work. It leaves the reading of MANAGERDOMAIN to each DSP, and asks a DSP that departs from the guidance to publish its rules before enforcing them. If one country has more than one MANAGERDOMAIN, the guidance says to treat it as if none were declared.

Why does app-ads.txt matter for apps and CTV?

An app is not a website, so its file needs a home. The app-ads.txt spec links the app store listing to a developer website, where the developer posts /app-ads.txt. A verifier reads the storeurl from the bid request, crawls the listing, finds the developer URL and derives the file path. The spec’s store URL examples include a connected TV channel store, and the Tech Lab ads.txt page describes app-ads.txt as covering mobile app stores, connected TV app stores and similar channels.

The file has its own name so that app and web settings do not conflict. The app-ads.txt spec also says the subdomain directive is ignored there.

CTV adds a rights question, because apps often license content from other companies. The ads.txt spec says INVENTORYPARTNERDOMAIN exists for those cases, and names mobile and CTV streaming apps as common examples. A Tech Lab post dated September 17, 2026 says the 2021 addition was meant for CTV use cases and that more work remains on CTV media rights.

How does Vectravia handle this?

Path Check shows the DIRECT or RESELLER relationship behind every placement. It reads ads.txt and app-ads.txt, and it flags mismatched OWNERDOMAIN values. It also reads sellers.json and compares the files with the SupplyChain object in each bid request.