Docs
APIAPI referenceAds

PATCH /v1/projects/:projectId/ads/:platform/adsets/:adsetId/budget

Update an adset's daily or lifetime budget. Cents universally.

View as Markdown
PATCH/v1/projects/:projectId/ads/{platform}/adsets/:adsetId/budget
Phase 1stable
Auth
Bearer
Scope
ads:write:budgets

Same shape as PATCH …/campaigns/:id/budget but at the adset grain. Apple uses "adgroup" for this entity — partner contract uses adsets uniformly and Layers translates.

curl -X PATCH https://api.layers.com/v1/projects/$PROJECT_ID/ads/meta/adsets/$ADSET_ID/budget \
  -H "Authorization: Bearer $LAYERS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "dailyBudgetCents": 2500 }'

Authority: gated by the tactical axis on the parent campaign.

See PATCH …/campaigns/:id/budget for full body / response / error documentation — the contract is identical.

CBO vs ABO interplay

On Meta with CBO (campaign budget optimization), adset-level budget is ignored — the campaign's budget is the source. PATCHing adset budget on a CBO campaign returns PLATFORM_REJECTED. Use GET …/campaigns/:id to read budgetMode (CBO or ABO) before deciding which endpoint to call.

Apple: budget lives on the campaign

Apple Search Ads has no ad-group-level budget — the campaign is the spend boundary. PATCHing an Apple adgroup's budget updates the parent campaign's daily budget; lifetimeBudgetCents maps to the campaign's lifetime budgetAmount. Authority still arbitrates at the adgroup grain (the tactical axis and budget caps apply unchanged).

If a campaign carries more than one ad group, the budget is shared across all of them. Layers-provisioned Apple campaigns are created 1:1 (one Search Match ad group per campaign), so the ad-group and campaign budget grains coincide in practice.

On this page