---
title: meta_copy_adset
description: Copy a Meta ad set into its own campaign or into another campaign of the ad account, with no ad. The copy always arrives paused.
---

Ask to copy an ad set that works, into its own campaign or into another campaign. Meta makes one new ad set with the settings of the source and adds " - Copy" to its name. [`meta_rename`](/mcp/tools/meta-rename) gives the copy a full name. The copy has no ad, and it arrives paused, so it delivers nothing until you activate it. You can give the copy a new start time and a new end time.

> Copy the FR BE 25-54 ad set into the Summer Scale campaign, from June 1 to June 30.

The agent calls `meta_copy_adset`, then [`get_mutation_status`](/mcp/tools/get-mutation-status), and you see the id of the copy and the budget that it carries. Under a campaign budget, the copy spends the budget of its campaign. [Change what runs on Meta](/mcp/tools/change-what-runs-on-meta) shows how to put the ads of the source into the copy.

## Reference

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

Copy a Meta ad set on a live ad account, into its own campaign or into another campaign of the same ad account. The copy has no ad: to copy an ad into it, call `meta_create_ad` with the new ad set and the `creativeId` of the source ad. A copy is shallow: Meta copies this one object with its settings, and none of the objects under it. The copy starts paused, and Meta adds " - Copy" to its name. To give the copy a full name, use `meta_rename`. The result gives the id of the copy and the budget that the copy carries, which is what an activate can spend. A copy starts its own learning phase. Meta refuses some copies: an Advantage+ shopping campaign and an Advantage+ app campaign cannot be copied, and a copy that targets the EU needs the default payor and the default beneficiary of the ad account. No argument makes the copy active. AdCrunch refuses a source that is not in this ad account with `not_found`. Runs asynchronously: returns a `workflowId` — call `get_mutation_status` with it to get the `id` of the copy and its `budget`: `{ "dailyBudget": 50 }` or `{ "lifetimeBudget": 500 }` in whole units of the ad account currency, or `"campaign"` when the copy spends the budget of its campaign. Under ad set budgets, the copy adds a second budget of the same size. That budget is what the copy can spend after you activate it with `meta_set_status`. To change it, call `meta_update_budget` on the paused copy.

### Input

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `advertiserId` | string | yes | Advertiser account ID (`acc_<id>`). Must belong to the active organization. |
| `campaignId` | string | no | The Meta ID of the campaign that receives the copy, digits only — including one you created or copied moments ago. Omit it to keep the copy in the campaign of the source. The copy takes the settings of that campaign: under a campaign budget, it spends the campaign budget, else it keeps the budget of the source. An ad set with no budget of its own needs a campaign with a campaign budget, else the copy ends with `invalid_request`. Meta decides whether the campaign accepts the copy. |
| `endTime` | string | no | When delivery of the copy stops, as an ISO 8601 timestamp. Omit it to keep the end time of the source. |
| `id` | string | yes | The Meta ID of the ad set to copy, digits only. It must be in this ad account. Find one with `meta_list_adsets`. |
| `startTime` | string | no | When delivery of the copy starts, as an ISO 8601 timestamp. Omit it to keep the start time of the source. A copy of an ad set that has ended starts when Meta makes it, with the duration of the source. |

### 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`
- `provider_not_connected`
- `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",
  "campaignId": "120215678901234567",
  "id": "120215678901234890"
}
```

The result, in `structuredContent`:

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