API Reference โบ Google Ads โบ discover_existing_assets
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
Authorization: Bearer sk_live_... โ your Adspirer API key (required)
Content-Type: application/json (required)
Idempotency-Key: <uuid> โ recommended for write operations to make retries safe
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.
| Field | Type | Description |
target_domain | string optional | Optional 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_types | array optional | Asset types to discover. Default: all types. default: ["images", "sitelinks", "callouts", "structured_snippets"] |
customer_id | string optional | Google 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