---
title: meta_update_budget
description: Change a Meta campaign or ad set's daily or lifetime budget, with a safety cap and a level guardrail.
---

Changes the **daily** or **lifetime** budget of a live Meta campaign or ad set. Requires the `mutation:write` scope, and the ad account must be connected to your organization with write access.

Budgets are integers in the account's **minor currency unit** — cents, not euros. `1000` is €10.00.

## Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `advertiserId` | `acc_${string}` | yes | The ad account. Must belong to your organization. |
| `id` | `string` | yes | The Meta object ID of the campaign or ad set. |
| `level` | `'campaign' \| 'adset'` | yes | Which level `id` refers to. Not available on ads. |
| `dailyBudget` | `number` | no | New daily budget, minor units. Provide this **or** `lifetimeBudget`. |
| `lifetimeBudget` | `number` | no | New lifetime budget, minor units. Provide this **or** `dailyBudget`. |

Exactly one of `dailyBudget` / `lifetimeBudget` must be given. Passing both, or neither, is rejected.

## Guardrails

Two checks apply before anything is sent to Meta. Both live in the shared mutation layer, so every caller is held to them:

- **Safety cap.** A budget above `100_000_000` minor units (e.g. €1,000,000) is refused with the amount named.
- **Level check.** A live read decides where the budget actually lives — on the campaign under Advantage campaign budget, on the ad set otherwise — and a change aimed at the wrong level is refused by name rather than silently ignored.

:::warning[The old value is not recorded]

The record of the change holds what it was set **to**, not what it was set **from**. If you may want to put a budget back, read the current value first.

:::

## Output

Returns **immediately**, before the change has been applied:

```json
{ "workflowId": "…" }
```

Poll [`get_mutation_status`](/mcp/tools/get-mutation-status) with that `workflowId` to find out whether it succeeded.

## Example

> _"Raise the Prospecting campaign's daily budget to €150."_

```ts
const { workflowId } = meta_update_budget({
  advertiserId: 'acc_123456789',
  id: '23851234567890123',
  level: 'campaign',
  dailyBudget: 15_000, // €150.00
});

get_mutation_status({ workflowId });
// → { status: 'complete', result: { ok: true, … } }
```

## Errors

- **Provide exactly one of `dailyBudget` or `lifetimeBudget`** — both or neither were given. Rejected before any workflow starts.
- **`budget_cap_exceeded`** — above the safety cap. The message names the amount and the cap.
- **`wrong_level`** — the campaign uses Advantage campaign budget and you aimed at the ad set, or the reverse. The message says which level to use.
- **Advertiser not found for this organization** — the account isn't yours, or doesn't exist.
- **Connected without write access** — the Meta connection doesn't carry `ads_management`.
- **`provider_error`** — Meta rejected the change, returned with its message.
- `401` or `403` — see [Errors](/mcp/errors), which every tool shares. This one needs `mutation:write`.
