---
title: "Propose a budget reallocation (writes nothing)"
method: POST
path: "/api/v1/tools/google_optimize_budget_allocation/execute"
tags: ["Google Ads"]
---

# Propose a budget reallocation (writes nothing)

`POST /api/v1/tools/google_optimize_budget_allocation/execute`

## Request

- Base URL: `https://adako.ai`
- URL: `https://adako.ai/api/v1/tools/google_optimize_budget_allocation/execute`
- Auth: HTTP bearer

Produces a **plan** for moving budget between campaigns, based on what each one currently returns and whether it is actually budget-limited. **It changes nothing.** Applying any line of the plan means calling google_update_campaign_budget for that campaign, which the user approves separately.
Use when: the user asks where their money should go and several campaigns have enough data to compare.
Do not use when: campaigns have very different objectives (brand versus prospecting), or when a campaign has fewer than about 15 conversions in the window — the comparison is then noise dressed up as arithmetic. Say that instead of producing a plan.
The heuristic: rank campaigns by cost per conversion (or by ROAS when you ask for value), raise the efficient ones that are spending their budget, lower the inefficient ones, cap every move at max_change_percentage, never go below min_daily_budget, and keep the account total the same unless you ask otherwise. Proposed budgets are whole multiples of the smallest amount Google bills in the account currency (a whole yen or won, a cent for most others), so any line can be applied exactly as shown.
A campaign that is not spending its budget will not spend more just because the budget goes up: the plan says so rather than proposing a rise.
If you are unsure which account, campaign or period the user means, ask them — do not guess ids or dates.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `arguments` object
    - `customer_id` string: Google Ads customer id (10 digits, dashes optional). Omit to use the primary account; list_connected_accounts shows the valid ids.
    - `objective` 'conversions' | 'value': Optimise for cost per conversion (default) or for return on ad spend.
    - `date_range` 'today' | 'yesterday' | 'last_7_days' | 'last_14_days' | 'last_30_days' | 'this_month' | 'last_month': Preset range. Alternatively pass start_date and end_date (YYYY-MM-DD). Never both.
    - `start_date` string: First day of the period (YYYY-MM-DD). Use with end_date.
    - `end_date` string: Last day of the period (YYYY-MM-DD). Use with start_date.
    - `max_change_percentage` number: Largest move for any one campaign, as a percentage. Default 20.
    - `min_daily_budget` number: Floor no campaign goes below, as a decimal in the account currency.

## Response `200`

The tool ran. A write returns proposal_id and approve_url while the change waits for approval.

- SuccessEnvelope
  - `success` unknown, required
  - `tool` string, required
  - `data` object, required: Machine-readable result.
  - `markdown` string, required: The same result written for a person or a model.
  - `quota` Quota: Task usage for the current billing period.
    - `plan` string
    - `used` integer
    - `limit` integer
    - `period_end` string
    - `upgrade_url` string
  - `proposal_id` string: Present for writes. Nothing changes on the ad platform until it is approved.
  - `approve_url` string: Where a person approves the proposal.
  - `request_id` string, required

## Other responses

- `400`: Invalid arguments, or the ad account could not be resolved.
- `401`: Missing, invalid, revoked or expired API key.
- `402`: Monthly task quota used up, or the plan does not include this tool.
- `403`: The connected ad account lacks the access level this tool needs.
- `404`: Unknown tool name.
- `409`: Not connected, reconnect needed, confirmation required, a proposal already pending or no longer pending, an identical create that failed earlier today (proposal_failed_before), a create that duplicates an approved one (duplicate_create), the ad-account limit of the plan reached (account_limit), or an Idempotency-Key reused with different arguments.
- `429`: Rate limited by Adako or by the ad platform. See Retry-After.
- `500`: Unexpected error inside Adako.
- `502`: The ad platform returned an error.

---

[API](https://skmtc.dev/adako/apis/adako-rest-api.md) · [All operations](https://skmtc.dev/adako/apis/adako-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/adako/apis/adako-rest-api/revisions/59ee60d48a56?raw)
