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

# Syndication

> Share an audience, event source or catalog with chosen ADCP agents ahead of any buy, and check each share.

**Syndication** shares one of an advertiser's resources (an audience, an event source or a catalog)
with one or more ADCP agents, so they can act on it before a campaign buys from them. You turn it on
or off per resource and per agent. Each toggle returns a status record right away; the share itself
runs in the background, so check the status to see when it's done.

Without syndication, resources still reach sellers as campaigns buy from them: see
[How a source reaches each seller](/buy/event-sources#how-a-source-reaches-each-seller) and
[How audiences reach sellers](/buy/property-lists#how-audiences-reach-sellers).

All paths are under `https://api.semicola.com/api/v2/buyer`. There's no app screen or MCP tool for it
yet: use the REST API.

## Turn syndication on or off

```bash theme={null}
curl -X POST "https://api.semicola.com/api/v2/buyer/advertisers/12/syndicate" \
  -H "Authorization: Bearer $SEMICOLA_API_KEY" \
  -H "X-Account-Id: $ACCOUNT_ID" \
  -H "Content-Type: application/json" \
  -d '{
    "resourceType": "AUDIENCE",
    "resourceId": "loyalty-members",
    "adcpAgentIds": ["sample-publisher"],
    "enabled": true
  }'
```

| Field          | Notes                                                                                                                                  |
| -------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| `resourceType` | `AUDIENCE`, `EVENT_SOURCE` or `CATALOG`.                                                                                               |
| `resourceId`   | The audience's `audienceId`, the event source's key (`eventSourceId`) or the catalog id. It must belong to the advertiser in the path. |
| `adcpAgentIds` | 1 to 100 agents: a seller's slug (as catalog activation shows it) or its numeric id. Naming the same agent both ways makes one record. |
| `enabled`      | `true` shares the resource; `false` turns sharing off.                                                                                 |

The answer is `201` with one record per agent. Turning a resource on records `PENDING` and starts the
share; turning it off records `DISABLED` at once.

* An `adcpAgentIds` entry that isn't a listed seller fails with `400 VALIDATION_ERROR` and
  `details.unknownAdcpAgentIds`.
* A `resourceId` that isn't on the advertiser returns `404 NOT_FOUND` ("No audience … on this
  advertiser.").

## Status records

```json theme={null}
{
  "id": "…",
  "customerId": 7,
  "advertiserId": "12",
  "resourceType": "AUDIENCE",
  "resourceId": "loyalty-members",
  "audienceId": "…",
  "eventSourceId": null,
  "catalogId": null,
  "adcpAgentId": "sample-publisher",
  "adcpAgentAccountId": "glazeandco.example",
  "enabled": true,
  "status": "COMPLETED",
  "errorMessage": null,
  "responseData": { "status": "processing", "sellerAudienceId": "…", "uploadedCount": 1200, "matchedCount": null },
  "createdAt": "2026-11-01T10:00:00.000Z",
  "updatedAt": "2026-11-01T10:00:02.000Z",
  "completedAt": "2026-11-01T10:00:02.000Z"
}
```

| `status`    | Meaning                                                                  |
| ----------- | ------------------------------------------------------------------------ |
| `PENDING`   | Turned on; the share hasn't started.                                     |
| `SYNCING`   | The share is running.                                                    |
| `COMPLETED` | The agent took the resource. `responseData` holds its answer.            |
| `FAILED`    | The share didn't happen. `errorMessage` says why.                        |
| `DISABLED`  | You turned sharing off. Nothing more of this resource goes to the agent. |

`adcpAgentAccountId` is the seller account the resource was shared with (the mapped ads account for a
platform seller, otherwise the advertiser's brand domain). `completedAt` stays empty until the share
finishes. If you toggle a record while its share is running, the toggle wins and the running share's
result is dropped.

`responseData` is the agent's own answer:

| Resource     | `responseData`                                                                                            |
| ------------ | --------------------------------------------------------------------------------------------------------- |
| Audience     | `status` (for example `processing` or `ready`), `sellerAudienceId`, `uploadedCount`, `matchedCount`.      |
| Event source | `status` (`provisioned` or `needs_install`) and `sellerEventSourceId`, the agent's own id for the source. |
| Catalog      | `status`, `itemCount` (up to 1,000 items from the latest feed version) and `catalogVersionId`.            |

### Why a share fails

| `errorMessage`                                                                                           | What to do                                                                                      |
| -------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- |
| "Audiences is turned off for this seller in Connections, so no feed data is shared with it."             | Turn **Audiences** on in [Connections](/buy/connections#distribution) (audiences and catalogs). |
| "Events is turned off for this seller in Connections, so no event signals are shared with it."           | Turn **Events** on (event sources).                                                             |
| "This agent needs a connected account before anything can be shared with it. Connect it in Connections." | Connect the account first. Real platforms are never called without one.                         |
| "This agent is excluded in Connections, so nothing is shared with it."                                   | Change the seller's selection from `ALWAYS_EXCLUDE`.                                            |
| "This agent doesn't accept audiences (sync\_audiences)." (or event sources, or catalogs)                 | The agent doesn't offer that task.                                                              |
| "The agent did not answer." or the agent's own rejection                                                 | Toggle it on again to retry.                                                                    |

## Query status

`GET /advertisers/{advertiserId}/syndication-status` lists the advertiser's records, most recently
updated first, as `{ "items": [ … ], "total": n }`. Filters: `resourceType`, `resourceId`,
`adcpAgentId` (slug or id), `enabled` (`true` or `false`) and `status`; page with `limit` (1 to 100,
default 50) and `offset`.

Because the share is asynchronous, poll this until a record leaves `PENDING` and `SYNCING`. Each
outcome also raises a `syndication.completed` or `syndication.failed`
[notification](/guides/notifications).

## Turning sharing off

`enabled: false` stops later sharing of that resource with that agent: audience changes aren't sent,
the resource isn't sent when a campaign buys there, events from that source aren't forwarded, and
catalog activation skips the agent. It doesn't withdraw what the agent already received. Turning it
on again starts a new share.

## Related

* [Connections](/buy/connections#distribution)
* [Event sources](/buy/event-sources)
* [Audiences](/buy/property-lists#audiences)
* [Catalogs](/buy/catalogs)
