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

# List adapter advertisers

> Read a bounded provider-neutral advertiser roster

`GET /api/v2/storefront/esa/{esaId}/advertisers`

Reads a bounded advertiser page for a Google Ad Manager, FreeWheel, or AdsWizz
source. Google Ad Manager pages come from its synced cache. FreeWheel performs a
bounded authoritative sync before serving the first cached page.

Follow `nextCursor` until it is `null`. Only treat an omitted advertiser as
removed when `authoritative` is `true`, `truncated` is `false`, and `errors` is
empty. For filtered GAM search, use
[`GET /esa/{esaId}/gam/advertisers`](/v2/storefront/buyer-routing/tasks/list-gam-advertisers).

<Note>
  This is the roster the **ad server source** page's "Set default advertiser"
  picker reads, for every ad server that has a default advertiser. Because this
  endpoint takes no search term, the picker pages the cursor and filters the
  result in place — which is why typing narrows at the source only on Google Ad
  Manager, where the searchable cache above exists. See
  [Setting it without the API](/v2/storefront/buyer-routing/overview#setting-it-without-the-api).
</Note>

## Request

<CodeGroup>
  ```bash curl theme={null}
  curl "https://api.apostra.com/api/v2/storefront/esa/123/advertisers?limit=500" \
    -H "Authorization: Bearer $SCOPE3_API_KEY"
  ```
</CodeGroup>

## Parameters

| Field    | Type    | Required | Notes                                          |
| -------- | ------- | -------- | ---------------------------------------------- |
| `esaId`  | integer | Yes      | Path. Embedded sales-agent connection id       |
| `limit`  | integer | No       | Query. Page size from 1 to 500; defaults to 50 |
| `cursor` | string  | No       | Query. Opaque cursor returned by `nextCursor`  |

## Response

```json theme={null}
{
  "adapterType": "freewheel",
  "advertisers": [
    {
      "id": "fw-552",
      "name": "Nike CTV",
      "status": "active"
    }
  ],
  "nextCursor": null,
  "syncedAt": "2026-08-01T00:20:00Z",
  "authoritative": true,
  "truncated": false,
  "errors": []
}
```

`advertisers[].id` is the provider-native advertiser ID. `adapterType` namespaces
that ID. `syncedAt` is the cache/sync timestamp when the provider supplies one.

## Errors

* `400 VALIDATION_ERROR` — `esaId`, `limit`, or `cursor` is invalid; the source is deactivated; or the ad server has no advertiser roster.
* `404 NOT_FOUND` — no embedded sales agent with this `esaId` on your account.
* `503 SERVICE_UNAVAILABLE` — the ad server is temporarily unreachable.

See [Errors](/v2/reference/errors) for the full error contract.

## Related

<CardGroup cols={2}>
  <Card title="Buyer routing tasks" href="/v2/storefront/buyer-routing/tasks" icon="list-check">
    All buyer-routing operations
  </Card>

  <Card title="Buyer routing overview" href="/v2/storefront/buyer-routing/overview" icon="route">
    How buyers resolve to advertisers
  </Card>

  <Card title="List GAM advertisers" href="/v2/storefront/buyer-routing/tasks/list-gam-advertisers" icon="list">
    Filter the cached Google Ad Manager roster by name
  </Card>

  <Card title="Set default advertiser" href="/v2/storefront/buyer-routing/tasks/set-default-advertiser" icon="star">
    Pick the catch-all advertiser
  </Card>
</CardGroup>
