Update a campaign
Campaign-level edits. Send at least one of budget, bidStrategy, portfolioBidStrategyId, name or platformSpecificData. An unsupported field is always an error, never a silent drop.
| Body field | Meta | Others | |
|---|---|---|---|
| bidStrategy | Yes | Yes | 501 |
| bidAmount, roasAverageFloor | 400 (ad-set level) | Yes | 400 |
| portfolioBidStrategyId | 400 | Yes | 400 |
| budget (CBO; ABO returns 409) | Yes | Daily only | OpenAI: daily or lifetime; others 501 |
| name | Yes | 501 | 501 |
| platformSpecificData.spendCap | Yes | 400 | 400 |
| accountId (empty campaigns) | Yes | - | - |
Meta budget edits check the live campaign budget, so an older local ABO stamp cannot block a CBO campaign. A successful edit repairs local ad budget fields. A live ABO campaign still returns 409 with the ad-set budget endpoint.
On Google: LOWEST_COST_WITHOUT_CAP = Maximize Conversions, COST_CAP + bidAmount = Target CPA, LOWEST_COST_WITH_MIN_ROAS + roasAverageFloor = Target ROAS, LOWEST_COST_WITH_BID_CAP + bidAmount = Maximize Clicks with a CPC ceiling; portfolioBidStrategyId attaches a portfolio strategy instead (exclusive with bidStrategy). Setting the standard triplet on a campaign that is currently on a PORTFOLIO strategy is rejected: detach it in Google Ads first, since it is shared across campaigns.
Google budget updates read the current budget before mutation. Shared budgets return 409 unless allowSharedBudgetUpdate=true is explicitly supplied, because the change affects every campaign using that budget. Unknown sharing state also returns 409.
OpenAI Ads campaigns carry exactly one spend cap: budget.type daily or lifetime replaces whichever cap the campaign had, with a minimum of 1 in the ad account's currency (422 below it). Lifetime can switch to daily, but OpenAI never switches a daily cap back to lifetime (422).
accountId forwards the update straight to Meta for a campaign with zero ads, which would otherwise 404; the response then carries updated: 0.
Path parameters
Platform campaign ID
Request body
Response
Campaign updated