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

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

<Note>
  V3 `save_creative.sourceAssets` is create-only. To replace media that was assembled from a browser-direct upload, create a new Creative with the intended format slots, confirm its readback, and then archive the old Creative.
</Note>

## Request

```bash theme={null}
curl -X PUT https://api.apostra.com/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`. This endpoint cannot supply replacement canonical image dimensions, so it rejects changing a non-image manifest to `image`; create a new image creative instead                                                                 |
| `target_format_ids` | array     | Additional formats this creative covers. **Replaces** the existing list                                                                                                                                                                                                                      |
| `url_asset`         | object    | Add a single URL asset: `{ url, url_type, vast_version? }`. Set `vast_version` (`2.0`, `3.0`, `4.0`, `4.1`, `4.2`, `4.3`) on a `vast` asset — a tag with no declared version cannot be delivered to a managed ad server. Adding a `vast` asset retires the manifest's previous unslotted tag |
| `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,
      "file_size_status": "verified",
      "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.

A URL-free canonical image response includes `"format_kind": "image"` and
`"params": { "width": 1200, "height": 628 }`, and omits a synthetic
`format_id`. Changing an image to a non-image kind clears these image-only
dimensions.

In this V2 REST response, `file_size_status` is a VIDEO-only evidence marker. `verified` means that the VIDEO `file_size` is authoritative; a VIDEO `file_size` of `0` without the marker is a compatibility sentinel for unavailable evidence. IMAGE and AUDIO file-size behavior and provenance are unchanged, so do not infer their evidence status from the marker's absence.

MCP and internal manifest results do not use this REST compatibility mapping, so unavailable evidence may appear as `file_size: null` with `file_size_status` absent.

## 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.
* `400 VALIDATION_ERROR` — `format_kind` changes a non-image manifest to `image`; create a new image creative so its canonical width and height are validated and stored together.
* `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>
