---
title: "Edit a ChatGPT Ads ad group"
method: POST
path: "/api/v1/tools/chatgpt_update_ad_group/execute"
tags: ["ChatGPT Ads"]
---

# Edit a ChatGPT Ads ad group

`POST /api/v1/tools/chatgpt_update_ad_group/execute`

## Request

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

Changes an ad group's name, maximum bid or context hints, and — because geo targeting is a campaign setting on this platform — optionally the locations the whole parent campaign runs in.
Use when: the user has named what to change and what to change it to. Read the ad group first with chatgpt_list_ad_groups so the diff is against something you have shown them.
Do not use it to pause or resume: chatgpt_pause_ad_group and chatgpt_resume_ad_group state the risk of that change properly. Do not use it for budgets — those are on the campaign, so use chatgpt_update_campaign.
Do not ask it for automatic bidding: Adako only sets fixed bids here, so automatic_bidding: true is refused. The platform's own Maximize Results bidding needs a campaign on a daily budget and has to be set in Ads Manager. The bid's unit follows the campaign objective — a CPM (per 1,000 impressions) for reach, per click for clicks, per conversion for conversions — and the preview shows the old and new bid in that unit.
Do not pass place names in the location arguments; resolve them with chatgpt_geo_lookup first. Changing locations here replaces the campaign's whole include or exclude list, country-level targeting included, and therefore affects every ad group under it. The preview shows exactly what is replaced.
Returns the ad group read back from the platform, so the new bid is confirmed rather than assumed. A maximum bid far below the market stops winning auctions altogether, which looks like a broken ad group; the preview warns when a change looks like that.
At least one field must be given. If the user says "bid higher" without a number, ask how much.

## 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.
    - `ad_group_id` string, required: The ad group to edit, from chatgpt_list_ad_groups.
    - `name` string: New name.
    - `max_bid` number: New maximum bid, a decimal in the account currency. Its meaning follows the campaign objective: reach → the most to pay per 1,000 impressions (CPM, 60 means 60.00 per thousand); clicks → the most to pay per click (2.5 means 2.50 per click); conversions → the target cost per conversion (100 means 100.00 per conversion, although billing is still per click).
    - `automatic_bidding` boolean: Not supported here: Adako only sets fixed bids on this platform, so true is refused. Pass max_bid with the amount the user wants instead.
    - `context_hints` string[]: Replaces the context hints entirely. Pass an empty array to clear them.
    - `geo_location_ids` string[]: Location ids from chatgpt_geo_lookup that the ads may run in. Ids only — a place name here is refused. Targeting lives on the campaign on this platform, so this replaces the campaign’s whole location list (country-level targeting included) and applies to every ad group under it.
    - `excluded_geo_location_ids` string[]: Location ids from chatgpt_geo_lookup the ads must not run in. Ids only. Like the include list, this is campaign-wide and replaces the campaign’s whole exclude list, excluded countries included.
    - `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)
