# PATCH /v1/projects/:projectId/ads/:platform/campaigns/:campaignId/budget (/docs/api/reference/ads/patch-campaign-budget)



<Endpoint method="PATCH" path="/v1/projects/:projectId/ads/{platform}/campaigns/:campaignId/budget" scope="ads:write:budgets" phase="1" />

Updates a campaign's budget. **Cents universally** — Layers translates per-platform at the proxy boundary. See [LOCK 2](/docs/api/concepts/ads-write-model#currency).

## Body [#body]

<Parameters
  title="Body (one of)"
  rows="[
  { name: 'dailyBudgetCents', type: 'integer', description: 'New daily budget in cents.' },
  { name: 'lifetimeBudgetCents', type: 'integer', description: '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 [#request]

```bash
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 [#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 [#errors]

| Code                | When                                                                                  |
| ------------------- | ------------------------------------------------------------------------------------- |
| `AUTHORITY_DENIED`  | `tactical` axis is `off`.                                                             |
| `VALIDATION`        | Both daily + lifetime set; budget below platform minimum.                             |
| `PLATFORM_REJECTED` | Platform refused (mid-flight mode switch, or lifetime past `endTime`).                |
| `INTERNAL`          | Dispatch failed — **nothing was changed**, on the platform or locally. Safe to retry. |

## See also [#see-also]

* [Ads write model — currency](/docs/api/concepts/ads-write-model#currency)
* [`PATCH …/adsets/:id/budget`](/docs/api/reference/ads/patch-adset-budget)
