---
title: "Edit a ChatGPT Ads campaign"
method: POST
path: "/api/v1/tools/chatgpt_update_campaign/execute"
tags: ["ChatGPT Ads"]
---

# Edit a ChatGPT Ads campaign

`POST /api/v1/tools/chatgpt_update_campaign/execute`

## Request

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

Changes a campaign's name, status or spend limit. Both limits are decimals in the account currency: the lifetime limit is a hard ceiling on everything the campaign will ever spend, the daily limit paces it per day.
A campaign has one or the other, never both, so pass only one of lifetime_budget and daily_budget — passing both is refused. Setting a daily budget on a lifetime campaign replaces the ceiling permanently: the platform cannot switch back, so read chatgpt_list_campaigns first and tell the user which kind of limit the campaign has now.
Use when: renaming for clarity, or the user has decided to scale a campaign up or down and named the amount.
Do not use it to pause or resume — chatgpt_pause_campaign and chatgpt_resume_campaign exist so the risk of that change is stated correctly to the user before they approve it.
Do not lower the lifetime ceiling below what the campaign has already spent: the platform refuses it, and once a campaign is at its ceiling it stops delivering. Check spend with chatgpt_get_performance first.
Returns the campaign read back from the platform after the change, so the new values are confirmed rather than assumed. At least one of name, status, lifetime_budget or daily_budget must be given.
If the user says "increase the budget" without a number, ask which limit and how much. Never pick an amount for them.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `arguments` object, required
    - `ad_account_id` string: ChatGPT Ads advertiser account id. One advertiser key belongs to one account, so this is only needed when the user has connected more than one key. Omit it to use the primary account.
    - `campaign_id` string, required: The campaign to edit.
    - `name` string: New campaign name.
    - `status` 'active' | 'paused': New status. Prefer chatgpt_pause_campaign / chatgpt_resume_campaign, which explain the risk properly.
    - `lifetime_budget` number: Hard ceiling on total spend, decimal in the account currency (25 means twenty-five, not 2500). Only for a campaign that already has a lifetime ceiling; a daily-budget campaign cannot be switched back. Never pass this together with daily_budget.
    - `daily_budget` number: Daily spending limit, decimal in the account currency. Replaces a lifetime ceiling permanently if the campaign has one. Never pass this together with lifetime_budget.
    - `idempotency_key` string: Optional caller-supplied key; identical keys never execute twice.
    - `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)
