discover_existing_assets

Google Ads Read

๐Ÿ” Discover existing assets in the Google Ads account (images, sitelinks, callouts, structured snippets)

Endpoint

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

Headers

Description

๐Ÿ” Discover existing assets in the Google Ads account (images, sitelinks, callouts, structured snippets). **Phase 0: Asset Discovery** - Read-only tool, safe to call anytime. ๐Ÿ”ด **MANDATORY WORKFLOW - ALWAYS DO THIS FIRST:** BEFORE creating ANY Performance Max campaign, you MUST: 1. Call this tool: discover_existing_assets(target_domain="<user's domain>") 2. Show the user what was found (images, sitelinks) 3. Ask: "Would you like to reuse these assets or upload new ones?" 4. Based on answer: - Reuse โ†’ Use existing_image_ids in create_pmax_campaign - Upload new โ†’ Use validate_and_prepare_assets โ†’ asset_bundle_id - Mix both โ†’ Use both parameters (hybrid mode) ๐Ÿšซ **NEVER create PMAX without discovering assets first** (unless user explicitly says "skip discovery, upload new") **What This Tool Does:** - Queries Google Ads Asset Library for existing validated assets - Uses SMART 2-TIER FILTERING to show only reliable assets - Filters out invalid/test data automatically - Returns assets that were successfully attached to previous campaigns **2-Tier Smart Discovery:** **Tier 1: Campaign-Validated Assets (High Confidence)** โœ… - Assets currently attached to ENABLED, PAUSED, or REMOVED campaigns - These have been validated by Google and won't fail - Includes domain filtering for sitelinks - Best option for reuse **Tier 2: No Validated Assets (Ask User)** โš ๏ธ - Account has no suitable assets in campaigns - Recommends uploading fresh assets or website research - Safer than using orphaned assets from library **Parameters:** - target_domain: Optional domain to filter sitelinks (e.g., "rooterhero.com") - **CRITICAL for multi-domain accounts!** Google rejects wrong-domain sitelinks - **Extract the base domain** from campaign URL (just the domain part) - Examples: "https://www.rooterhero.com/services" โ†’ "rooterhero.com", "sahaayak.life" โ†’ "sahaayak.life" - Only sitelinks matching this domain will be returned - Prevents Google API errors for domain mismatches **Returns:** - images: List of validated images (landscape, square, portrait, logos) - sitelinks: List of validated sitelinks (filtered by domain if provided) - callouts: List of validated callouts - structured_snippets: List of validated structured snippets - recommendation: Smart guidance on whether to reuse or upload new **Example ChatGPT Flow:** User: "Create a campaign for rooterhero.com" (or "https://www.rooterhero.com/services") Step 1: Extract base domain โ†’ "rooterhero.com" Step 2: Call discover_existing_assets(target_domain="rooterhero.com") If Tier 1 (validated assets found): ChatGPT: "I found 8 sitelinks and 11 images from your previous Rooter Hero campaigns. These were validated by Google. Would you like to reuse them, or upload fresh assets?" User: "Reuse them" โ†’ Use those assets in Phase 1 User: "Upload new" โ†’ Follow current upload flow If Tier 2 (no validated assets): ChatGPT: "No validated assets found for rooterhero.com in your campaigns. Options: 1. Upload fresh images/sitelinks 2. Let me research rooterhero.com and suggest sitelinks 3. Create campaign without extensions" **When to Call:** - BEFORE creating Search campaigns (to discover sitelinks, callouts, snippets) - BEFORE creating PMAX campaigns (to discover images) - When user asks "What assets do I have?" - When user wants to reuse existing assets **When NOT to Call:** - User explicitly says "I'll upload new images" - User wants to create minimal campaign without extensions **Execution Time:** 1-3 seconds (read-only query) **Authentication:** Required (MCP OAuth 2.1) **Note:** This is Phase 0 - discovery only. Phase 1 will enable reusing discovered assets in campaigns.

Request body

All tool arguments are wrapped in an arguments object.

FieldTypeDescription
target_domainstring optionalOptional domain to filter sitelinks. **Extract the base domain from the campaign URL.** Examples: 'https://www.rooterhero.com/services' โ†’ 'rooterhero.com', 'sahaayak.life' โ†’ 'sahaayak.life'. Only sitelinks matching this domain will be returned. Critical: Google rejects wrong-domain sitelinks.
asset_typesarray optionalAsset types to discover. Default: all types. default: ["images", "sitelinks", "callouts", "structured_snippets"]
customer_idstring optionalGoogle Ads customer ID. Required for multi-account users. Get from list_connected_accounts.

Example request

{
  "arguments": {
    "asset_types": [
      "images",
      "sitelinks",
      "callouts",
      "structured_snippets"
    ]
  }
}

Example responses

200 โ€” Success

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

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": "discover_existing_assets"
}

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": "discover_existing_assets",
  "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