---
title: meta_update_bidding
description: Change the bid strategy of a Meta campaign or ad set, and the amount that the strategy takes, at the level where the budget sits.
---

Ask to change how Meta bids for a campaign or an ad set: the bid strategy, and the bid cap, the cost cap or the ROAS goal that the strategy takes. AdCrunch reads the object on Meta before the change reaches Meta. It checks that the object is in the ad account of the advertiser and that the change names the level that holds the strategy, and it keeps the bid that the change replaces.

> Move the FR BE 25-54 ad set from Highest volume to a cost per result goal of 12 euros.

The agent calls `meta_update_bidding`, then [`get_mutation_status`](/mcp/tools/get-mutation-status), and you see whether Meta applied the new bid. [Change what runs on Meta](/mcp/tools/change-what-runs-on-meta) tells where the strategy sits, and which changes Meta refuses.

## Reference

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

Change how a Meta campaign or ad set bids on a live ad account: its bid strategy, and the amount that the strategy takes. Before you change a bid, read the bid that the object has now: `meta_list_adsets` gives `bidStrategy`, `bidAmount` (in whole units) and `roasFloor` of each ad set, and `meta_list_campaigns` gives `bidStrategy` and `adsetBudgetSharing` of each campaign. Send `bidStrategy` with the one amount it takes: `bidCap`, `costCap` or `roasFloor`, and no amount for LOWEST_COST_WITHOUT_CAP. To change only an amount, send the same strategy with the new amount. The strategy sits where the budget sits. Under a campaign budget, the campaign holds the strategy: with `level` campaign, a bid cap or a cost cap applies one amount to every ad set of the campaign, and with `level` adset, send the strategy of the campaign with the amount for this ad set. Without a campaign budget, each ad set holds its own strategy. A change at the other level is rejected with `wrong_level`. A bid change can make an ad set spend its full budget, never more: the budget is the only spend ceiling. A change of strategy starts the learning phase again. Meta advises at most 2 or 3 bid or budget changes a day, and 15 minutes between a budget change and a bid change. Meta refuses a change of strategy on a campaign with ad set budget sharing, on a campaign budget with more than 70 ad sets, and on a campaign budget on ROAS goal, and its message comes back intact. Runs asynchronously: returns a `workflowId` immediately — call `get_mutation_status` with it to see whether the change succeeded, and to get the bid that it replaced as `priorValue`. AdCrunch refuses an object that is not in this ad account with `not_found`.

### Input

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `bidCap` | number, more than 0 | no | The highest bid Meta places in an auction. Only with LOWEST_COST_WITH_BID_CAP. A bid is per optimization event, for example per purchase, and per 1,000 impressions when the optimization goal is IMPRESSIONS or REACH. The amount is in whole units of the ad account currency: 2.5 is 2.50. Meta refuses more decimals than the currency has. |
| `costCap` | number, more than 0 | no | The average cost per result that Meta tries to keep. Only with COST_CAP. A bid is per optimization event, for example per purchase, and per 1,000 impressions when the optimization goal is IMPRESSIONS or REACH. The amount is in whole units of the ad account currency: 2.5 is 2.50. Meta refuses more decimals than the currency has. A cost cap can stop the ad set before it spends its full budget. |
| `roasFloor` | number, 0.01 to 1000 | no | The lowest return on ad spend that Meta bids for, as a ratio: 1.5 means purchase value of 1.5 times the spend. Only with LOWEST_COST_WITH_MIN_ROAS. From 0.01 to 1000, with at most 4 decimals. |
| `bidStrategy` | one of `LOWEST_COST_WITHOUT_CAP`, `LOWEST_COST_WITH_BID_CAP`, `COST_CAP`, `LOWEST_COST_WITH_MIN_ROAS` | yes | How Meta bids. LOWEST_COST_WITHOUT_CAP ("Highest volume" in Ads Manager) gets the most results for the budget and takes no amount. LOWEST_COST_WITH_BID_CAP ("Bid cap") takes bidCap. COST_CAP ("Cost per result goal") takes costCap. LOWEST_COST_WITH_MIN_ROAS ("ROAS goal") takes roasFloor, and needs the optimization goal VALUE. Give exactly the amount that the strategy takes, and no other amount. A higher bid cap, a higher cost cap or a lower ROAS floor can make an ad set spend its full budget, never more. Send the strategy also to change only an amount. A change of strategy starts the learning phase again, and a large change of amount can too. Meta refuses a change of strategy on a campaign with ad set budget sharing, on a campaign budget with more than 70 ad sets, and on a campaign budget on ROAS goal. Meta advises at most 2 or 3 bid or budget changes a day, and 15 minutes between a budget change and a bid change. |
| `advertiserId` | string | yes | Advertiser account ID (`acc_<id>`). Must belong to the active organization. |
| `id` | string | yes | The Meta object ID of the campaign or ad set, digits only. |
| `level` | one of `campaign`, `adset` | yes | Which level the `id` refers to. Under a campaign budget, `campaign` changes the strategy of the campaign and `adset` changes the amount of one ad set. Without a campaign budget, only `adset`. |

### 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",
  "bidStrategy": "COST_CAP",
  "costCap": 12.5,
  "id": "120215678901234568",
  "level": "adset"
}
```

The result, in `structuredContent`:

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