Docs
APIAPI referenceAds

PATCH /v1/projects/:projectId/ads/:platform/campaigns/:campaignId/budget

Update a campaign's daily or lifetime budget. Cents universally.

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

Updates a campaign's budget. Cents universally — Layers translates per-platform at the proxy boundary. See LOCK 2.

Body

Body (one of)
  • dailyBudgetCents
    integeroptional
    New daily budget in cents.
  • lifetimeBudgetCents
    integeroptional
    New lifetime budget in cents.

Pass exactly one. Switching budget mode (daily ↔ lifetime) on Meta requires platform-side handling — Layers translates; some platforms refuse mid-flight switches and return PLATFORM_REJECTED.

Request

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

Response

200 with {entityId, platform, dailyBudgetCents, lifetimeBudgetCents, verdictId, occurredAt}. The platform write is dispatched asynchronously — settlement (including the authority-gate verdict on draft/off axes) surfaces through the ads.write.executed / ads.write.denied webhooks. A success response means the write was durably dispatched, not yet applied platform-side.

Errors

CodeWhen
AUTHORITY_DENIEDtactical axis is off.
VALIDATIONBoth daily + lifetime set; budget below platform minimum.
PLATFORM_REJECTEDPlatform refused (mid-flight mode switch, or lifetime past endTime).
INTERNALDispatch failed — nothing was changed, on the platform or locally. Safe to retry.

See also

On this page