---
title: meta_update_schedule
description: Change the start time or the end time of a Meta ad set, or remove its end, with a check of the end time.
---

Ask to move the start time or the end time of an ad set on Meta, or to let it run with no end. AdCrunch refuses an end time that is not in the future, and no end on an ad set with a lifetime budget, before the change reaches Meta. It also checks that the ad set is in the ad account of the advertiser, and it keeps the start time and the end time that the change replaces.

> Make the FR BE 25-54 ad set run until the end of December.

The agent calls `meta_update_schedule`, then [`get_mutation_status`](/mcp/tools/get-mutation-status), and you see whether Meta applied the new end time. A later end time adds days of spend. An active ad set that has ended delivers again when it gets a new end time, and the result says so. [Change what runs on Meta](/mcp/tools/change-what-runs-on-meta) lists each guardrail.

## Reference

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

Change when a Meta ad set delivers on a live ad account: its start time, its end time, or both. An ad set only: a campaign has no schedule that this tool can change. Before you change a schedule, read the times that the ad set has now with `meta_list_adsets`: `startTime` and `endTime`, as Meta writes them. Times are ISO 8601 timestamps, for example 2026-12-31T23:59:00+01:00. The end time must be in the future. Send `endTime: null` for no end. An ad set with a lifetime budget must keep an end time. Meta gets `startTime` as you send it, also on an ad set that has started. A later end time adds days of spend, so the total spend of a daily budget increases. With no end, the ad set spends until you pause it, up to 7 times its daily budget in one week. With a lifetime budget, the total spend stays within the lifetime budget. An ACTIVE ad set that has ended delivers again when it gets a new end time or no end, with no status change. To change a daily budget to a lifetime budget, first set an end time with meta_update_schedule, then set the lifetime budget. To change a lifetime budget to a daily budget, first set the daily budget, then remove the end time with meta_update_schedule. Meta refuses a lifetime budget with no end time. Runs asynchronously: returns a `workflowId` immediately — call `get_mutation_status` with it to see whether the change succeeded, and to get the start time and the end time that it replaced as `priorValue`. When an ACTIVE ad set that had ended delivers again, the result carries `deliveryStartsAgain: true`. To undo a schedule change, send the times that it replaced (priorValue). An end time that is not in the future cannot go back: Meta refuses it, and AdCrunch refuses it too. To stop an ad set after you extend its end, set its status to PAUSED with meta_set_status. AdCrunch refuses an ad set that is not in this ad account with `not_found`.

### Input

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `advertiserId` | string | yes | Advertiser account ID (`acc_<id>`). Must belong to the active organization. |
| `endTime` | string or null | no | When delivery stops, as an ISO 8601 timestamp in the future. Send `null` for no end. Omit it to keep the end time. |
| `id` | string | yes | The Meta object ID of the ad set, digits only. |
| `startTime` | string | no | When delivery starts, as an ISO 8601 timestamp. Omit it to keep the start time. |

### 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",
  "endTime": "2026-12-31T23:59:00+01:00",
  "id": "120215678901234890"
}
```

The result, in `structuredContent`:

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