---
title: meta_create_creative
description: Build a Meta ad creative from media you uploaded to AdCrunch. Image and video both work.
---

Turns media you have uploaded to AdCrunch into a Meta ad creative — the thing [`meta_create_ad`](/mcp/tools/meta-create-ad) puts into an ad set. This is what closes the loop that [Bring your own creative](/mcp/assets) opens: upload, register, build.

## Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `advertiserId` | `acc_*` | yes | The Meta advertiser. |
| `assetId` | `ast_*` | yes | The AdCrunch asset. Must already be registered to **this** advertiser. |
| `pageId` | `string` | yes | The Facebook Page the ad speaks from — from `meta_list_pages`. |
| `link` | URL | yes | Where the ad sends people. |
| `message` | `string` | yes | Primary text — the body copy above the media. |
| `headline` | `string` | yes | The bold headline beside the button. |
| `description` | `string` | no | Supporting line. Not shown in every placement. |
| `callToAction` | enum | yes | The button, e.g. `SHOP_NOW`. `NO_BUTTON` for none. |
| `name` | `string` | yes | Internal name in Ads Manager. Users never see it. |

## You never choose a format

Pass the **AdCrunch asset ID** — the same `ast_*` you gave `asset_register` — not a Meta image hash or video ID. AdCrunch looks up what that asset registered as on this advertiser and builds the right spec: an image becomes a link ad, a video becomes a video ad. That is a fact about the asset, not a decision worth asking you to make, and there is deliberately no way to pass a raw Meta identifier instead.

:::info[A video uploaded a moment ago is fine]

Meta returns a video ID long before the video is usable, and a video ad needs a thumbnail Meta has not generated yet. This tool **waits** for processing to finish and then picks Meta's preferred frame — so you are not told to come back later. If it is still not ready after the wait, you get a clear "still processing, try again shortly", not a Graph error.

:::

## Output

`{ workflowId }`. Poll [`get_mutation_status`](/mcp/tools/get-mutation-status) for the new creative's `{ id }`, then pass that to [`meta_create_ad`](/mcp/tools/meta-create-ad).

## Errors

Each is decided before anything is created, and says what to do next:

- **Not registered to this advertiser** — the asset exists, but not in _that_ ad account's library. Call `asset_register` for it first.
- **Registration failed** — Meta has no copy of it. Check `asset_get` for the reason, then register again.
- **Registration still running** — wait and retry.
- **Video still processing / no thumbnail / Meta could not process it** — the upload is fine in the first case, just not ready yet.
- `401` or `403` — see [Errors](/mcp/errors), which every tool shares. This one needs `mutation:write`.

## Not supported

Carousel creatives (`child_attachments`), custom video thumbnails, Advantage+ creative, and building a creative from an image that already exists in Meta's library but was not uploaded through AdCrunch. For that last case, reuse the existing **creative** instead by passing its ID to `meta_create_ad`.
