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

# Update creative manifest

> Edit a creative manifest's fields and manage its assets

`PUT /api/v2/buyer/campaigns/{campaignId}/creatives/{creativeId}`

Updates manifest fields (name, brief, format) and manages assets — add new uploads, delete existing assets, reclassify types, or set the primary asset. Sent as `multipart/form-data`: a `metadata` JSON part plus `files` parts for any `new_assets`. Updates re-sync to media buys the creative is already on.

## Request

```bash theme={null}
curl -X PUT https://api.interchange.io/api/v2/buyer/campaigns/cmp_987654321/creatives/cm_abcdef \
  -H "Authorization: Bearer $SCOPE3_API_KEY" \
  -H "Content-Type: multipart/form-data" \
  -F 'metadata={
    "name": "Q2 hero video v2",
    "message": "Tighter 30s cut — stronger CTA",
    "delete_asset_ids": ["asset_001"],
    "new_assets": [
      { "filename": "hero-30s-v2.mp4", "asset_type": "VIDEO", "label": "main_video" }
    ]
  };type=application/json' \
  -F "files=@hero-30s-v2.mp4"
```

## Parameters

The `metadata` JSON part carries (all optional — omit to preserve):

| Field               | Type      | Notes                                                                                                         |
| ------------------- | --------- | ------------------------------------------------------------------------------------------------------------- |
| `name`              | string    | Updated manifest name (max 255)                                                                               |
| `message`           | string    | Updated creative brief (max 5000)                                                                             |
| `template_id`       | string    | Updated ADCP format ID or vendor tag                                                                          |
| `format_id`         | object    | `{ agent_url, id, width?, height?, duration_ms? }`                                                            |
| `format_kind`       | string    | Updated AdCP 3.1 canonical kind. Alternative to `format_id`                                                   |
| `target_format_ids` | array     | Additional formats this creative covers. **Replaces** the existing list                                       |
| `url_asset`         | object    | Add a single URL asset: `{ url, url_type }`                                                                   |
| `delete_asset_ids`  | string\[] | Asset IDs to remove (max 100)                                                                                 |
| `new_assets`        | array     | Metadata for newly uploaded files: `{ filename, asset_type?, label?, slot_asset_id? }`                        |
| `reclassify_assets` | array     | Change asset types (max 100): `{ asset_id, asset_type }`                                                      |
| `primary_asset_id`  | string    | Promote this asset to `CREATIVE_SOURCE`; demotes the current primary. IMAGE, VIDEO, AUDIO, HTML, or VAST only |
| `frequencyCaps`     | array     | When provided, **replaces** the existing caps list                                                            |

Form parts: `files=@<path>` for each entry in `new_assets`.

## Response

```json theme={null}
{
  "creative_id": "cm_abcdef",
  "campaign_id": "cmp_987654321",
  "name": "Q2 hero video v2",
  "message": "Tighter 30s cut — stronger CTA",
  "template_id": "video_standard",
  "brand_domain": "acme.com",
  "format_id": { "id": "video_standard", "agent_url": "https://agent.example.com" },
  "preview_url": "https://storage.googleapis.com/creatives/cm_abcdef/preview.html",
  "assets": [
    {
      "asset_id": "asset_002",
      "name": "main_video",
      "original_filename": "hero-30s-v2.mp4",
      "asset_type": "VIDEO",
      "content_type": "video/mp4",
      "file_size": 7903112,
      "public_url": "https://cdn.example.com/creatives/cm_abcdef/hero-30s-v2.mp4",
      "asset_source": "USER_UPLOADED",
      "created_at": "2026-06-07T17:10:00Z"
    }
  ],
  "sync_status": { "synced": true, "agent_count": 3, "last_synced_at": "2026-06-07T17:11:00Z" },
  "created_at": "2026-06-07T15:04:00Z",
  "updated_at": "2026-06-07T17:10:00Z"
}
```

Returns the full updated manifest. `target_format_ids` and `frequencyCaps` are list-replace, not merge — send the complete intended list.

## Errors

* `400 VALIDATION_ERROR` — a `new_assets` entry with no matching `files` part, a `delete_asset_ids` value not on the manifest, or `primary_asset_id` pointing at an ineligible asset type.
* `404 NOT_FOUND` — `campaignId` or `creativeId` 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="Creative overview" href="/v2/object-guides/creative" icon="image">
    Asset types and propagation
  </Card>

  <Card title="Get creative manifest" href="/v2/buyer/creatives/tasks/get-creative-manifest" icon="magnifying-glass">
    Read the manifest before editing
  </Card>

  <Card title="Delete creative manifest" href="/v2/buyer/creatives/tasks/delete-creative-manifest" icon="trash">
    Remove the manifest
  </Card>
</CardGroup>
