Google Ads Write
๐จ **IF THIS TOOL RETURNS A QUOTA ERROR:** - The error message will include a clickable upgrade link - Show the FULL error message to the user (it contains the upgrade link) - DO NOT attempt to work ar
POST https://api.adspirer.ai/api/v1/tools/create_display_campaign/execute
Authorization: Bearer sk_live_... โ your Adspirer API key (required)Content-Type: application/json (required)Idempotency-Key: <uuid> โ recommended for write operations to make retries safeAll tool arguments are wrapped in an arguments object.
| Field | Type | Description |
|---|---|---|
campaign_name | string required | Campaign name (e.g., 'Display Spring Promo 2026') |
budget_daily | number required | Daily budget in the account's native currency. IMPORTANT: Do NOT convert currencies โ pass the amount as-is. |
final_url | string required | Landing page URL. Must be https. Example: 'https://example.com/product' |
business_name | string required | Business name, max 25 characters. Example: 'Adspirer' |
headlines | array required | JSON ARRAY: 1-5 short headlines, each MAX 30 characters. Count characters carefully โ any over 30 will be REJECTED. |
long_headline | string required | Exactly 1 long headline, max 90 characters. Example: 'Run Google, Meta, LinkedIn and TikTok ads from one workspace' |
descriptions | array required | JSON ARRAY: 1-5 descriptions, each MAX 90 characters. |
marketing_images | array optional | Landscape images (1.91:1, min 600x314, max 5MB). Format: [{"url": "https://...", "name": "img1"}]. At least 1 landscape required (unless reusing via existing_images). |
square_marketing_images | array optional | Square images (1:1, min 300x300, max 5MB). Format: [{"url": "https://...", "name": "img1"}]. At least 1 square required (unless reusing via existing_images). |
logo_images | array optional | Optional landscape logos (4:1). Up to 5. |
square_logo_images | array optional | Optional square logos (1:1, min 128x128). Up to 5. |
existing_images | object optional | Reuse existing image asset resource names. Keys: marketing_images_landscape, marketing_images_square, logos_landscape, logos_square. |
youtube_video_ids | array optional | Optional YouTube video IDs (0-5). Each is an 11-char YouTube ID. |
bidding_strategy | string optional | One of: MAXIMIZE_CLICKS, MAXIMIZE_CONVERSIONS, TARGET_CPA, TARGET_ROAS, MANUAL_CPC (enhanced CPC), MANUAL_CPM (viewable CPM). Smart Display requires TARGET_CPA. default: "MAXIMIZE_CLICKS" |
target_cpa | number optional | Target CPA in account currency. Required for TARGET_CPA bidding (and Smart Display). |
target_roas | number optional | Target ROAS multiplier. Required for TARGET_ROAS bidding. Example: 3.5 = 350% ROAS. |
cpc_bid | number optional | Max CPC bid in account currency. Required for MANUAL_CPC. |
cpm_bid | number optional | Max viewable CPM bid in account currency. Required for MANUAL_CPM. |
target_locations | array optional | Geographic targets (e.g., ['India', 'United States']). Defaults to United States. |
target_languages | array optional | Language ISO codes (e.g., ['en', 'es']). Defaults to English. |
audience_segments | object optional | Ad-group audience targeting. Keys: 'user_interests' (affinity/in-market category IDs), 'custom_audiences' (resource names), 'user_lists' (remarketing/customer-match resource names), 'combined_audiences' (resource names). Use search_audiences to get valid IDs. NEVER fabricate IDs. IGNORED when smart_display=true. |
topics | array optional | Topic IDs or 'topicConstants/<id>' resource names for ad-group topic targeting. IGNORED when smart_display=true. |
managed_placements | array optional | Managed placements (ad-group level). List of {type, value}: type in ('website','mobile_app','youtube_channel','youtube_video'). Example: [{"type":"website","value":"example.com"}]. IGNORED when smart_display=true. |
display_keywords | array optional | Contextual display keywords (ad-group level, always BROAD match). List of {text, negative?}: negative=true for negative keywords. IGNORED when smart_display=true. |
demographics | object optional | Ad-group demographic targeting (we EXCLUDE everything not listed). Keys: age_ranges (AGE_RANGE_18_24, AGE_RANGE_25_34, etc.), genders (MALE, FEMALE, UNDETERMINED), parental_statuses (PARENT, NOT_A_PARENT, UNDETERMINED), income_ranges (INCOME_RANGE_70_80, etc.). IGNORED when smart_display=true. |
call_to_action | string optional | CTA label. Options: LEARN_MORE, SHOP_NOW, SIGN_UP, SUBSCRIBE, DOWNLOAD, BOOK_NOW, CONTACT_US, GET_QUOTE, APPLY_NOW, WATCH_NOW, ORDER_NOW, BUY_NOW, SEE_MORE, START_NOW, VISIT_SITE, DONATE_NOW, PLAY_NOW |
format_setting | string optional | Display ad format setting: ALL_FORMATS (default), NATIVE, or NON_NATIVE. |
main_color | string optional | Main brand color as hex (e.g., '#112233' or '#FFF'). |
accent_color | string optional | Accent color as hex (e.g., '#FFAABB'). |
allow_flexible_color | boolean optional | Let Google pick optimal colors when it performs better. Default true. default: true |
price_prefix | string optional | Optional price prefix displayed before a price. Max 10 chars. Example: 'from'. |
promo_text | string optional | Optional promotional text. Max 20 chars. Example: 'Up to 50% off'. |
smart_display | boolean optional | If true, creates a Smart Display campaign (Google-managed, sub_type=DISPLAY_SMART_CAMPAIGN). Requires bidding_strategy=TARGET_CPA. Manual targeting fields (audience_segments/topics/managed_placements/display_keywords/demographics) are rejected when smart_display=true. Account needs conversion tracking + sufficient conversion history. default: false |
start_date | string optional | Optional start date YYYY-MM-DD. Defaults to tomorrow. |
end_date | string optional | Optional end date YYYY-MM-DD. Defaults to 1 year from now. |
customer_id | string optional | Google Ads customer ID. Required for multi-account users. |
{
"arguments": {
"campaign_name": "string",
"budget_daily": 1.0,
"final_url": "https://example.com",
"business_name": "string",
"headlines": [
"string"
],
"long_headline": "string",
"descriptions": [
"string"
],
"marketing_images": [
{}
],
"square_marketing_images": [
{}
],
"logo_images": [
{}
],
"square_logo_images": [
{}
],
"existing_images": {},
"youtube_video_ids": [
"string"
]
}
}
{
"success": true,
"data": {
"text": "(tool-specific textual output for create_display_campaign)",
"quota": {
"used": 42,
"limit": 150,
"tier": "plus",
"period_end": "2026-05-01"
}
},
"tool": "create_display_campaign"
}
{
"success": false,
"error": "You have 25 meta_ads accounts connected. Please specify which account to use by passing the ad_account_id parameter:\n - Acme Holdings (ad_account_id=\"act_123456789\")\n - Acme EU (ad_account_id=\"act_987654321\")",
"is_error": true,
"tool": "create_display_campaign"
}
{
"success": false,
"error": "\ud83d\udea8 Monthly limit reached (150/150 tool calls on Plus tier).\nUpgrade to Pro at https://adspirer.ai to keep building.",
"is_error": true,
"tool": "create_display_campaign",
"quota": {
"used": 150,
"limit": 150,
"tier": "plus",
"period_end": "2026-05-01",
"upgrade_url": "https://adspirer.ai"
}
}
Interactive: Swagger UI
Machine-readable: OpenAPI 3.1 spec ยท llms-full.txt
More tools: Google Ads ยท All tools
Adspirer REST API โ get an API key at adspirer.ai/keys ยท adspirer.ai