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

Ask for a creative from an asset that you uploaded to AdCrunch, with its text, its link and its button. The agent builds the creative on Meta, and [`meta_create_ad`](/mcp/tools/meta-create-ad) then puts it in an ad set.

> Make a creative from the spring trail image, from the Northwind Outdoor Page, with a Shop now button to example.com/spring.

The agent calls `meta_create_creative`, then [`get_mutation_status`](/mcp/tools/get-mutation-status), and you see the id of the new creative. [Change what runs on Meta](/mcp/tools/change-what-runs-on-meta) walks the whole campaign.

## Reference

**Available on:** [![Meta](/providers/meta.svg)](https://docs.adcrunch.dev/connect/providers)

Build a Meta ad creative from media you have uploaded to AdCrunch and registered to this advertiser. Pass the AdCrunch asset ID (`ast_<id>`) that `asset_register` used — not a Meta image hash or video ID. Image and video both work, and you do not choose between them: the asset's kind decides the format. A video uploaded moments ago is fine; the creative waits for Meta to finish processing it. Runs asynchronously: returns a `workflowId` — call `get_mutation_status` with it to get the new creative's `id`, then pass that to `meta_create_ad`.

### Input

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `advertiserId` | string | yes | Advertiser account ID (`acc_<id>`). Must belong to the active organization. |
| `assetId` | string | yes | The AdCrunch asset (`ast_<id>`) to build from. It must already be registered to this advertiser — call `asset_register` first if it is not. |
| `callToAction` | one of `LEARN_MORE`, `SHOP_NOW`, `SIGN_UP`, `BOOK_TRAVEL`, `DOWNLOAD`, `GET_OFFER`, `GET_QUOTE`, `CONTACT_US`, `SUBSCRIBE`, `APPLY_NOW`, `NO_BUTTON` | yes | The button on the ad, e.g. `SHOP_NOW`. Use `NO_BUTTON` for none. |
| `description` | string | no | Supporting line under the headline. Not always shown, depending on placement. |
| `headline` | string, at least 1 character | yes | The bold headline, usually beside the button. |
| `link` | string (uri) | yes | The destination URL the ad sends people to. |
| `message` | string, at least 1 character | yes | The primary text — the body copy above the media. |
| `name` | string, at least 1 character | yes | Creative name, as it appears in Ads Manager. Internal only; users never see it. |
| `pageId` | string | yes | The Facebook Page the ad speaks from. Find one with `meta_list_pages`. |

### Output

A successful call returns this object in `structuredContent`.

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `workflowId` | string | yes | The id of the change. The change has not reached Meta yet. Give this id to `get_mutation_status` to find out how the change ended. |

### Failure codes

A failed call has `isError` set, and `structuredContent.error` holds one of these codes. [Errors](/mcp/errors) describes the shape of a failed call.

- `not_found`
- `missing_write_access`
- `forbidden`
- `invalid_request`
- `internal_error`

### Scope

The token must hold `mutation:write`. [Auth & scopes](/mcp/auth) lists each scope.

### Annotations

A client reads these hints. A hint that the tool does not declare has the default value of the MCP specification.

- **Writes.** The tool can change data.
- **Destructive.** The tool can make a change that you cannot undo. A client can ask you to confirm before it calls the tool.
- **Not idempotent.** A second call with the same arguments can change more.
- **Open world.** The tool reaches a system outside AdCrunch, such as an ad platform.

### Example

The arguments:

```json
{
  "advertiserId": "acc_1485443900032333",
  "assetId": "ast_k7m2x9q4w1e8r5t3y6u0i2o4",
  "callToAction": "SHOP_NOW",
  "headline": "Trail shoes for spring",
  "link": "https://www.example.com/spring",
  "message": "Light, grippy, and ready for wet trails.",
  "name": "Spring trail shoes, image 1",
  "pageId": "104857392018274"
}
```

The result, in `structuredContent`:

```json
{
  "workflowId": "3f9c2b7e-8a41-4d6e-9b05-c1e7a2d4f860"
}
```
