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

# Why a media partner isn't available to an advertiser

> How an advertiser's channels and markets decide which media partners are available to it, what qualificationGaps reports when one isn't, and how to fix it.

A media partner is available to an advertiser automatically when the two overlap
on **channels** and on **markets**. The advertiser's channels and countries come
from its setup. The media partner's come from what it declares on its Listing,
or from its platform when it is an official platform connection.

When a media partner is not available to an advertiser, Apostra says which of
the two is missing. You see it in the Connections page, and your agent reads it
from the `seller` read.

## What has to overlap

| Dimension | The advertiser says | The media partner says | Available when |
| - | - | - | - |
| Channels | The AdCP channels it expects to buy, or **All channels** | The channels it sells in. None declared means every channel | At least one channel is on both sides |
| Markets | The countries it operates in, or **All countries** | The countries or regions it sells in. None declared means every market | At least one country is covered by the media partner's countries, or by a region that contains it, such as `EU` |

An advertiser that chose **All channels** or **All countries** overlaps with
every media partner on that dimension. An advertiser that has not chosen a
dimension at all has no overlap to measure, so it is not matched automatically
until it answers.

## Read why it isn't available

Read the media partner for one advertiser:

```text theme={null}
get(kind: "seller", id: "<storefrontId>", advertiserId: "<advertiserId>")
```

Each entry in `controlPlane.activation.advertisers` carries `qualificationGaps`.
It has one entry for each dimension that stops this advertiser matching this
media partner, and it is empty when channels and markets match.

| Field | Meaning |
| - | - |
| `dimension` | `channels` or `markets` |
| `state` | `not_set`: the advertiser has not chosen this dimension. `no_overlap`: both sides chose it and share nothing |
| `advertiserValues` | The advertiser's AdCP channel ids or ISO country codes. Empty when `state` is `not_set` |
| `sellerValues` | The media partner's AdCP channel ids or ISO country and region codes for this dimension |

The values are codes, not display names. For example, an advertiser that buys
`ctv` in `FR` and `DE`, against a media partner that sells `display` in `ZA`,
reports both dimensions:

```json theme={null}
{
  "advertiserId": "adv-globex",
  "qualified": false,
  "qualificationGaps": [
    {
      "dimension": "channels",
      "state": "no_overlap",
      "advertiserValues": ["ctv"],
      "sellerValues": ["display"]
    },
    {
      "dimension": "markets",
      "state": "no_overlap",
      "advertiserValues": ["FR", "DE"],
      "sellerValues": ["ZA"]
    }
  ]
}
```

Gaps appear only when channels and markets are what decide availability. If
something else decides it, such as the advertiser turning the media partner off,
an account-level **Always exclude**, or the media partner not being listed or
not able to take buys yet, `qualificationGaps` is empty, because changing the
advertiser's channels or markets would not help. Those reasons have their own
fields: `qualified`, `preference`, and `selection.unavailableReason`. So an
empty `qualificationGaps` does not mean the advertiser is available.

## Fix it

Change the advertiser's channels or countries so they overlap with the media
partner:

* **In the Connections page.** Each gap has an **Edit advertiser channels** or
  **Edit advertiser markets** button. It opens the advertiser's setup.
* **Through your agent.** Call `save_advertiser` with the advertiser's `id` and
  the new `channels` or `brandCountries`. Send an empty list to choose **All
  channels** or **All countries**.

Only change the footprint to what the advertiser actually buys and where it
actually operates. If the media partner genuinely does not sell in the
advertiser's channels or markets, it is correct that it isn't available.

## When matching doesn't apply

An account-level **Always include** for a media partner overrides matching, so an
advertiser is available to it whatever its channels and markets, and
`qualificationGaps` is empty. **Always exclude** turns the media partner off for
every advertiser, whatever the overlap, and `qualificationGaps` is empty there
too.

## Related

* [Connect in five minutes](https://docs.apostra.com/v3/quickstart.md): connect a media partner and read its `seller` and `connection` objects.
* [Manage ads](https://docs.apostra.com/v3/manage-ads.md): set up advertisers and run campaigns across media partners.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.