Create Google display campaign (adsap_google_create_display_campaign)
Platform: Google Ads · Read or write: Write · Plan: Early Access · Consumes a task: Yes · Preview supported: Yes
What it does
Creates a classic standalone Display campaign in one request: budget, campaign, location and language targeting, a Display ad group and a responsive display ad. Image and video inputs are asset IDs from an earlier upload. The campaign is always created paused. Ask for a preview first.
When to use it
- Use it when you want a classic standalone Display campaign with your own bid control, such as
manual_cpcortarget_cpa. - For a new build, consider
adsap_google_create_demand_gen_campaignwith thedisplaychannel selected instead. - Upload the images first with
adsap_google_upload_asset. Landscape and square images together are capped at 15, and logos at 5. - Bid fields must match the strategy.
cpc_bidgoes withmanual_cpc,target_cpawithtarget_cpa, andtarget_roaswithtarget_roas. Any other pairing is rejected. - It supports a preview call. With
dry_runset totrue, Google validates the plan, nothing is created, and no task is used.
Worked example
You ask
“Preview a Display campaign in account 1234567890 for the spring sale. 25 a day, France, French speakers, target CPA of 15, using my uploaded banner images.”
The assistant calls adsap_google_create_display_campaign
{
"ad_account_id": "1234567890",
"campaign": {
"name": "Spring sale, Display",
"daily_budget": 25,
"bidding_strategy": "target_cpa",
"target_cpa": 15
},
"geo": {
"location_ids": ["2250"]
},
"language_ids": ["1010"],
"ad": {
"final_url": "https://www.example.com/spring-sale",
"business_name": "Example Store",
"long_headline": "The spring sale is on: new styles at lower prices this week",
"headlines": ["Spring Sale Is On", "New Styles, Lower Prices"],
"descriptions": ["Shop the spring sale this week. Free returns for 30 days."],
"landscape_image_asset_ids": ["30000000002"],
"square_image_asset_ids": ["30000000003"]
},
"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_display_campaign",
"plan": {
"campaign": {
"name": "Spring sale, Display",
"status_at_create": "PAUSED",
"daily_budget": 25,
"bidding_strategy": "target_cpa",
"cpc_bid": null,
"target_cpa": 15,
"target_roas": null
},
"geo": {
"location_ids": ["2250"],
"negative_location_ids": []
},
"language_ids": ["1010"],
"ad_group": {
"name": "Spring sale, Display - ad group",
"type": "DISPLAY_STANDARD",
"optimized_targeting": true
},
"ad": {
"final_url": "https://www.example.com/spring-sale",
"business_name": "Example Store",
"headlines": 2,
"long_headline": 1,
"descriptions": 1,
"landscape_images": 1,
"square_images": 1,
"square_logos": 0,
"landscape_logos": 0,
"youtube_videos": 0,
"call_to_action_text": null
},
"operations_count": 6,
"conversion_actions_found": 3
},
"bidding_strategy": "target_cpa",
"google_validation": "passed",
"warnings": [
"Heads-up: Google is migrating standalone Display campaigns INTO Demand Gen (no cutoff date published as of 2026-07-21). This campaign will eventually be auto-migrated; new builds may prefer a Demand Gen campaign with the Display channel enabled."
]
}How to read it
plan is what Adsap would send to Google. status_at_create is PAUSED, so nothing spends yet. The ad group name and optimized_targeting were filled in with their defaults. The counts under ad confirm which text and image assets made it into the responsive display ad.
warnings never block the call. The note about the move to Demand Gen comes back on every response from this tool. google_validation is passed when Google accepts the plan. Otherwise it holds Google’s error message. To create the campaign, the assistant repeats the call without dry_run and gets a campaign_id and an ad_group_id back.
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 | object | Yes | |
campaign.name | string | Yes | |
campaign.daily_budget | number | Yes | Daily budget in the ACCOUNT CURRENCY as a plain number (e.g. 10). NOT micros, NOT cents. |
campaign.bidding_strategy | one of auto, maximize_clicks, manual_cpc, maximize_conversions, target_cpa, target_roas | No | ’auto’ (default) = Maximize Clicks. ‘target_cpa’ is the STANDALONE scheme (Display rejects a target CPA inside maximize_conversions). ‘target_roas’ has a conversion-history eligibility gate. |
campaign.cpc_bid | number | No | Max CPC bid in the account currency. REQUIRED with manual_cpc; invalid otherwise. |
campaign.target_cpa | number | No | Target cost per action in the account currency. REQUIRED with bidding_strategy target_cpa; invalid otherwise. |
campaign.target_roas | number | No | Target return on ad spend as a multiplier (3.5 = 350%). REQUIRED with bidding_strategy target_roas. |
geo | object | Yes | |
geo.location_ids | array of string | Yes | Geo target constant ids to TARGET (from adsap_google_search_geo_targets). Campaign-level, like Search. |
geo.negative_location_ids | array of string | No | Geo target constant ids to EXCLUDE. |
language_ids | array of string | No | Language constant ids (e.g. 1000 = English). Campaign-level; omit to target all languages. |
ad_group | object | No | |
ad_group.name | string | No | Ad group name (defaults to ‘<campaign name> - ad group’). |
ad_group.optimized_targeting | boolean | No | Optimized targeting (default true): Google reaches beyond your criteria; the geo/language criteria stay the hard limits. |
ad | object | Yes | |
ad.final_url | string | Yes | Landing page URL (on the ad, required). |
ad.business_name | string | Yes | |
ad.long_headline | string | Yes | EXACTLY ONE long headline, max 90 chars (Display-specific slot). |
ad.headlines | array of string | Yes | |
ad.descriptions | array of string | Yes | |
ad.landscape_image_asset_ids | array of string | Yes | At least one landscape (1.91:1, min 600x314) image ASSET id from adsap_google_upload_asset. Landscape + square combined max 15. |
ad.square_image_asset_ids | array of string | Yes | At least one square (1:1, min 300x300) image ASSET id. Landscape + square combined max 15. |
ad.logo_asset_ids | array of string | No | Optional square logos (1:1, min 128x128). Square + landscape logos combined max 5. |
ad.landscape_logo_asset_ids | array of string | No | Optional landscape logos (4:1, min 512x128): a Display-only slot with no Demand Gen equivalent. |
ad.youtube_video_asset_ids | array of string | No | Optional: up to 5 YouTube video ASSET ids from adsap_google_upload_asset. |
ad.call_to_action_text | string | No | |
ad.control_spec | object | No | Optional responsive-display-ad automation controls: enable_asset_enhancements (Google may enhance images/layouts) and enable_autogen_video (Google may generate video versions). Absent = Google’s enabled-by-default behavior. |
dry_run | boolean | No | Preview only: the request is validated and the resolved payload returned, nothing is created or changed. |
Example prompts
- “Preview a Display campaign at 25 dollars a day targeting Spain with these landscape and square images.”
- “Create a Display campaign with target CPA at 15 dollars using the assets I uploaded.”
- “Create the Display campaign we just previewed.”
Notes
Google is moving standalone Display into Demand Gen, and every response carries that heads-up. For new builds, consider a Demand Gen campaign with the display channel selected. The ad needs at least one landscape and one square image, exactly one long headline, and a business name.
Related tools
adsap_google_create_app_campaign: Create a complete Google App campaign in ONE atomic request: budget, campaign (ALWAYS created PAUSED: activate later with…adsap_google_create_demand_gen_campaign: Create a complete Google Ads Demand Gen campaign (YouTube, Discover, Gmail, Maps and the Google Display Network) in ONE atomic request…adsap_google_create_pmax_campaign: Create a complete Google Ads Performance Max campaign in ONE atomic request: budget, campaign (ALWAYS created PAUSED: activate later with…adsap_google_create_search_campaign: Create a complete Google Ads Search campaign in ONE atomic request: budget, campaign (ALWAYS created PAUSED: activate later with…adsap_google_create_shopping_campaign: Create a complete standard Google Shopping campaign in ONE atomic request: budget, campaign (ALWAYS created PAUSED: activate later with…adsap_google_list_campaigns: List Google Ads campaigns in a Google Ads account (cache-first; auto-refreshes from Google when the cache is missing or older than 1 hour).
Guide
Read Google Display campaigns 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.