> ## Documentation Index
> Fetch the complete documentation index at: https://docs.interchange.io/llms.txt
> Use this file to discover all available pages before exploring further.

# adagents.json for network sellers

> How to publish publisher properties, manager-domain delegation, and authorized agents for a storefront

## 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[]`

Publish it at:

```text theme={null}
https://<publisher-domain>/.well-known/adagents.json
```

For a network, the file often lives on a manager domain and covers many managed
publisher domains. The publishers delegate to that manager through `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:

```json theme={null}
{
  "$schema": "https://adcontextprotocol.org/schemas/v1/adagents.json"
}
```

## Minimal network file

This example declares two properties and authorizes the Interchange storefront
agent for properties tagged `food`.

```json theme={null}
{
  "$schema": "https://adcontextprotocol.org/schemas/v1/adagents.json",
  "properties": [
    {
      "property_id": "wholesome_yum",
      "property_type": "website",
      "name": "Wholesome Yum",
      "identifiers": [{ "type": "domain", "value": "wholesomeyum.com" }],
      "tags": ["food"]
    },
    {
      "property_id": "tastes_better_from_scratch",
      "property_type": "website",
      "name": "Tastes Better From Scratch",
      "identifiers": [
        { "type": "domain", "value": "tastesbetterfromscratch.com" }
      ],
      "tags": ["food"]
    }
  ],
  "authorized_agents": [
    {
      "url": "https://interchange.io",
      "authorized_for": "Example Food Network",
      "authorization_type": "property_tags",
      "property_tags": ["food"],
      "delegation_type": "ad_network"
    }
  ]
}
```

## `properties[]`

Each `properties[]` entry should describe one site, app, or CTV app.

| Field           | What to provide                                                                              |
| --------------- | -------------------------------------------------------------------------------------------- |
| `property_id`   | A stable, lowercase identifier for the property. Do not reuse it for a different site later. |
| `property_type` | The property type, such as `website` for a web property.                                     |
| `name`          | The human-readable property name.                                                            |
| `identifiers[]` | Typed identifiers. For web, include `{ "type": "domain", "value": "<domain>" }`.             |
| `tags[]`        | Optional stable group labels used by authorization or internal organization.                 |

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.

Common selector styles:

| Selector                                                                   | Use when                                                                                                       |
| -------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
| `authorization_type: "property_ids"` with `property_ids[]`                 | You want to authorize a fixed set of property ids.                                                             |
| `authorization_type: "property_tags"` with `property_tags[]`               | You want to authorize every property carrying one or more tags.                                                |
| `authorization_type: "publisher_properties"` with `publisher_properties[]` | You need a cross-publisher selector, such as `{ "publisher_domain": "example.com", "selection_type": "all" }`. |

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.

### Which agent URL to use

The `url` field names the agent being authorized. Which URL to use depends on how
the seller connects to Interchange:

| Seller setup                                                                        | Agent URL to authorize                                    |
| ----------------------------------------------------------------------------------- | --------------------------------------------------------- |
| Ad server connected directly to Interchange (Interchange's hosted storefront agent) | `https://interchange.io`                                  |
| External AdCP sales agent connected as an inventory source                          | That agent's own published URL                            |
| Upstream storefront linked as an inventory source                                   | The upstream storefront's own authorization model applies |

For sellers using Interchange as their hosted storefront agent, 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. See [Authentication](/v2/authentication) for the full base URL
reference.

### Authorization is advisory, not a blocker

Interchange surfaces a missing or mismatched `adagents.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](/v2/concepts/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 an `ads.txt` delegation, the publisher adds:

```text theme={null}
MANAGERDOMAIN=cafemedia.com
```

Interchange resolves the publisher domain, sees the manager-domain delegation,
and reads:

```text theme={null}
https://cafemedia.com/.well-known/adagents.json
```

The manager file then supplies the properties and authorized agents for the
managed footprint.

## `authoritative_location` stubs

A publisher can also host a small pointer file that delegates one hop to a
centrally hosted document:

```json theme={null}
{
  "authoritative_location": "https://cafemedia.com/.well-known/adagents.json"
}
```

Use this when a publisher can host a file at its own well-known URL but wants
the full document maintained centrally. The publisher-origin URL must remain
reachable so crawlers can verify that the pointer is the publisher's act.

## How Interchange ingests it

Interchange resolves `adagents.json` through the same identity-document path
used during storefront setup:

1. Read the publisher's own well-known file when present.
2. Follow a valid one-hop `authoritative_location` pointer when the publisher
   file is a stub.
3. Fall back to the publisher's `ads.txt` `MANAGERDOMAIN` when no direct file is
   present.
4. Hand the resolved file to the managed sales agent, which classifies the
   properties and authorized agents.
5. Use the resulting authorized properties as the source for buyer-visible
   coverage when coverage disclosure is enabled for the managed storefront.

Interchange references publisher authorization; it does not mint or edit
`authorized_agents[]` for a publisher. Granting authorization must originate in
the publisher-controlled document or delegation.

## 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_id` stable.** 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 `www` and apex domains.** Put the domain buyers should recognize in
  `identifiers[]`; avoid mixed or stale variants.

## Related

<CardGroup cols={2}>
  <Card title="Publisher properties and coverage" href="/v2/storefront/inventory-sources/publisher-properties-coverage" icon="globe">
    How authorized properties appear to buyers in `get_products`.
  </Card>

  <Card title="Identity documents" href="/v2/concepts/identity-documents" icon="id-card">
    The full model for adagents.json, brand.json, agent cards, and AAO.
  </Card>

  <Card title="Discover agents" href="/v2/storefront/tasks/discover-agents" icon="magnifying-glass">
    Resolve a domain's registered and authorized agents.
  </Card>

  <Card title="Custom targeting and properties" href="/v2/storefront/esa/custom-targeting-properties" icon="sliders">
    How GAM key-values relate to site groups and signals.
  </Card>
</CardGroup>
