---
title: "Bulk update Google Ads campaign budgets"
method: PATCH
path: "/api/apps/{app_id}/google-ads/campaigns/bulk-budget"
---

# Bulk update Google Ads campaign budgets

`PATCH /api/apps/{app_id}/google-ads/campaigns/bulk-budget`

<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>

Changes the daily budget on several campaigns in one call.

Send one entry per campaign in `updates`, each with a `campaign_id` and a `daily_budget_micros`. Budgets are absolute, not deltas, and are in micros of the account currency.

Each entry is applied on its own and this is **not** atomic. The response lists the campaigns that were updated in `succeeded` and the ones that were not in `failed`, each with a reason. A partially applied call still returns a 200, so check `failed` rather than relying on the status code. Re-sending an entry is safe, because the budget is set to the value you send rather than added to it.

<Warning>An entry in `failed` usually means the budget did not change, but it can also mean Google accepted the new budget and only Base44's own record of it failed to save. In that case the campaign is already spending at the new budget. Read the campaign back with [Get campaign](/api-reference/get-google-ads-campaign) before you treat a failed entry as unchanged.</Warning>

Each `reason` is free text meant for a person to read. Do not branch on it.

<Note>This endpoint accepts a personal API key. Workspace API keys are not authorized for it and are rejected with a 403.</Note>

<Warning>The response includes fields beyond the ones documented here. Don't rely on undocumented response fields, as they can change at any time. Send only the fields documented here. Other request fields are not supported and their behavior can change.</Warning>

## Path parameters

- `app_id` string, required — ID of the app whose Google Ads campaigns to manage.

## Request body

- object
  - `updates` object[], required — One entry per campaign. An empty array is accepted and changes nothing.
    - `campaign_id` string, required — Campaign to update, as returned in `id` by [List campaigns](/api-reference/list-google-ads-campaigns).
    - `daily_budget_micros` integer, required — New daily budget in micros of the account currency. Absolute, not a delta.

## Response `200`

Successful Response

- BulkBudgetUpdateResponse — Per-campaign outcome of a bulk budget update.
  - `succeeded` string[], required — IDs of the campaigns whose budget was updated.
  - `failed` BulkBudgetFailure[], required — Campaigns that were left unchanged, each with a reason. Empty when every update applied.
    - `campaign_id` string, required — Campaign whose update failed.
    - `reason` string, required — Why it failed. Free text for people to read, not a stable code to branch on. Some reasons mean the budget did change on Google and only Base44's record of it failed, so verify before treating the entry as unchanged.

## Other responses

- `401` — Missing or invalid credentials.
- `403` — You don't have access to this app, the app does not exist, or you used a workspace API key. A missing app and an app you cannot reach are deliberately the same answer.
- `404` — The app has no connected Google Ads account.
- `422` — Validation Error

## Changes

- **2026-08-26** `df72f6cff1ca` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/idealspot/apis/base44-app-management-api/changes/api/apps/:app_id/google-ads/campaigns/bulk-budget/patch.md)

---

[API](https://skmtc.dev/idealspot/apis/base44-app-management-api.md) · [All operations](https://skmtc.dev/idealspot/apis/base44-app-management-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/idealspot/base44-app-management-api/revisions/d8572ad3094a/schema)
