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

# Create a ChatGPT Ads ad group

`POST /api/v1/tools/chatgpt_create_ad_group/execute`

## Request

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

Adds one paused ad group to a campaign that already exists, with its own bidding configuration and optional context hints. Nothing delivers until the user resumes it, and creating it spends nothing.
Use when: the user wants to test a different audience, context or bid inside a campaign they already have. Get the campaign id from chatgpt_list_campaigns first.
Do not use it to set a budget — budgets live on the campaign on this platform, so a "budget for this ad group" is really chatgpt_update_campaign. Do not use it to build a whole campaign from scratch: that is chatgpt_launch_ad.
Do not pass a place name in geo_location_ids. Resolve every place with chatgpt_geo_lookup first; ids only. Because geo targeting is a campaign setting here, passing locations rewrites where the **whole campaign** runs — the preview says so explicitly, so read it to the user before they approve.
max_bid is required: this tool creates a fixed-bid ad group, which the platform will not accept without a maximum bid, so a call without one is refused before anything is created. Its 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 it with that unit.
Returns the new ad group id, read back from the platform with its paused state and its bid confirmed.
If the user has not said what the ad group is for or what to bid, ask. Do not invent a bid.

## 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 add the ad group to, from chatgpt_list_campaigns.
    - `name` string, required: Ad group name shown in Ads Manager. Say what it targets.
    - `max_bid` number: Maximum bid, a decimal in the account currency. Required, because this tool creates a fixed-bid ad group: without it the call is refused, so ask the user for the number. 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).
    - `context_hints` string[]: Short free-text hints about the audience or context the ads suit. This platform has no keywords; these are the nearest thing.
    - `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)
