---
title: meta_create_campaign
description: Create a Meta campaign from a conversation. It always arrives paused.
---

Ask for a new campaign on a Meta advertiser, with its objective and its budget. AdCrunch creates it paused, so it spends nothing until you activate it.

> Create a sales campaign called Spring Prospecting on Northwind, with a daily budget of 50 euros.

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

## Reference

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

Create a campaign on a live Meta ad account. It is always created PAUSED and cannot be created active — nothing spends until you separately activate it with `meta_set_status`. Optionally set a campaign budget to run Advantage campaign budget (CBO); omit it and each ad set carries its own budget instead. Runs asynchronously: returns a `workflowId` immediately — call `get_mutation_status` with it to get the new campaign's `id`. Budgets are in whole units of the ad account currency: 10.5 is 10.50, never 1050.

### Input

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `advertiserId` | string | yes | Advertiser account ID (`acc_<id>`). Must belong to the active organization — find one with `list_advertisers`. |
| `dailyBudget` | number, more than 0 | no | Campaign-level daily budget in whole units of the ad account currency (10.5 is 10.50). Setting either budget turns on Advantage campaign budget; provide this or `lifetimeBudget`, not both, or neither to budget at the ad-set level. |
| `lifetimeBudget` | number, more than 0 | no | Campaign-level lifetime budget in whole units of the ad account currency (10.5 is 10.50). Provide this or `dailyBudget`, not both. |
| `name` | string, at least 1 character | yes | Campaign name, as it will appear in Ads Manager. Use something the user would recognize. |
| `objective` | one of `OUTCOME_AWARENESS`, `OUTCOME_ENGAGEMENT`, `OUTCOME_LEADS`, `OUTCOME_SALES`, `OUTCOME_TRAFFIC`, `OUTCOME_APP_PROMOTION` | yes | What the campaign optimizes toward. This constrains which optimization goals its ad sets may use, so pick it from what the user actually wants (e.g. `OUTCOME_SALES` for purchases, `OUTCOME_TRAFFIC` for site visits). |
| `specialAdCategories` | array of (one of `NONE`, `EMPLOYMENT`, `HOUSING`, `CREDIT`, `ISSUES_ELECTIONS_POLITICS`, `ONLINE_GAMBLING_AND_GAMING`, `FINANCIAL_PRODUCTS_SERVICES`) | no | Regulated categories this campaign falls under, which Meta requires you to declare — employment, housing, credit, politics, gambling, or financial products. Declaring one restricts targeting. Omit (or pass `["NONE"]`) when none applies; do not guess, ask the user. Default: `[]`. |

### 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",
  "dailyBudget": 50,
  "name": "Spring Prospecting",
  "objective": "OUTCOME_SALES"
}
```

The result, in `structuredContent`:

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