meta_update_schedule
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, 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 lists each guardrail.
Reference
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. 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. Rejected if the ad set is not in this ad account.
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 describes the shape of a failed call.
not_foundprovider_not_connectedmissing_write_accessforbiddeninvalid_requestinternal_error
Scope
The token must hold mutation:write. Auth & scopes 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:
{
"advertiserId": "acc_1485443900032333",
"endTime": "2026-12-31T23:59:00+01:00",
"id": "120215678901234890"
}
The result, in structuredContent:
{
"workflowId": "3f9c2b7e-8a41-4d6e-9b05-c1e7a2d4f860"
}