Add ad group to Google campaign (adsap_google_create_ad_group)
Platform: Google Ads · Read or write: Write · Plan: All plans · Consumes a task: Yes · Preview supported: Yes
What it does
Adds an ad group to an existing Search, Display or Demand Gen campaign, with optional keywords (Search only) and one optional ad. It can also add one responsive search ad to an ad group that already exists. If the parent campaign is active, the new ad group starts paused unless you say otherwise. Ask for a preview first.
When to use it
- Use it to add an ad group to a campaign that already exists. The campaign create tools always build a new campaign.
- It needs
campaign_idand achannelthat matches the campaign type. Get both fromadsap_google_list_campaigns. A mismatch is rejected. - Send
ad_groupto create a group, orad_group_idto add one responsive search ad to an existing group. Never send both. The second mode is Search only and needsad. - For Demand Gen,
ad_group.geo.location_idsis required, because Demand Gen targets locations on the ad group. For Search and Display,geois rejected. - It supports a preview call. With
dry_runset totrue, Google validates the request, nothing is created, and no task is used.
Worked example
You ask
“Preview a new ad group for waterproof trail shoes in Search campaign 21000000001, account 1234567890, with two keywords and a responsive search ad.”
The assistant calls adsap_google_create_ad_group
{
"ad_account_id": "1234567890",
"campaign_id": "21000000001",
"channel": "search",
"ad_group": {
"name": "Waterproof trail shoes",
"keywords": [
{ "text": "waterproof trail shoes", "match_type": "PHRASE" },
{ "text": "waterproof running shoes", "match_type": "PHRASE" }
]
},
"ad": {
"final_url": "https://www.example.com/trail-shoes/waterproof",
"headlines": [
{ "text": "Waterproof Trail Shoes" },
{ "text": "Grip on Wet Ground" },
{ "text": "Free Delivery in France" }
],
"descriptions": [
{
"text": "Waterproof trail shoes built for grip on wet and rocky ground."
},
{ "text": "Order today with free returns for 30 days." }
]
},
"dry_run": true
}Adsap returns
The field names are the ones Adsap returns. The values are examples.
{
"ok": true,
"dry_run": true,
"platform": "google",
"action": "create_ad_group",
"plan": {
"campaign": {
"id": "21000000001",
"name": "Spring sale",
"status": "ENABLED",
"advertising_channel_type": "SEARCH"
},
"channel": "search",
"ad_group": { "name": "Waterproof trail shoes", "status": "PAUSED", "keywords": 2 },
"ad": {
"ad_type": "responsive_search_ad",
"final_url": "https://www.example.com/trail-shoes/waterproof",
"headlines": 3,
"descriptions": 2
},
"operations_count": 4
},
"warnings": [
"Parent campaign \"Spring sale\" is ACTIVE, so the new ad group was created PAUSED to avoid serving immediately. Pass ad_group.status: \"ENABLED\" to create it serving, or enable it after review."
],
"google_validation": "passed"
}How to read it
plan is what would be built. plan.campaign is the parent campaign as Google reports it. plan.ad_group shows the name, the starting status and the keyword count. plan.ad shows the ad type, the URL and how many headlines and descriptions it holds. operations_count is the number of items sent to Google as one request: here the ad group, two keywords and the ad. The example shows part of plan. It also carries targeting IDs and image and video counts.
google_validation is passed when Google accepts the ad group, keywords and ad as one request. Otherwise it holds Google’s error message: fix the input and preview again. The response also carries a one-sentence human_readable_summary, left out of this example.
To create the ad group, the assistant repeats the call without dry_run. That response adds ad_group_id, ad_id and ad_group_status. If the parent campaign is active, the new ad group starts paused and warnings says so, as it does here. Pass ad_group.status as ENABLED to override that.
Parameters
Descriptions are shortened from the tool schema. Your assistant sees the full text.
| Name | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | Yes | Bare 10-digit Google Ads customer ID (from adsap_google_list_ad_accounts). No dashes, no act_ prefix. |
campaign_id | string | Yes | Numeric id of the EXISTING campaign to add the ad group to (from adsap_google_list_campaigns). |
channel | one of search, display, demand_gen | Yes | Must match the campaign’s advertising channel type. The workflow verifies and rejects mismatches. |
ad_group_id | string | No | EXISTING-GROUP MODE: numeric id of an EXISTING ad group (from the campaign’s ad group list)… Mutually exclusive with ad_group. |
ad_group | object | No | CREATE MODE: the new ad group to create. Mutually exclusive with ad_group_id: exactly one of the two is required. |
ad_group.name | string | Yes | Ad group name (Google requires uniqueness within the campaign). |
ad_group.status | one of ENABLED, PAUSED | No | Omit for the safe default: PAUSED when the parent campaign is ACTIVE, ENABLED when it is PAUSED. |
ad_group.keywords | array of object | No | SEARCH ONLY. Optional, but a Search ad group without keywords gets no traffic. |
ad_group.optimized_targeting | boolean | No | DISPLAY / DEMAND_GEN only (default true). |
ad_group.channels | object | No | DEMAND_GEN only: channel controls: strategy OR selected, not both. Defaults to ALL_CHANNELS. |
ad_group.geo | object | No | DEMAND_GEN only (REQUIRED there): Demand Gen targets geo at the AD GROUP level. Invalid for search/display: their geo lives on the campaign. |
ad_group.language_ids | array of string | No | DEMAND_GEN only. Language constant ids (default 1000 = English). |
ad | object | No | Optional: omit to create the ad group without an ad (it will not serve until one is added). |
ad.final_url | string | Yes | Landing page URL. Required whenever an ad is included. |
ad.status | one of ENABLED, PAUSED | No | EXISTING-GROUP MODE ONLY (ad_group_id): the new ad’s own status: defaults to PAUSED so it never serves unreviewed. In create mode the ad is ENABLED inside the group whose status you control. |
ad.headlines | any | No | SEARCH: 3-15 of { text (max 30), pinned_field? HEADLINE_1..3 }. DISPLAY/DG multi_asset: 1-5 plain strings max 30. |
ad.descriptions | any | No | SEARCH: 2-4 of { text (max 90), pinned_field? DESCRIPTION_1..2 }. DISPLAY/DG: 1-5 plain strings max 90. |
ad.path1 | string | No | SEARCH only: display path segment 1. |
ad.path2 | string | No | SEARCH only: display path segment 2 (requires path1). |
ad.business_name | string | No | DISPLAY / DEMAND_GEN: required. |
ad.long_headline | string | No | DISPLAY only: exactly one, required. |
ad.landscape_image_asset_ids | array of string | No | Image ASSET ids (1.91:1). DISPLAY: >=1 required. |
ad.square_image_asset_ids | array of string | No | Image ASSET ids (1:1). DISPLAY: >=1 required. |
ad.logo_asset_ids | array of string | No | Square logo ASSET ids. DG: 1-5 required; DISPLAY: optional. |
ad.landscape_logo_asset_ids | array of string | No | DISPLAY only: landscape (4:1) logos. |
ad.youtube_video_asset_ids | array of string | No | DISPLAY only: up to 5 YouTube video ASSET ids. |
ad.call_to_action_text | string | No | DISPLAY only: free-text CTA. |
ad.ad_type | one of multi_asset, video_responsive | No | DEMAND_GEN: required: ‘multi_asset’ image ad or ‘video_responsive’ YouTube ad. |
ad.name | string | No | DEMAND_GEN: ad name (defaulted if omitted). |
ad.call_to_action | string | No | DEMAND_GEN: CTA enum like LEARN_MORE, SHOP_NOW. |
ad.long_headlines | array of string | No | DG video_responsive: 1-5 long headlines max 90. |
ad.portrait_image_asset_ids | array of string | No | DG multi_asset: portrait (4:5) images. |
ad.tall_portrait_image_asset_ids | array of string | No | DG multi_asset: tall portrait (9:16) images. |
ad.youtube_video_ids | array of string | No | DG video_responsive: 1-5 YouTube VIDEO ids (not asset ids). |
dry_run | boolean | No | Preview only: the request is validated and the resolved payload returned, nothing is created or changed. |
Example prompts
- “Add an ad group called Winter Boots to my Search campaign with these keywords and a new responsive search ad.”
- “Add a second responsive search ad to the Trail Shoes ad group in campaign 1234567890.”
- “Preview a new Demand Gen ad group targeting Germany with this image ad.”
Notes
Performance Max, App and Shopping campaigns are not supported. An ad group created without an ad does not serve until an ad is added.
Related tools
adsap_google_list_extensions: List the extensions (sitelinks, callouts, structured snippets, call, promotion, price, image/AD_IMAGE) linked to Google Ads campaigns AND…adsap_google_list_feed_labels: List the distinct Merchant Center feed labels visible to a Google Ads account (from the products synced via its Merchant Center link).adsap_google_manage_extension: Manage Google Ads extensions (sitelinks, callouts, structured snippets, call, promotion, price) at CAMPAIGN level (default) or ACCOUNT…
Guide
Read Managing Google Ads in bulk for the workflow around this tool, and the Tool reference for every tool.
The Google Ads MCP server page shows how to connect Google Ads to Claude, ChatGPT or Perplexity.