Overview
adagents.json is the publisher-owned file that tells Interchange two things:
- which properties exist, through
properties[] - which agents are authorized to sell them, through
authorized_agents[]
ads.txt
MANAGERDOMAIN=<manager-domain> or an authoritative_location pointer.
Schema pointer
Include the schema URL in the file so validators and crawlers can lint the same shape:Minimal network file
This example declares two properties and authorizes the Interchange storefront agent for properties taggedfood.
properties[]
Each properties[] entry should describe one site, app, or CTV app.
Tags can help authorize a set of properties without listing every property id
in the agent entry. Keep tags operationally stable: changing a tag can change
which properties the agent is authorized to sell.
authorized_agents[]
Each authorized_agents[] entry names one agent and the scope it may sell.
Interchange does not treat the agent’s mere presence in the array as
authorization. The entry should say which properties the agent is authorized
for.
The entry’s url is the agent identity and executable discovery base. The URL
where this JSON document is hosted is separate: never use the publisher’s
well-known URL or the resolved authoritative_location as a connected
inventory source’s endpointUrl.
Common selector styles:
For network-scale authorization today, use
authorization_type: "publisher_properties" with publisher_properties[] when
you need a cross-publisher selector. Product responses still disclose coverage
through publisher_properties[], usually one selector per publisher domain.
Review and generation checklist
Before publishing a new or corrected file, check the complete document rather than only the field that prompted the edit:- Emit plain JSON. JSON string values must use literal quote characters, not
HTML entities such as
"; URL values must not contain chat-link markup such as<https://example.com|example.com>. - Keep every
property_idlowercase, using only letters, numbers, and underscores. Every value selected byproperty_ids[]must exactly match a top-levelproperties[].property_idin the same resolved document. If an existing draft uses uppercase letters, normalize the declaration and every reference to it consistently before publishing. First check whether lowercasing would collide with another property ID in the document. If it would, do not guess which property should keep the normalized ID; choose new distinct lowercase IDs with the operator and update their references. - Pair
authorization_typewith its matching non-empty selector. For example,authorization_type: "property_ids"requiresproperty_ids[]. - Choose
delegation_typefrom the commercial relationship, not from who hosts the file or operates the software:directmeans the publisher treats the agent as a direct buying path,delegatedmeans the agent sells on the publisher’s behalf, andad_networkmeans network or package distribution. - Set
last_updatedto the ISO 8601 time of the actual change. Do not carry an older timestamp into a corrected file. - When producing several files, make each one a complete standalone JSON
document and validate each document separately against the schema URL in its
$schemafield.
Which agent URL to use
Theurl field names the agent being authorized. Which URL to use depends on how
the seller connects to Interchange:
For storefronts run by experts, the canonical URL is always
https://interchange.io. Per-customer subdomain URLs (for example
https://yourname.example.interchange.io) are not the correct entry; use the
canonical URL. The buyer-facing execution endpoint is
https://<seller-cname>/adcp/mcp when a verified publication CNAME exists, or
https://api.interchange.io/seller/{platformId}/mcp on the shared host. It is
how buyers call a specific Seller; it is not that Seller’s publisher-authorization
identity and must not be placed in authorized_agents[].url. See
Authentication for the full base URL reference.
For an external-only storefront with more than one connected agent, a publisher
is authorized when its file grants property authority to at least one of those
agents. Different publishers can authorize different connected agents. If the
storefront also includes inventory run by Interchange, the storefront-level
authorization status uses https://interchange.io so an unrelated external
agent cannot authorize that inventory.
Authorization is advisory, not a blocker
Interchange surfaces a missing or mismatchedadagents.json authorization as a
warning during setup and product authoring. It does not block source
connection, product authoring, or activation. However, when coverage disclosure
is enabled, authorized properties from this file are the source for buyer-visible
coverage; missing authorization reduces what buyers see, even if the storefront
itself stays active. See
Identity documents for the full explanation of
what blocks setup versus what is advisory.
Manager-domain delegation
If every managed publisher hosted its own full file, a network would have to coordinate thousands of files. Instead, a publisher can delegate to the manager domain. For anads.txt delegation, the publisher adds:
authoritative_location stubs
A publisher can also host a small pointer file that delegates one hop to a
centrally hosted document:
How Interchange ingests it
Interchange resolvesadagents.json through the same identity-document path
used during storefront setup:
- Read the publisher’s own well-known file when present.
- Follow a valid one-hop
authoritative_locationpointer when the publisher file is a stub. - Fall back to the publisher’s
ads.txtMANAGERDOMAINwhen no direct file is present. - Hand the resolved file to the managed sales agent, which classifies the properties and authorized agents.
- Use the resulting authorized properties as the source for buyer-visible coverage when coverage disclosure is enabled for the managed storefront.
authorized_agents[] for a publisher. Granting authorization must originate in
the publisher-controlled document or delegation.
SDK 14 response compatibility
The SDK 14 storefront migration does not change theadagents.json document
shape or its authorization rules. It does change the AdCP responses buyers see
after an authorized inventory source is connected:
- Storefront metadata is canonical under
ext.scope3.storefront. Capability responses temporarily also emit the deprecatedextensions.scope3.storefrontalias for AdCP 3.0 and 3.1 clients. - AdCP 3.1 products publish canonical
format_options[]; buyers should retain the selectedformat_option_idand its format reference when creating media buys or syncing creatives. When a buyer negotiates AdCP 3.0, products instead carry the required projectedformat_ids[]legacy references. sync_creativesrequiresformat_id. Media-buy task and webhook routing uses the hyphenatedmedia-buyprotocol value.
Common pitfalls
- Test rows become coverage. A test property in
properties[]can be disclosed to buyers because it looks like real authorization. - Bare agent entries fail closed. List the authorization scope, not only the agent URL.
- Per-customer subdomain URLs are not the canonical agent URL. For
Interchange-connected sellers, authorize
https://interchange.io, not a per-customer subdomain. Using a subdomain creates a valid-looking entry that points at the wrong agent. - Publisher domains must be real inventory. Manager and operator domains are not substitutes for the site domains being sold.
- Keep
property_idstable. Buyers and agents can use property ids as durable selectors. - Keep tags clean. If an authorization uses
property_tags, tag hygiene controls the agent’s authorized footprint. - Validate
wwwand apex domains. Put the domain buyers should recognize inidentifiers[]; avoid mixed or stale variants.
Related
Publisher properties and coverage
How authorized properties appear to buyers in
get_products.Identity documents
The full model for adagents.json, brand.json, agent cards, and AAO.
Discover agents
Resolve a domain’s registered and authorized agents.
Custom targeting and properties
How GAM key-values relate to site groups and signals.