---
title: "Plan a Meta budget reallocation"
method: POST
path: "/api/v1/tools/meta_optimize_budget/execute"
tags: ["Meta Ads"]
---

# Plan a Meta budget reallocation

`POST /api/v1/tools/meta_optimize_budget/execute`

## Request

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

Compares the ad sets in a campaign (or the whole account) on cost per result — or ROAS where revenue exists — and produces a reallocation plan: which budgets to raise, which to lower, by how much, and why.
Use when: the user asks where to put more money, or wants a defensible weekly rebalance.
Do not expect it to write anything. It returns a plan; each move is then a separate meta_update_adset_budget call the user approves.
Do not apply moves to an ad set still in the learning phase — the plan leaves those out and says so, because a budget change restarts learning.
Do not exceed the step size without saying what it costs: moves are capped at max_change_percentage (20% by default) because Meta re-enters learning on large jumps.
Returns the plan with before and after budgets, the reason per move, and the ad sets deliberately left alone.
If every ad set performs close to the average, the honest plan is to change nothing.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `arguments` object
    - `ad_account_id` string: Meta ad account id such as act_1234567890. Omit it to use the primary account; if several accounts are active and none is primary the call fails and lists the valid ids.
    - `campaign_id` string: Limit the plan to the ad sets of one campaign.
    - `max_change_percentage` number: Biggest step any single budget may move, as a fraction. Default 0.2 (20%).
    - `min_daily_budget` number: Floor no budget may fall below, decimal in the account currency. Default: Meta's own minimum daily budget for what each ad set is charged for, in this account's currency.
    - `keep_total` boolean: Fund every increase from the decreases so the total daily budget stays the same.
    - `date_range` 'today' | 'yesterday' | 'last_7_days' | 'last_14_days' | 'last_30_days' | 'this_month' | 'last_month': Preset window. The "last N days" ones end yesterday, so no partial day is mixed in. Either this or start_date + end_date, never both.
    - `start_date` string: First day, YYYY-MM-DD. Needs end_date.
    - `end_date` string: Last day, YYYY-MM-DD, inclusive. Needs start_date.
    - `raw_data` boolean: Return compact JSON only (no markdown). Use when you will compute on the result.

## 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)
