Master Google Ads API v22 with AI-powered automation. Learn view-based conversions, AI Max reporting, and generative asset creation. Complete implementation guide with production-ready code examples for October 2025.
What's New in Google Ads API v22
Released on October 15, 2025, Google Ads API v22 introduces significant AI-powered capabilities, enhanced reporting, and improved automation features. This update represents Google's push toward AI-driven advertising and greater transparency across campaign types.
Major Features in v22
- AssetGenerationService (Beta): Generate text and image assets using generative AI based on URLs, prompts, keywords, and campaign context
- View-Based Conversions: Track engaged-view conversions for Display and Video campaigns with improved attribution
-
AI Max Reporting: New
ai_max_search_term_ad_combination_viewprovides detailed performance data for AI Max for Search campaigns -
Performance Max Enhancements: Image enhancement, extraction automation, and enhanced reporting with
feed_typesfield -
Targetless Bidding for App Campaigns: New
OPTIMIZE_IN_APP_CONVERSIONS_WITHOUT_TARGET_CPAandOPTIMIZE_TOTAL_VALUE_WITHOUT_TARGET_ROASgoals - Smart Bidding Diversity Metrics: Target ROAS strategies on Search can retrieve time-segmented diversity metrics
These updates make Google Ads API v22 the most AI-focused release to date, enabling advertisers to automate asset creation, gain deeper insights into AI-driven campaigns, and optimize performance with enhanced bidding strategies.
View-Based Conversions: Complete Setup Guide
View-based conversions (also called engaged-view conversions) allow you to track conversions from users who viewed your Display or Video ads but didn't click. This provides more complete attribution for upper-funnel campaigns.
What Are View-Based Conversions?
View-based conversions count when a user:
- Views your video ad for at least 10 seconds
- Views your Display ad (meets Engaged View requirements)
- Converts within the attribution window without clicking
- Has not clicked any of your ads more recently
Step 1: Enable View-Based Conversions
Configure view-based conversion tracking via the API:
from google.ads.googleads.client import GoogleAdsClient
def enable_view_conversions(client, customer_id, conversion_action_id):
"""Enable view-based conversions for a conversion action"""
conversion_action_service = client.get_service("ConversionActionService")
conversion_action_operation = client.get_type("ConversionActionOperation")
conversion_action = conversion_action_operation.update
conversion_action.resource_name = (
f"customers/{customer_id}/conversionActions/{conversion_action_id}"
)
# Enable view-through conversion tracking
conversion_action.view_through_lookback_window_days = 30
conversion_action.include_in_conversions_metric = True
# Set counting type (ONE_PER_CLICK or MANY_PER_CLICK)
conversion_action.counting_type = client.enums.ConversionActionCountingTypeEnum.ONE_PER_CLICK
# Update field mask
field_mask = client.field_mask.build(
conversion_action_operation.update,
conversion_action
)
conversion_action_operation.update_mask.CopyFrom(field_mask)
# Execute the update
response = conversion_action_service.mutate_conversion_actions(
customer_id=customer_id,
operations=[conversion_action_operation]
)
print(f"Updated conversion action: {response.results[0].resource_name}")
return response
Step 2: Report on View-Based Conversions
def get_view_conversion_report(client, customer_id, date_range="LAST_30_DAYS"):
"""Generate report with view-based conversion data"""
ga_service = client.get_service("GoogleAdsService")
query = f"""
SELECT
campaign.name,
campaign.id,
metrics.conversions,
metrics.view_through_conversions,
metrics.all_conversions,
metrics.cost_micros,
metrics.impressions,
metrics.video_views,
segments.conversion_action_name,
segments.date
FROM campaign
WHERE segments.date DURING {date_range}
AND campaign.advertising_channel_type IN ('DISPLAY', 'VIDEO')
AND campaign.status = 'ENABLED'
ORDER BY metrics.view_through_conversions DESC
"""
response = ga_service.search_stream(customer_id=customer_id, query=query)
results = []
for batch in response:
for row in batch.results:
results.append({
'campaign': row.campaign.name,
'campaign_id': row.campaign.id,
'click_conversions': row.metrics.conversions,
'view_conversions': row.metrics.view_through_conversions,
'all_conversions': row.metrics.all_conversions,
'cost': row.metrics.cost_micros / 1_000_000,
'impressions': row.metrics.impressions,
'video_views': row.metrics.video_views,
'conversion_action': row.segments.conversion_action_name,
'date': row.segments.date,
'view_conversion_rate': (
row.metrics.view_through_conversions / row.metrics.impressions
if row.metrics.impressions > 0 else 0
)
})
return results
Best Practices
- Use 30-day attribution window for Display
- Use 7-14 day window for Video
- Exclude view conversions from automated bidding
- Monitor view-to-click conversion ratio
Common Pitfalls
- Including views in Smart Bidding too early
- Setting attribution window too long
- Not distinguishing view vs click conversions
- Forgetting to exclude search remarketing
AI Max Reporting: Access Enhanced Insights
Google Ads API v22 introduces the ai_max_search_term_ad_combination_view report, providing unprecedented transparency into AI Max for Search campaign performance. This report shows how different combinations of search terms, headlines, and landing pages perform.
What AI Max Reporting Reveals
- Performance metrics for search term + headline + landing page combinations
- Which AI-generated headlines perform best for specific queries
- Landing page effectiveness by search intent and user segment
- Real conversion data to optimize AI Max campaign structure
- Impression share and quality metrics at the combination level
Query AI Max Performance Data
def get_ai_max_performance(client, customer_id, campaign_id):
"""Query AI Max search term ad combination performance"""
ga_service = client.get_service("GoogleAdsService")
query = f"""
SELECT
ai_max_search_term_ad_combination_view.search_term,
ai_max_search_term_ad_combination_view.headline,
ai_max_search_term_ad_combination_view.landing_page_url,
campaign.name,
ad_group.name,
metrics.impressions,
metrics.clicks,
metrics.conversions,
metrics.cost_micros,
metrics.average_cpc,
metrics.conversion_rate,
metrics.cost_per_conversion,
segments.date
FROM ai_max_search_term_ad_combination_view
WHERE campaign.id = {campaign_id}
AND segments.date DURING LAST_30_DAYS
AND metrics.impressions > 100
ORDER BY metrics.conversions DESC
LIMIT 100
"""
response = ga_service.search_stream(customer_id=customer_id, query=query)
combinations = []
for batch in response:
for row in batch.results:
view = row.ai_max_search_term_ad_combination_view
combinations.append({
'search_term': view.search_term,
'headline': view.headline,
'landing_page': view.landing_page_url,
'campaign': row.campaign.name,
'ad_group': row.ad_group.name,
'impressions': row.metrics.impressions,
'clicks': row.metrics.clicks,
'conversions': row.metrics.conversions,
'cost': row.metrics.cost_micros / 1_000_000,
'avg_cpc': row.metrics.average_cpc / 1_000_000,
'conversion_rate': row.metrics.conversion_rate,
'cpa': row.metrics.cost_per_conversion,
'date': row.segments.date
})
return combinations
AI-Powered Asset Generation Service
The new AssetGenerationService (beta) in API v22 allows you to generate text and image assets automatically using generative AI. This feature can create headlines, descriptions, and images based on your inputs like URLs, prompts, keywords, and existing campaign context.
Text Asset Generation
Generate headlines and descriptions from various inputs:
def generate_text_assets(client, customer_id, final_url, keywords=None, prompt=None):
"""Generate ad headlines and descriptions using AI"""
asset_generation_service = client.get_service("AssetGenerationService")
request = client.get_type("GenerateTextAssetsRequest")
request.customer_id = customer_id
request.final_url = final_url
if keywords:
request.keywords.extend(keywords)
if prompt:
request.prompt = prompt
request.number_of_headlines = 10
request.number_of_descriptions = 5
request.headline_length_preference = "SHORT"
response = asset_generation_service.generate_text_assets(request=request)
generated_assets = {
'headlines': [],
'descriptions': []
}
for headline in response.headlines:
generated_assets['headlines'].append({
'text': headline.text,
'length': len(headline.text),
'confidence_score': headline.confidence_score
})
for description in response.descriptions:
generated_assets['descriptions'].append({
'text': description.text,
'length': len(description.text),
'confidence_score': description.confidence_score
})
return generated_assets
Image Asset Generation
Generate images from existing assets or create new ones:
def generate_image_assets(client, customer_id, final_url=None, existing_images=None, prompt=None):
"""Generate image assets using generative AI"""
asset_generation_service = client.get_service("AssetGenerationService")
request = client.get_type("GenerateImageAssetsRequest")
request.customer_id = customer_id
if final_url:
request.final_url = final_url
if existing_images:
for image_url in existing_images:
request.existing_image_urls.append(image_url)
if prompt:
request.prompt = prompt
request.aspect_ratio = "SQUARE"
request.number_of_images = 5
response = asset_generation_service.generate_image_assets(request=request)
generated_images = []
for image in response.images:
generated_images.append({
'url': image.url,
'asset_id': image.asset_id,
'width': image.width,
'height': image.height,
'size_bytes': image.size_bytes
})
return generated_images
Best Practices for AI Asset Generation
Input Quality:
- Use high-quality landing pages
- Provide specific keywords
- Write clear prompts
- Include brand guidelines
Review & Test:
- Always review generated assets
- A/B test AI vs human-created
- Monitor confidence scores
- Iterate based on performance
Integration:
- Automate for large catalogs
- Combine with existing assets
- Use for seasonal variations
- Scale winning combinations
Performance Max Campaign Enhancements
Google Ads API v22 brings significant improvements to Performance Max campaigns, including image enhancement automation, image extraction features, and enhanced reporting capabilities with new segments and the feed_types field.
Image Enhancement
Automatically enhance product images for better performance:
- Background removal and replacement
- Automatic cropping and resizing
- Quality improvements and filters
- Format optimization for each placement
Enhanced Reporting
New segments and fields for better insights:
- feed_types field for asset source tracking
- New performance segments by asset group
- Detailed conversion path reporting
- Enhanced audience insights
Query Performance Max with New Fields
def get_pmax_performance(client, customer_id):
"""Query Performance Max campaigns with enhanced reporting"""
ga_service = client.get_service("GoogleAdsService")
query = """
SELECT
campaign.name,
campaign.id,
asset_group.name,
asset_group.id,
asset_group_asset.feed_types,
metrics.impressions,
metrics.clicks,
metrics.conversions,
metrics.all_conversions,
metrics.cost_micros,
metrics.conversion_value,
segments.asset_interaction_target.asset,
segments.asset_interaction_target.interaction_on_this_asset,
segments.date
FROM asset_group_asset
WHERE campaign.advertising_channel_type = 'PERFORMANCE_MAX'
AND segments.date DURING LAST_30_DAYS
AND campaign.status = 'ENABLED'
ORDER BY metrics.conversions DESC
"""
response = ga_service.search_stream(customer_id=customer_id, query=query)
performance_by_feed = {}
for batch in response:
for row in batch.results:
feed_types = row.asset_group_asset.feed_types
for feed_type in feed_types:
if feed_type not in performance_by_feed:
performance_by_feed[feed_type] = {
'impressions': 0,
'clicks': 0,
'conversions': 0,
'cost': 0,
'value': 0
}
performance_by_feed[feed_type]['impressions'] += row.metrics.impressions
performance_by_feed[feed_type]['clicks'] += row.metrics.clicks
performance_by_feed[feed_type]['conversions'] += row.metrics.conversions
performance_by_feed[feed_type]['cost'] += row.metrics.cost_micros / 1_000_000
performance_by_feed[feed_type]['value'] += row.metrics.conversion_value
for feed_type, data in performance_by_feed.items():
data['roas'] = data['value'] / data['cost'] if data['cost'] > 0 else 0
data['cpa'] = data['cost'] / data['conversions'] if data['conversions'] > 0 else 0
return performance_by_feed
Smart Bidding & Targetless Bidding
API v22 introduces targetless bidding for App campaigns, allowing rapid scaling without specific CPA or ROAS targets. Additionally, Target ROAS strategies on Search campaigns now support time-segmented diversity metrics for better performance analysis.
Targetless Bidding for App Campaigns
Perfect for rapid scaling when you don't have enough conversion data for target-based bidding:
def setup_targetless_bidding(client, customer_id, campaign_id, goal_type):
"""Configure targetless bidding for rapid scaling"""
campaign_service = client.get_service("CampaignService")
campaign_operation = client.get_type("CampaignOperation")
campaign = campaign_operation.update
campaign.resource_name = f"customers/{customer_id}/campaigns/{campaign_id}"
if goal_type == "CONVERSIONS":
campaign.bidding_strategy_type = (
client.enums.BiddingStrategyTypeEnum.OPTIMIZE_IN_APP_CONVERSIONS_WITHOUT_TARGET_CPA
)
elif goal_type == "VALUE":
campaign.bidding_strategy_type = (
client.enums.BiddingStrategyTypeEnum.OPTIMIZE_TOTAL_VALUE_WITHOUT_TARGET_ROAS
)
field_mask = client.field_mask.build(
campaign_operation.update,
campaign
)
campaign_operation.update_mask.CopyFrom(field_mask)
response = campaign_service.mutate_campaigns(
customer_id=customer_id,
operations=[campaign_operation]
)
print(f"Updated campaign to targetless bidding: {response.results[0].resource_name}")
return response
Best Practices & API Limits
Rate Limits & Quotas
- Daily operations: Unlimited (Standard), 15,000 (Basic)
- Batch size: Maximum 10,000 operations per request
- Requests per second: Throttle to 10-20 RPS
- Asset generation: Beta limits may apply
- Concurrent requests: Limit to 10 parallel
Optimization Tips
- Use search_stream() for large datasets
- Batch mutations to reduce API calls
- Cache AI-generated assets for reuse
- Implement exponential backoff for retries
- Monitor API quota usage proactively
Common Pitfalls with v22 Features
- AI Asset Generation: Always review generated assets before deployment; confidence scores don't guarantee brand alignment
- View-Based Conversions: Don't include in Smart Bidding until you have sufficient data (30+ days)
- Targetless Bidding: Monitor closely during first 2 weeks; costs can spike during learning phase
- AI Max Reporting: Data may be sampled for high-traffic campaigns; use date ranges wisely
Migration Guide: Upgrading to API v22
Step 1: Update Client Libraries
Python:
pip install --upgrade google-ads==22.0.0
Node.js:
npm install google-ads-api@22.0.0
Step 2: Update API Version in Requests
from google.ads.googleads.client import GoogleAdsClient
client = GoogleAdsClient.load_from_storage("google-ads.yaml")
print(f"Using Google Ads API version: {client.get_service('GoogleAdsService')._version}")
Step 3: Test New Features Incrementally
- Week 1: Test AI asset generation on non-critical campaigns
- Week 2: Enable view-based conversions tracking and monitor
- Week 3: Implement AI Max reporting queries
- Week 4: Roll out to production campaigns
Breaking Changes & Deprecations
While v22 maintains backward compatibility with most features, be aware of these changes:
- Some older campaign types may have limited support for new features
- AssetGenerationService is beta; API surface may change
- View-based conversions require updated conversion tracking tags
- AI Max reporting requires AI Max for Search campaigns (not all accounts)
Real-World Use Cases
Case Study: E-commerce Retailer - AI Asset Automation
A fashion retailer with 5,000+ SKUs automated asset creation using the AssetGenerationService:
- Challenge: Creating unique ad copy for thousands of products manually
- Solution: AI-generated headlines and descriptions from product pages
- Results: 85% time savings, 23% higher CTR vs manual ads
Case Study: Mobile App - Targetless Bidding Success
A gaming app used targetless bidding to rapidly scale user acquisition:
- Challenge: Insufficient conversion data for target-based bidding
- Solution: OPTIMIZE_IN_APP_CONVERSIONS_WITHOUT_TARGET_CPA
- Results: 3x install volume in 14 days, 18% lower CPI
Case Study: B2B SaaS - View-Based Conversion Tracking
A SaaS company improved attribution for their video campaigns:
- Challenge: Undervaluing YouTube campaigns due to click-only attribution
- Solution: Enabled view-based conversions with 7-day window
- Results: 42% increase in attributed conversions, 2.1x ROAS
Frequently Asked Questions
What is Google Ads API v22 and when was it released?
Google Ads API v22 was released on October 15, 2025. It introduces major AI-powered capabilities including AssetGenerationService (beta) for generating text and image assets, view-based conversions tracking for Display and Video campaigns, AI Max reporting with detailed performance insights, Performance Max enhancements, and targetless bidding for App campaigns. This is Google's most AI-focused API release to date.
How do I enable view-based conversions in Google Ads API v22?
Enable view-based conversions by setting the view_through_lookback_window_days field on your ConversionAction resource. Use a 30-day attribution window for Display campaigns and 7-14 days for Video campaigns. Set include_in_conversions_metric to true and choose a counting type (ONE_PER_CLICK or MANY_PER_CLICK). Wait at least 30 days after enabling before including view conversions in Smart Bidding to ensure sufficient data collection.
What is the AssetGenerationService and how does it work?
The AssetGenerationService (beta) in API v22 uses generative AI to automatically create text and image assets for your campaigns. You provide inputs like a final URL, keywords, or a freeform prompt, and the service generates optimized headlines, descriptions, and images. It can create up to 15 headlines and 4 descriptions per request, each with a confidence score. The service is free during beta with rate limits applied.
How does AI Max reporting differ from standard campaign reporting?
AI Max reporting uses the new ai_max_search_term_ad_combination_view resource to provide detailed performance metrics for specific combinations of search terms, headlines, and landing pages in AI Max for Search campaigns. This granular data shows which AI-generated headlines perform best for specific queries and which landing pages are most effective by search intent, enabling unprecedented optimization of AI-driven campaigns.
What is targetless bidding for App campaigns?
Targetless bidding allows App campaigns to optimize for conversions or total value without requiring specific CPA or ROAS targets. The two options are OPTIMIZE_IN_APP_CONVERSIONS_WITHOUT_TARGET_CPA and OPTIMIZE_TOTAL_VALUE_WITHOUT_TARGET_ROAS. This is ideal for new apps with limited conversion data that need to scale rapidly. Monitor closely during the first 2 weeks as costs can spike during the learning phase.
What are the API rate limits for Google Ads API v22 features?
Standard access accounts have unlimited daily operations; Basic access accounts have 15,000. Maximum batch size is 10,000 operations per request. Throttle to 10-20 requests per second and limit concurrent requests to 10. AssetGenerationService (beta) may have additional rate limits. Use search_stream() for large datasets, batch mutations to reduce API calls, and implement exponential backoff for retries to stay within quotas.
Top comments (0)