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

# Execute catalog activation

> Persist an activation plan's downstream jobs: campaign, creative, and syndication

`POST /api/v2/buyer/advertisers/{advertiserId}/catalogs/{catalogId}/activation-plan/execute`

Persists a catalog's [activation plan](/v2/buyer/advertisers/tasks/preview-catalog-activation) as durable downstream jobs: campaign-activation requests, creative-generation requests, and seller-syndication steps. Each job is written with status `pending`.

<Note>
  Execution currently records these jobs; a runner that carries them out (creating live campaigns, generating creative, and pushing to sellers) is not yet available, so executing does not by itself make anything go live. The creative-generation leg additionally depends on brand identity and per-format output before it produces deliverables.
</Note>

The plan is resolved in this order: the `planId` you pass, else the latest saved plan, else a plan built on the fly from the catalog's active transform. Pass `dryRun: true` to build and return the execution without persisting any jobs.

## Request

```bash curl theme={null}
curl -X POST https://api.interchange.io/api/v2/buyer/advertisers/12345/catalogs/summer-sale-2026/activation-plan/execute \
  -H "Authorization: Bearer $SCOPE3_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "dryRun": false }'
```

## Parameters

| Field          | Type          | Required | Notes                                                                                                                   |
| -------------- | ------------- | -------- | ----------------------------------------------------------------------------------------------------------------------- |
| `advertiserId` | string (path) | Yes      | Unique identifier for the advertiser                                                                                    |
| `catalogId`    | string (path) | Yes      | Buyer-assigned `catalog_id` or the platform `catalogId` from [list catalogs](/v2/buyer/advertisers/tasks/list-catalogs) |
| `planId`       | string        | No       | A saved activation plan id. If omitted, the latest saved plan is used, or one is created from the active transform      |
| `adcpAgentIds` | array         | No       | Seller agents to evaluate/execute. If omitted, the catalog's enabled syndication targets are used. Default `[]`         |
| `dryRun`       | boolean       | No       | Build and return the execution without creating durable jobs. Default `false`                                           |

## Response

The `plan` object is the same [activation plan](/v2/buyer/advertisers/tasks/preview-catalog-activation) shape returned by preview.

```json theme={null}
{
  "plan": {
    "planId": "10",
    "catalogId": "summer-sale-2026",
    "platformCatalogId": "14",
    "catalogVersionId": "42",
    "transformId": "10",
    "planHash": "9f8e7d…",
    "itemCount": 6,
    "campaignGroups": [
      {
        "key": "acme-austin",
        "name": "Acme - Austin",
        "fieldValues": { "city": "Austin", "citySlug": "austin" },
        "itemIds": ["p1", "p2"],
        "itemCount": 2,
        "budget": { "amount": 100, "currency": "USD" }
      }
    ],
    "creativeAssets": [],
    "syndicationTargets": [],
    "createdAt": "2026-06-07T12:00:00Z"
  },
  "execution": {
    "executionId": "11",
    "planId": "10",
    "catalogId": "summer-sale-2026",
    "platformCatalogId": "14",
    "catalogVersionId": "42",
    "transformId": "10",
    "status": "pending",
    "trigger": "manual",
    "steps": [
      {
        "stepId": "s1",
        "stepType": "campaign_activation_request",
        "status": "pending",
        "targetAdcpAgentId": null,
        "creativeAssetKey": null,
        "campaignGroupKey": "acme-austin",
        "error": null
      }
    ],
    "creativeGenerationRequests": [],
    "startedAt": "2026-06-07T12:00:00Z",
    "completedAt": null
  }
}
```

The response returns the resolved `plan` and the `execution` it produced. The overall `execution.status` is `pending`, `completed`, or `failed`, and its `trigger` is `manual`, `feed_refresh`, or `scheduled`. Each `steps[]` entry is one downstream job (`campaign_activation_request`, `sync_catalogs`, `sync_creatives`, `creative_generation_request`, `third_party_creative_agent`, or `unsupported`) with its own `status` of `pending`, `completed`, `failed`, or `skipped`. Creative work surfaces separately under `creativeGenerationRequests`. On a `dryRun`, the execution is built and returned but no jobs are persisted.

## Errors

* `400 VALIDATION_ERROR` — no plan is available and none can be built ("No activation plan is available. Save a catalog transform and sync or refresh the catalog first.").
* `404 NOT_FOUND` — `advertiserId` or `catalogId` does not exist or is not visible to the authenticated account.

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

## Related

<CardGroup cols={2}>
  <Card title="Preview activation" href="/v2/buyer/advertisers/tasks/preview-catalog-activation" icon="eye">
    Dry-run the fan-out first
  </Card>

  <Card title="Save catalog transform" href="/v2/buyer/advertisers/tasks/save-catalog-transform" icon="shuffle">
    Define the fan-out rules
  </Card>

  <Card title="Refresh catalog" href="/v2/buyer/advertisers/tasks/refresh-catalog" icon="arrow-rotate-right">
    Pull the latest feed and re-activate
  </Card>

  <Card title="List catalogs" href="/v2/buyer/advertisers/tasks/list-catalogs" icon="list-ul">
    See synced catalogs
  </Card>
</CardGroup>
