add_demandgen_ad

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

Endpoint

POST https://api.adspirer.ai/api/v1/tools/add_demandgen_ad/execute

Headers

Description

๐Ÿšจ **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 around the error or use alternative data - DO NOT create campaigns or perform actions without valid tool data - STOP and direct the user to upgrade via the provided link Add a new Demand Gen ad (image or video) to an EXISTING Demand Gen ad group. Use this to add MORE ads to an ad group you already have โ€” e.g. test a second creative, or add a video ad alongside an image ad. It does NOT create an ad group or change targeting; get the ad_group_id from get_campaign_structure (it must be a DEMAND_GEN ad group). **Formats:** - **multi_asset** (default) โ€” image ad: marketing_images (landscape 1.91:1), square_marketing_images (1:1), portrait_marketing_images (4:5), logo. Google mixes them. - **video_responsive** โ€” video ad: youtube_video_ids (1-5) + logo. long_headlines recommended. **Creative bounds (Demand Gen):** headlines 1-5 (max 40 chars), descriptions 1-5 (max 90 chars), business_name max 25, long_headlines max 90 chars. **Assets:** provide NEW images via marketing_images/etc. as [{"url": "...", "name": "..."}], OR reuse existing asset resource names via existing_images, OR a logo by logo_asset_id (from discover_existing_assets). Videos are referenced by youtube_video_ids. **Parameters:** - ad_group_id (REQUIRED) โ€” existing DEMAND_GEN ad group - ad_format, final_url (REQUIRED), business_name (REQUIRED), headlines (REQUIRED), descriptions (REQUIRED) - long_headlines, call_to_action, image/video/logo sources (optional per format) The ad is created ENABLED; delivery is still gated by the ad group + campaign status. **Execution time:** 10-20 seconds (assets are uploaded then the ad is created in one atomic mutate).

Request body

All tool arguments are wrapped in an arguments object.

FieldTypeDescription
ad_group_idstring requiredThe EXISTING Demand Gen ad group ID to add the ad to. Get from get_campaign_structure (must be a DEMAND_GEN ad group).
ad_formatstring optionalAd format: 'multi_asset' (image ads, default) or 'video_responsive' (video ads). default: "multi_asset"
final_urlstring requiredLanding page URL where users go after clicking the ad. **REQUIRED โ€” ask the user for their website URL before calling this tool. Do NOT guess.** Must be HTTPS and reachable. Example: 'https://example.com/product'.
business_namestring requiredBusiness name, max 25 characters.
headlinesarray requiredMUST BE JSON ARRAY: 1-5 headlines, each max 40 characters.
descriptionsarray requiredMUST BE JSON ARRAY: 1-5 descriptions, each max 90 characters.
long_headlinesarray optionalOptional 1-5 long headlines, max 90 chars each. Used by video_responsive format.
call_to_actionstring optionalCTA label: LEARN_MORE, SHOP_NOW, SIGN_UP, SUBSCRIBE, DOWNLOAD, BOOK_NOW, etc.
marketing_imagesarray optionalLandscape images (1.91:1) as [{"url": "...", "name": "img1"}].
square_marketing_imagesarray optionalSquare images (1:1) as [{"url": "...", "name": "img1"}].
portrait_marketing_imagesarray optionalPortrait images (4:5) as [{"url": "...", "name": "img1"}].
existing_imagesobject optionalExisting image asset resource names to reuse. Keys: marketing_images_landscape, marketing_images_square, marketing_images_portrait, logos_square.
youtube_video_idsarray optionalYouTube video IDs for video_responsive format. 1-5 videos.
logo_asset_idstring optionalLogo image asset ID from discover_existing_assets.
logo_imagesarray optionalNew logo images as [{"url": "...", "name": "logo1"}].
customer_idstring optionalGoogle Ads customer ID. Required for multi-account users. Get from get_connections_status.

Example request

{
  "arguments": {
    "ad_group_id": "string",
    "final_url": "https://example.com",
    "business_name": "string",
    "headlines": [
      "string"
    ],
    "descriptions": [
      "string"
    ],
    "ad_format": "multi_asset",
    "long_headlines": [
      "string"
    ],
    "call_to_action": "string",
    "marketing_images": [
      {}
    ],
    "square_marketing_images": [
      {}
    ],
    "portrait_marketing_images": [
      {}
    ]
  }
}

Example responses

200 โ€” Success

{
  "success": true,
  "data": {
    "text": "(tool-specific textual output for add_demandgen_ad)",
    "quota": {
      "used": 42,
      "limit": 150,
      "tier": "plus",
      "period_end": "2026-05-01"
    }
  },
  "tool": "add_demandgen_ad"
}

400 โ€” Tool-level error (bad arguments / multi-account selection)

{
  "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": "add_demandgen_ad"
}

402 โ€” Quota exhausted

{
  "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": "add_demandgen_ad",
  "quota": {
    "used": 150,
    "limit": 150,
    "tier": "plus",
    "period_end": "2026-05-01",
    "upgrade_url": "https://adspirer.ai"
  }
}

Try it live


Adspirer REST API โ€” get an API key at adspirer.ai/keys ยท adspirer.ai