Google Ads Query Language (GAQL) Reference
Complete reference for GAQL syntax, resource types, fields, operators, date macros, and common query patterns for Google Ads reporting and optimization.
Full docs: https://cogny.com/docs/gaql-reference
Usage
/gaql-reference # Show full syntax overview
/gaql-reference search terms # Search terms report pattern
/gaql-reference quality score # Quality Score analysis query
/gaql-reference impression share # Budget & impression share query
/gaql-reference geographic # Geographic performance query
/gaql-reference change history # Change history audit query
Instructions
You are a Google Ads Query Language (GAQL) expert. Use this reference to help users write correct GAQL queries, understand resource types, choose the right fields, and avoid common pitfalls.
When the user asks a question, find the relevant section below and provide precise, actionable answers with ready-to-use GAQL examples.
If the user provides a specific topic as an argument, focus on that area. Otherwise, provide an overview of the GAQL syntax and available resources.
When the user has Cogny MCP tools available, prefer using mcp__cogny__google_ads__tool_execute_gaql to run queries directly and mcp__cogny__google_ads__tool_get_gaql_doc or mcp__cogny__google_ads__tool_get_reporting_view_doc for API documentation lookups.
Syntax
Formal Grammar
query = SELECT field_list FROM resource_name
[ WHERE condition_list ]
[ ORDER BY field_name [ ASC | DESC ] ]
[ LIMIT positive_integer ]
[ PARAMETERS param_list ]
field_list = field_name { , field_name }
condition_list = condition { AND condition }
condition = field_name operator value
param_list = param_name = param_value { , param_name = param_value }
Clauses
| Clause |
Required |
Description |
SELECT |
Yes |
Fields to return (resource fields, metrics, segments) |
FROM |
Yes |
Single resource type to query |
WHERE |
No |
Filter conditions joined by AND (no OR support) |
ORDER BY |
No |
Sort by one field, ASC or DESC |
LIMIT |
No |
Maximum number of rows to return |
PARAMETERS |
No |
Query-level parameters (e.g., include_drafts = true) |
Example
SELECT
campaign.name,
metrics.impressions,
metrics.clicks,
metrics.cost_micros
FROM campaign
WHERE campaign.status = 'ENABLED'
AND segments.date DURING LAST_30_DAYS
ORDER BY metrics.impressions DESC
LIMIT 50
Resource Types (FROM Clause)
Campaign Management
| Resource |
Description |
campaign |
Campaign settings, status, bidding, budget |
campaign_budget |
Shared and campaign-level budgets |
campaign_criterion |
Campaign-level targeting criteria |
campaign_bid_modifier |
Bid adjustments at campaign level |
bidding_strategy |
Portfolio bidding strategies |
Ad Groups & Ads
| Resource |
Description |
ad_group |
Ad group settings, status, targeting |
ad_group_ad |
Ads within ad groups (RSA, ETA, etc.) |
ad_group_ad_asset_view |
Asset-level performance for responsive ads |
ad_group_criterion |
Keywords, audiences, and other criteria |
ad_group_bid_modifier |
Bid adjustments at ad group level |
Performance Views
| Resource |
Description |
keyword_view |
Keyword-level performance metrics |
search_term_view |
Actual search queries that triggered ads |
landing_page_view |
Landing page performance |
geographic_view |
Performance by geographic location |
location_view |
Performance by targeted/excluded location |
age_range_view |
Performance by age range demographic |
gender_view |
Performance by gender demographic |
user_location_view |
Performance by user's physical location |
display_keyword_view |
Display network keyword performance |
topic_view |
Display/video topic targeting performance |
managed_placement_view |
Managed placement performance |
Conversion & Attribution
| Resource |
Description |
conversion_action |
Conversion action configuration |
customer_conversion_goal |
Conversion goals and optimization settings |
Account & Extensions
| Resource |
Description |
customer |
Account-level settings |
asset |
Account assets (sitelinks, callouts, images) |
asset_group |
Performance Max asset groups |
asset_group_asset |
Assets within asset groups |
Change History
| Resource |
Description |
change_status |
Recent changes to account entities |
change_event |
Detailed change history with old/new values |
Common Fields
Campaign Fields
| Field |
Type |
Description |
campaign.id |
INT64 |
Unique campaign ID |
campaign.name |
STRING |
Campaign name |
campaign.status |
ENUM |
ENABLED, PAUSED, REMOVED |
campaign.advertising_channel_type |
ENUM |
SEARCH, DISPLAY, SHOPPING, VIDEO, PERFORMANCE_MAX |
campaign.bidding_strategy_type |
ENUM |
TARGET_CPA, TARGET_ROAS, MAXIMIZE_CONVERSIONS, MANUAL_CPC, etc. |
campaign.campaign_budget |
RESOURCE |
Budget resource name |
campaign.start_date |
DATE |
Campaign start date |
campaign.end_date |
DATE |
Campaign end date |
campaign.serving_status |
ENUM |
SERVING, NONE, ENDED, PENDING, SUSPENDED |
campaign.target_cpa.target_cpa_micros |
INT64 |
Target CPA in micros |
campaign.target_roas.target_roas |
DOUBLE |
Target ROAS as a ratio |
Ad Group Fields
| Field |
Type |
Description |
ad_group.id |
INT64 |
Unique ad group ID |
ad_group.name |
STRING |
Ad group name |
ad_group.status |
ENUM |
ENABLED, PAUSED, REMOVED |
ad_group.type |
ENUM |
SEARCH_STANDARD, DISPLAY_STANDARD, SHOPPING_PRODUCT_ADS, etc. |
ad_group.cpc_bid_micros |
INT64 |
Default CPC bid in micros |
ad_group.target_cpa_micros |
INT64 |
Ad group-level target CPA |
Ad Fields
| Field |
Type |
Description |
ad_group_ad.ad.id |
INT64 |
Unique ad ID |
ad_group_ad.ad.type |
ENUM |
RESPONSIVE_SEARCH_AD, EXPANDED_TEXT_AD, etc. |
ad_group_ad.ad.final_urls |
STRING (repeated) |
Landing page URLs |
ad_group_ad.status |
ENUM |
ENABLED, PAUSED, REMOVED |
ad_group_ad.ad.responsive_search_ad.headlines |
MESSAGE (repeated) |
RSA headline assets |
ad_group_ad.ad.responsive_search_ad.descriptions |
MESSAGE (repeated) |
RSA description assets |
ad_group_ad.policy_summary.approval_status |
ENUM |
APPROVED, DISAPPROVED, etc. |
Keyword & Criterion Fields
| Field |
Type |
Description |
ad_group_criterion.criterion_id |
INT64 |
Criterion ID |
ad_group_criterion.keyword.text |
STRING |
Keyword text |
ad_group_criterion.keyword.match_type |
ENUM |
BROAD, PHRASE, EXACT |
ad_group_criterion.status |
ENUM |
ENABLED, PAUSED, REMOVED |
ad_group_criterion.quality_info.quality_score |
INT32 |
Quality Score (1-10) |
ad_group_criterion.quality_info.creative_quality_score |
ENUM |
BELOW_AVERAGE, AVERAGE, ABOVE_AVERAGE |
ad_group_criterion.quality_info.post_click_quality_score |
ENUM |
Landing page experience |
ad_group_criterion.quality_info.search_predicted_ctr |
ENUM |
Expected CTR |
ad_group_criterion.effective_cpc_bid_micros |
INT64 |
Effective CPC bid |
ad_group_criterion.position_estimates.first_page_cpc_micros |
INT64 |
Estimated first page CPC |
Search Term Fields
| Field |
Type |
Description |
search_term_view.search_term |
STRING |
Actual user search query |
search_term_view.status |
ENUM |
ADDED, EXCLUDED, ADDED_EXCLUDED, NONE |
Metrics
| Field |
Type |
Description |
metrics.impressions |
INT64 |
Number of impressions |
metrics.clicks |
INT64 |
Number of clicks |
metrics.cost_micros |
INT64 |
Cost in micros (divide by 1,000,000) |
metrics.ctr |
DOUBLE |
Click-through rate |
metrics.average_cpc |
DOUBLE |
Average CPC in micros |
metrics.average_cpm |
DOUBLE |
Average CPM in micros |
metrics.conversions |
DOUBLE |
Conversions |
metrics.conversions_value |
DOUBLE |
Total conversion value |
metrics.cost_per_conversion |
DOUBLE |
Cost per conversion in micros |
metrics.all_conversions |
DOUBLE |
All conversions (including cross-device) |
metrics.all_conversions_value |
DOUBLE |
All conversions value |
metrics.view_through_conversions |
INT64 |
View-through conversions |
metrics.search_impression_share |
DOUBLE |
Search impression share (0.0-1.0) |
metrics.search_top_impression_share |
DOUBLE |
Top impression share |
metrics.search_absolute_top_impression_share |
DOUBLE |
Absolute top impression share |
metrics.search_budget_lost_impression_share |
DOUBLE |
IS lost to budget |
metrics.search_rank_lost_impression_share |
DOUBLE |
IS lost to rank |
metrics.interaction_rate |
DOUBLE |
Interaction rate |
metrics.interactions |
INT64 |
Interactions |
metrics.video_views |
INT64 |
Video views |
metrics.video_view_rate |
DOUBLE |
Video view rate |
metrics.invalid_clicks |
INT64 |
Invalid clicks filtered by Google |
Segments
| Field |
Type |
Description |
segments.date |
DATE |
Date (YYYY-MM-DD) |
segments.day_of_week |
ENUM |
MONDAY through SUNDAY |
segments.month |
DATE |
First day of the month |
segments.quarter |
DATE |
First day of the quarter |
segments.year |
INT32 |
Year |
segments.hour |
INT32 |
Hour of day (0-23) |
segments.device |
ENUM |
DESKTOP, MOBILE, TABLET, OTHER |
segments.ad_network_type |
ENUM |
SEARCH, SEARCH_PARTNERS, CONTENT, YOUTUBE_SEARCH, YOUTUBE_WATCH |
segments.slot |
ENUM |
TOP, OTHER |
segments.conversion_action |
RESOURCE |
Conversion action resource name |
segments.conversion_action_name |
STRING |
Conversion action name |
segments.conversion_action_category |
ENUM |
Conversion action category |
segments.click_type |
ENUM |
URL_CLICKS, CALLS, SITELINKS, etc. |
segments.keyword.info.text |
STRING |
Keyword text (in search_term_view) |
segments.keyword.info.match_type |
ENUM |
Keyword match type |
WHERE Clause Operators
Comparison Operators
| Operator |
Example |
= |
campaign.status = 'ENABLED' |
!= |
campaign.status != 'REMOVED' |
> |
metrics.impressions > 100 |
< |
metrics.ctr < 0.02 |
>= |
metrics.clicks >= 10 |
<= |
metrics.cost_micros <= 5000000 |
Set Operators
| Operator |
Example |
IN |
campaign.status IN ('ENABLED', 'PAUSED') |
NOT IN |
campaign.advertising_channel_type NOT IN ('VIDEO', 'DISPLAY') |
CONTAINS ANY |
campaign.labels CONTAINS ANY ('customers/123/labels/456') |
CONTAINS ALL |
campaign.labels CONTAINS ALL ('..label1..', '..label2..') |
CONTAINS NONE |
campaign.labels CONTAINS NONE ('customers/123/labels/456') |
String Operators
| Operator |
Example |
LIKE |
campaign.name LIKE '%Brand%' |
NOT LIKE |
campaign.name NOT LIKE '%Test%' |
Null Checks
| Operator |
Example |
IS NULL |
ad_group_criterion.quality_info.quality_score IS NULL |
IS NOT NULL |
ad_group_criterion.quality_info.quality_score IS NOT NULL |
Range Operators
| Operator |
Example |
BETWEEN |
segments.date BETWEEN '2025-01-01' AND '2025-01-31' |
DURING |
segments.date DURING LAST_30_DAYS |
Date Macros (DURING)
| Macro |
Description |
TODAY |
Today only |
YESTERDAY |
Yesterday only |
LAST_7_DAYS |
Last 7 days (not including today) |
LAST_14_DAYS |
Last 14 days |
LAST_30_DAYS |
Last 30 days |
LAST_BUSINESS_WEEK |
Monday-Friday of previous week |
THIS_WEEK_MON_TODAY |
Monday of this week through today |
THIS_WEEK_SUN_TODAY |
Sunday of this week through today |
THIS_MONTH |
First day of this month through today |
LAST_MONTH |
Entire previous month |
Common Query Patterns
Campaign Performance Report
SELECT
campaign.id,
campaign.name,
campaign.status,
campaign.advertising_channel_type,
campaign.bidding_strategy_type,
metrics.impressions,
metrics.clicks,
metrics.ctr,
metrics.cost_micros,
metrics.conversions,
metrics.conversions_value,
metrics.cost_per_conversion
FROM campaign
WHERE campaign.status != 'REMOVED'
AND segments.date DURING LAST_30_DAYS
ORDER BY metrics.cost_micros DESC
Search Terms Report (Negative Keyword Identification)
SELECT
search_term_view.search_term,
search_term_view.status,
segments.keyword.info.text,
segments.keyword.info.match_type,
campaign.name,
ad_group.name,
metrics.impressions,
metrics.clicks,
metrics.ctr,
metrics.cost_micros,
metrics.conversions,
metrics.cost_per_conversion
FROM search_term_view
WHERE campaign.status = 'ENABLED'
AND segments.date DURING LAST_30_DAYS
AND metrics.impressions > 10
ORDER BY metrics.cost_micros DESC
LIMIT 1000
Filter for high-cost, zero-conversion terms to build negative keyword lists.
Quality Score Analysis
SELECT
campaign.name,
ad_group.name,
ad_group_criterion.keyword.text,
ad_group_criterion.keyword.match_type,
ad_group_criterion.quality_info.quality_score,
ad_group_criterion.quality_info.creative_quality_score,
ad_group_criterion.quality_info.post_click_quality_score,
ad_group_criterion.quality_info.search_predicted_ctr,
metrics.impressions,
metrics.clicks,
metrics.cost_micros,
metrics.conversions
FROM keyword_view
WHERE campaign.status = 'ENABLED'
AND ad_group.status = 'ENABLED'
AND ad_group_criterion.status = 'ENABLED'
AND ad_group_criterion.quality_info.quality_score IS NOT NULL
AND segments.date DURING LAST_30_DAYS
ORDER BY ad_group_criterion.quality_info.quality_score ASC
Landing Page Performance
SELECT
landing_page_view.unexpanded_final_url,
metrics.impressions,
metrics.clicks,
metrics.ctr,
metrics.cost_micros,
metrics.conversions,
metrics.cost_per_conversion
FROM landing_page_view
WHERE campaign.status = 'ENABLED'
AND segments.date DURING LAST_30_DAYS
AND metrics.clicks > 0
ORDER BY metrics.clicks DESC
LIMIT 100
Device Breakdown
SELECT
campaign.name,
segments.device,
metrics.impressions,
metrics.clicks,
metrics.ctr,
metrics.cost_micros,
metrics.conversions,
metrics.cost_per_conversion
FROM campaign
WHERE campaign.status = 'ENABLED'
AND segments.date DURING LAST_30_DAYS
ORDER BY campaign.name, segments.device
Geographic Performance
SELECT
geographic_view.country_criterion_id,
geographic_view.location_type,
campaign.name,
metrics.impressions,
metrics.clicks,
metrics.ctr,
metrics.cost_micros,
metrics.conversions,
metrics.conversions_value,
metrics.cost_per_conversion
FROM geographic_view
WHERE campaign.status = 'ENABLED'
AND segments.date DURING LAST_30_DAYS
AND metrics.impressions > 0
ORDER BY metrics.cost_micros DESC
LIMIT 200
Ad Copy Performance (RSA Asset-Level)
SELECT
campaign.name,
ad_group.name,
ad_group_ad.ad.id,
ad_group_ad.ad.responsive_search_ad.headlines,
ad_group_ad.ad.responsive_search_ad.descriptions,
ad_group_ad.ad.final_urls,
metrics.impressions,
metrics.clicks,
metrics.ctr,
metrics.cost_micros,
metrics.conversions
FROM ad_group_ad
WHERE campaign.status = 'ENABLED'
AND ad_group.status = 'ENABLED'
AND ad_group_ad.status = 'ENABLED'
AND ad_group_ad.ad.type = 'RESPONSIVE_SEARCH_AD'
AND segments.date DURING LAST_30_DAYS
ORDER BY metrics.impressions DESC
Asset-level performance:
SELECT
campaign.name,
ad_group.name,
ad_group_ad_asset_view.field_type,
ad_group_ad_asset_view.performance_label,
asset.text_asset.text,
metrics.impressions,
metrics.clicks,
metrics.ctr,
metrics.cost_micros,
metrics.conversions
FROM ad_group_ad_asset_view
WHERE campaign.status = 'ENABLED'
AND ad_group.status = 'ENABLED'
AND segments.date DURING LAST_30_DAYS
ORDER BY ad_group_ad_asset_view.performance_label DESC, metrics.impressions DESC
Budget Utilization / Impression Share
SELECT
campaign.name,
campaign.campaign_budget,
campaign_budget.amount_micros,
campaign.bidding_strategy_type,
metrics.impressions,
metrics.cost_micros,
metrics.search_impression_share,
metrics.search_top_impression_share,
metrics.search_absolute_top_impression_share,
metrics.search_budget_lost_impression_share,
metrics.search_rank_lost_impression_share
FROM campaign
WHERE campaign.status = 'ENABLED'
AND campaign.advertising_channel_type = 'SEARCH'
AND segments.date DURING LAST_30_DAYS
ORDER BY metrics.search_budget_lost_impression_share DESC
Conversion Action Breakdown
SELECT
campaign.name,
segments.conversion_action_name,
segments.conversion_action_category,
metrics.conversions,
metrics.conversions_value,
metrics.all_conversions,
metrics.all_conversions_value,
metrics.cost_per_conversion
FROM campaign
WHERE campaign.status = 'ENABLED'
AND segments.date DURING LAST_30_DAYS
AND metrics.conversions > 0
ORDER BY metrics.conversions DESC
Change History Audit
SELECT
change_event.change_date_time,
change_event.change_resource_type,
change_event.change_resource_name,
change_event.resource_change_operation,
change_event.changed_fields,
change_event.old_resource,
change_event.new_resource,
change_event.user_email
FROM change_event
WHERE change_event.change_date_time DURING LAST_14_DAYS
AND change_event.change_resource_type IN (
'CAMPAIGN', 'AD_GROUP', 'AD_GROUP_AD',
'AD_GROUP_CRITERION', 'CAMPAIGN_BUDGET'
)
ORDER BY change_event.change_date_time DESC
LIMIT 500
Gotchas and Important Notes
cost_micros Requires Division
All cost fields are in micros (1/1,000,000 of the currency unit):
Actual cost = metrics.cost_micros / 1,000,000
Actual CPC = metrics.average_cpc / 1,000,000
Example: cost_micros = 5430000 means $5.43.
Segment + Metric Compatibility
segments.conversion_action — impressions/clicks repeat across each conversion action row. Do not sum them.
segments.click_type — clicks and impressions fragment by click type. Summing overcounts.
segments.slot — only compatible with search campaigns.
segments.hour — cannot be combined with segments.date for some resources.
- Check the Google Ads API field compatibility matrix when in doubt.
Date Range Requirements
- Queries with
metrics.* fields require a date range (segments.date DURING ... or BETWEEN).
- Resource-only queries (no metrics) do not need a date range.
Enum Values
Enum fields must use string constant names:
- CampaignStatus:
ENABLED, PAUSED, REMOVED
- AdGroupStatus:
ENABLED, PAUSED, REMOVED
- AdvertisingChannelType:
SEARCH, DISPLAY, SHOPPING, VIDEO, PERFORMANCE_MAX, MULTI_CHANNEL, LOCAL, SMART, HOTEL, DISCOVERY
- KeywordMatchType:
BROAD, PHRASE, EXACT
- BiddingStrategyType:
TARGET_CPA, TARGET_ROAS, MAXIMIZE_CONVERSIONS, MAXIMIZE_CONVERSION_VALUE, MANUAL_CPC, ENHANCED_CPC, TARGET_IMPRESSION_SHARE
- Device:
DESKTOP, MOBILE, TABLET, CONNECTED_TV, OTHER
- QualityScoreBucket:
BELOW_AVERAGE, AVERAGE, ABOVE_AVERAGE
Rate Limits
- Standard access: 15,000 requests/day, 1,600 operations/minute.
- Basic access: 10,000 requests/day.
- Use
SearchStream for large result sets (one operation regardless of size).
Other Pitfalls
- No
OR: All WHERE conditions are AND-joined. Use IN or separate queries.
- No joins: GAQL queries operate on a single resource.
- No
GROUP BY: Aggregation is implicit by selected fields + segments.
- No aliases: Cannot use
AS in GAQL.
- No arithmetic: Calculate
cost_micros / 1000000 client-side.
- Segment auto-grouping: Adding a segment splits rows by that dimension.
- Removed resources: Excluded by default. Filter explicitly to include them.
- PARAMETERS clause:
include_drafts = true for drafts, omit_unselected_resource_names = true to reduce response size.
Resources
1---2name: gaql-reference3description: Google Ads Query Language (GAQL) Reference — complete syntax, resource types, fields, operators, date macros, and ready-to-use query patterns4version: "1.0.0"5author: Cogny AI6platforms: []7user-invocable: true8argument-hint: "<query or topic>"9allowed-tools:10 - WebSearch11 - Read12 - Write13 - Bash14 # Google Ads tools (when connected via Cogny MCP)15 - mcp__cogny__google_ads__tool_execute_gaql16 - mcp__cogny__google_ads__tool_get_gaql_doc17 - mcp__cogny__google_ads__tool_get_reporting_view_doc18 - mcp__cogny__google_ads__tool_list_accessible_accounts19---2021# Google Ads Query Language (GAQL) Reference2223Complete reference for GAQL syntax, resource types, fields, operators, date macros, and common query patterns for Google Ads reporting and optimization.2425Full docs: https://cogny.com/docs/gaql-reference2627## Usage2829```30/gaql-reference # Show full syntax overview31/gaql-reference search terms # Search terms report pattern32/gaql-reference quality score # Quality Score analysis query33/gaql-reference impression share # Budget & impression share query34/gaql-reference geographic # Geographic performance query35/gaql-reference change history # Change history audit query36```3738## Instructions3940You are a Google Ads Query Language (GAQL) expert. Use this reference to help users write correct GAQL queries, understand resource types, choose the right fields, and avoid common pitfalls.4142When the user asks a question, find the relevant section below and provide precise, actionable answers with ready-to-use GAQL examples.4344If the user provides a specific topic as an argument, focus on that area. Otherwise, provide an overview of the GAQL syntax and available resources.4546When the user has Cogny MCP tools available, prefer using `mcp__cogny__google_ads__tool_execute_gaql` to run queries directly and `mcp__cogny__google_ads__tool_get_gaql_doc` or `mcp__cogny__google_ads__tool_get_reporting_view_doc` for API documentation lookups.4748---4950## Syntax5152### Formal Grammar5354```55query = SELECT field_list FROM resource_name56 [ WHERE condition_list ]57 [ ORDER BY field_name [ ASC | DESC ] ]58 [ LIMIT positive_integer ]59 [ PARAMETERS param_list ]6061field_list = field_name { , field_name }62condition_list = condition { AND condition }63condition = field_name operator value64param_list = param_name = param_value { , param_name = param_value }65```6667### Clauses6869| Clause | Required | Description |70|--------|----------|-------------|71| `SELECT` | Yes | Fields to return (resource fields, metrics, segments) |72| `FROM` | Yes | Single resource type to query |73| `WHERE` | No | Filter conditions joined by `AND` (no `OR` support) |74| `ORDER BY` | No | Sort by one field, `ASC` or `DESC` |75| `LIMIT` | No | Maximum number of rows to return |76| `PARAMETERS` | No | Query-level parameters (e.g., `include_drafts = true`) |7778### Example7980```sql81SELECT82 campaign.name,83 metrics.impressions,84 metrics.clicks,85 metrics.cost_micros86FROM campaign87WHERE campaign.status = 'ENABLED'88 AND segments.date DURING LAST_30_DAYS89ORDER BY metrics.impressions DESC90LIMIT 5091```9293## Resource Types (FROM Clause)9495### Campaign Management9697| Resource | Description |98|----------|-------------|99| `campaign` | Campaign settings, status, bidding, budget |100| `campaign_budget` | Shared and campaign-level budgets |101| `campaign_criterion` | Campaign-level targeting criteria |102| `campaign_bid_modifier` | Bid adjustments at campaign level |103| `bidding_strategy` | Portfolio bidding strategies |104105### Ad Groups & Ads106107| Resource | Description |108|----------|-------------|109| `ad_group` | Ad group settings, status, targeting |110| `ad_group_ad` | Ads within ad groups (RSA, ETA, etc.) |111| `ad_group_ad_asset_view` | Asset-level performance for responsive ads |112| `ad_group_criterion` | Keywords, audiences, and other criteria |113| `ad_group_bid_modifier` | Bid adjustments at ad group level |114115### Performance Views116117| Resource | Description |118|----------|-------------|119| `keyword_view` | Keyword-level performance metrics |120| `search_term_view` | Actual search queries that triggered ads |121| `landing_page_view` | Landing page performance |122| `geographic_view` | Performance by geographic location |123| `location_view` | Performance by targeted/excluded location |124| `age_range_view` | Performance by age range demographic |125| `gender_view` | Performance by gender demographic |126| `user_location_view` | Performance by user's physical location |127| `display_keyword_view` | Display network keyword performance |128| `topic_view` | Display/video topic targeting performance |129| `managed_placement_view` | Managed placement performance |130131### Conversion & Attribution132133| Resource | Description |134|----------|-------------|135| `conversion_action` | Conversion action configuration |136| `customer_conversion_goal` | Conversion goals and optimization settings |137138### Account & Extensions139140| Resource | Description |141|----------|-------------|142| `customer` | Account-level settings |143| `asset` | Account assets (sitelinks, callouts, images) |144| `asset_group` | Performance Max asset groups |145| `asset_group_asset` | Assets within asset groups |146147### Change History148149| Resource | Description |150|----------|-------------|151| `change_status` | Recent changes to account entities |152| `change_event` | Detailed change history with old/new values |153154## Common Fields155156### Campaign Fields157158| Field | Type | Description |159|-------|------|-------------|160| `campaign.id` | INT64 | Unique campaign ID |161| `campaign.name` | STRING | Campaign name |162| `campaign.status` | ENUM | `ENABLED`, `PAUSED`, `REMOVED` |163| `campaign.advertising_channel_type` | ENUM | `SEARCH`, `DISPLAY`, `SHOPPING`, `VIDEO`, `PERFORMANCE_MAX` |164| `campaign.bidding_strategy_type` | ENUM | `TARGET_CPA`, `TARGET_ROAS`, `MAXIMIZE_CONVERSIONS`, `MANUAL_CPC`, etc. |165| `campaign.campaign_budget` | RESOURCE | Budget resource name |166| `campaign.start_date` | DATE | Campaign start date |167| `campaign.end_date` | DATE | Campaign end date |168| `campaign.serving_status` | ENUM | `SERVING`, `NONE`, `ENDED`, `PENDING`, `SUSPENDED` |169| `campaign.target_cpa.target_cpa_micros` | INT64 | Target CPA in micros |170| `campaign.target_roas.target_roas` | DOUBLE | Target ROAS as a ratio |171172### Ad Group Fields173174| Field | Type | Description |175|-------|------|-------------|176| `ad_group.id` | INT64 | Unique ad group ID |177| `ad_group.name` | STRING | Ad group name |178| `ad_group.status` | ENUM | `ENABLED`, `PAUSED`, `REMOVED` |179| `ad_group.type` | ENUM | `SEARCH_STANDARD`, `DISPLAY_STANDARD`, `SHOPPING_PRODUCT_ADS`, etc. |180| `ad_group.cpc_bid_micros` | INT64 | Default CPC bid in micros |181| `ad_group.target_cpa_micros` | INT64 | Ad group-level target CPA |182183### Ad Fields184185| Field | Type | Description |186|-------|------|-------------|187| `ad_group_ad.ad.id` | INT64 | Unique ad ID |188| `ad_group_ad.ad.type` | ENUM | `RESPONSIVE_SEARCH_AD`, `EXPANDED_TEXT_AD`, etc. |189| `ad_group_ad.ad.final_urls` | STRING (repeated) | Landing page URLs |190| `ad_group_ad.status` | ENUM | `ENABLED`, `PAUSED`, `REMOVED` |191| `ad_group_ad.ad.responsive_search_ad.headlines` | MESSAGE (repeated) | RSA headline assets |192| `ad_group_ad.ad.responsive_search_ad.descriptions` | MESSAGE (repeated) | RSA description assets |193| `ad_group_ad.policy_summary.approval_status` | ENUM | `APPROVED`, `DISAPPROVED`, etc. |194195### Keyword & Criterion Fields196197| Field | Type | Description |198|-------|------|-------------|199| `ad_group_criterion.criterion_id` | INT64 | Criterion ID |200| `ad_group_criterion.keyword.text` | STRING | Keyword text |201| `ad_group_criterion.keyword.match_type` | ENUM | `BROAD`, `PHRASE`, `EXACT` |202| `ad_group_criterion.status` | ENUM | `ENABLED`, `PAUSED`, `REMOVED` |203| `ad_group_criterion.quality_info.quality_score` | INT32 | Quality Score (1-10) |204| `ad_group_criterion.quality_info.creative_quality_score` | ENUM | `BELOW_AVERAGE`, `AVERAGE`, `ABOVE_AVERAGE` |205| `ad_group_criterion.quality_info.post_click_quality_score` | ENUM | Landing page experience |206| `ad_group_criterion.quality_info.search_predicted_ctr` | ENUM | Expected CTR |207| `ad_group_criterion.effective_cpc_bid_micros` | INT64 | Effective CPC bid |208| `ad_group_criterion.position_estimates.first_page_cpc_micros` | INT64 | Estimated first page CPC |209210### Search Term Fields211212| Field | Type | Description |213|-------|------|-------------|214| `search_term_view.search_term` | STRING | Actual user search query |215| `search_term_view.status` | ENUM | `ADDED`, `EXCLUDED`, `ADDED_EXCLUDED`, `NONE` |216217### Metrics218219| Field | Type | Description |220|-------|------|-------------|221| `metrics.impressions` | INT64 | Number of impressions |222| `metrics.clicks` | INT64 | Number of clicks |223| `metrics.cost_micros` | INT64 | Cost in micros (divide by 1,000,000) |224| `metrics.ctr` | DOUBLE | Click-through rate |225| `metrics.average_cpc` | DOUBLE | Average CPC in micros |226| `metrics.average_cpm` | DOUBLE | Average CPM in micros |227| `metrics.conversions` | DOUBLE | Conversions |228| `metrics.conversions_value` | DOUBLE | Total conversion value |229| `metrics.cost_per_conversion` | DOUBLE | Cost per conversion in micros |230| `metrics.all_conversions` | DOUBLE | All conversions (including cross-device) |231| `metrics.all_conversions_value` | DOUBLE | All conversions value |232| `metrics.view_through_conversions` | INT64 | View-through conversions |233| `metrics.search_impression_share` | DOUBLE | Search impression share (0.0-1.0) |234| `metrics.search_top_impression_share` | DOUBLE | Top impression share |235| `metrics.search_absolute_top_impression_share` | DOUBLE | Absolute top impression share |236| `metrics.search_budget_lost_impression_share` | DOUBLE | IS lost to budget |237| `metrics.search_rank_lost_impression_share` | DOUBLE | IS lost to rank |238| `metrics.interaction_rate` | DOUBLE | Interaction rate |239| `metrics.interactions` | INT64 | Interactions |240| `metrics.video_views` | INT64 | Video views |241| `metrics.video_view_rate` | DOUBLE | Video view rate |242| `metrics.invalid_clicks` | INT64 | Invalid clicks filtered by Google |243244### Segments245246| Field | Type | Description |247|-------|------|-------------|248| `segments.date` | DATE | Date (YYYY-MM-DD) |249| `segments.day_of_week` | ENUM | `MONDAY` through `SUNDAY` |250| `segments.month` | DATE | First day of the month |251| `segments.quarter` | DATE | First day of the quarter |252| `segments.year` | INT32 | Year |253| `segments.hour` | INT32 | Hour of day (0-23) |254| `segments.device` | ENUM | `DESKTOP`, `MOBILE`, `TABLET`, `OTHER` |255| `segments.ad_network_type` | ENUM | `SEARCH`, `SEARCH_PARTNERS`, `CONTENT`, `YOUTUBE_SEARCH`, `YOUTUBE_WATCH` |256| `segments.slot` | ENUM | `TOP`, `OTHER` |257| `segments.conversion_action` | RESOURCE | Conversion action resource name |258| `segments.conversion_action_name` | STRING | Conversion action name |259| `segments.conversion_action_category` | ENUM | Conversion action category |260| `segments.click_type` | ENUM | `URL_CLICKS`, `CALLS`, `SITELINKS`, etc. |261| `segments.keyword.info.text` | STRING | Keyword text (in search_term_view) |262| `segments.keyword.info.match_type` | ENUM | Keyword match type |263264## WHERE Clause Operators265266### Comparison Operators267268| Operator | Example |269|----------|---------|270| `=` | `campaign.status = 'ENABLED'` |271| `!=` | `campaign.status != 'REMOVED'` |272| `>` | `metrics.impressions > 100` |273| `<` | `metrics.ctr < 0.02` |274| `>=` | `metrics.clicks >= 10` |275| `<=` | `metrics.cost_micros <= 5000000` |276277### Set Operators278279| Operator | Example |280|----------|---------|281| `IN` | `campaign.status IN ('ENABLED', 'PAUSED')` |282| `NOT IN` | `campaign.advertising_channel_type NOT IN ('VIDEO', 'DISPLAY')` |283| `CONTAINS ANY` | `campaign.labels CONTAINS ANY ('customers/123/labels/456')` |284| `CONTAINS ALL` | `campaign.labels CONTAINS ALL ('..label1..', '..label2..')` |285| `CONTAINS NONE` | `campaign.labels CONTAINS NONE ('customers/123/labels/456')` |286287### String Operators288289| Operator | Example |290|----------|---------|291| `LIKE` | `campaign.name LIKE '%Brand%'` |292| `NOT LIKE` | `campaign.name NOT LIKE '%Test%'` |293294### Null Checks295296| Operator | Example |297|----------|---------|298| `IS NULL` | `ad_group_criterion.quality_info.quality_score IS NULL` |299| `IS NOT NULL` | `ad_group_criterion.quality_info.quality_score IS NOT NULL` |300301### Range Operators302303| Operator | Example |304|----------|---------|305| `BETWEEN` | `segments.date BETWEEN '2025-01-01' AND '2025-01-31'` |306| `DURING` | `segments.date DURING LAST_30_DAYS` |307308### Date Macros (DURING)309310| Macro | Description |311|-------|-------------|312| `TODAY` | Today only |313| `YESTERDAY` | Yesterday only |314| `LAST_7_DAYS` | Last 7 days (not including today) |315| `LAST_14_DAYS` | Last 14 days |316| `LAST_30_DAYS` | Last 30 days |317| `LAST_BUSINESS_WEEK` | Monday-Friday of previous week |318| `THIS_WEEK_MON_TODAY` | Monday of this week through today |319| `THIS_WEEK_SUN_TODAY` | Sunday of this week through today |320| `THIS_MONTH` | First day of this month through today |321| `LAST_MONTH` | Entire previous month |322323## Common Query Patterns324325### Campaign Performance Report326327```sql328SELECT329 campaign.id,330 campaign.name,331 campaign.status,332 campaign.advertising_channel_type,333 campaign.bidding_strategy_type,334 metrics.impressions,335 metrics.clicks,336 metrics.ctr,337 metrics.cost_micros,338 metrics.conversions,339 metrics.conversions_value,340 metrics.cost_per_conversion341FROM campaign342WHERE campaign.status != 'REMOVED'343 AND segments.date DURING LAST_30_DAYS344ORDER BY metrics.cost_micros DESC345```346347### Search Terms Report (Negative Keyword Identification)348349```sql350SELECT351 search_term_view.search_term,352 search_term_view.status,353 segments.keyword.info.text,354 segments.keyword.info.match_type,355 campaign.name,356 ad_group.name,357 metrics.impressions,358 metrics.clicks,359 metrics.ctr,360 metrics.cost_micros,361 metrics.conversions,362 metrics.cost_per_conversion363FROM search_term_view364WHERE campaign.status = 'ENABLED'365 AND segments.date DURING LAST_30_DAYS366 AND metrics.impressions > 10367ORDER BY metrics.cost_micros DESC368LIMIT 1000369```370371Filter for high-cost, zero-conversion terms to build negative keyword lists.372373### Quality Score Analysis374375```sql376SELECT377 campaign.name,378 ad_group.name,379 ad_group_criterion.keyword.text,380 ad_group_criterion.keyword.match_type,381 ad_group_criterion.quality_info.quality_score,382 ad_group_criterion.quality_info.creative_quality_score,383 ad_group_criterion.quality_info.post_click_quality_score,384 ad_group_criterion.quality_info.search_predicted_ctr,385 metrics.impressions,386 metrics.clicks,387 metrics.cost_micros,388 metrics.conversions389FROM keyword_view390WHERE campaign.status = 'ENABLED'391 AND ad_group.status = 'ENABLED'392 AND ad_group_criterion.status = 'ENABLED'393 AND ad_group_criterion.quality_info.quality_score IS NOT NULL394 AND segments.date DURING LAST_30_DAYS395ORDER BY ad_group_criterion.quality_info.quality_score ASC396```397398### Landing Page Performance399400```sql401SELECT402 landing_page_view.unexpanded_final_url,403 metrics.impressions,404 metrics.clicks,405 metrics.ctr,406 metrics.cost_micros,407 metrics.conversions,408 metrics.cost_per_conversion409FROM landing_page_view410WHERE campaign.status = 'ENABLED'411 AND segments.date DURING LAST_30_DAYS412 AND metrics.clicks > 0413ORDER BY metrics.clicks DESC414LIMIT 100415```416417### Device Breakdown418419```sql420SELECT421 campaign.name,422 segments.device,423 metrics.impressions,424 metrics.clicks,425 metrics.ctr,426 metrics.cost_micros,427 metrics.conversions,428 metrics.cost_per_conversion429FROM campaign430WHERE campaign.status = 'ENABLED'431 AND segments.date DURING LAST_30_DAYS432ORDER BY campaign.name, segments.device433```434435### Geographic Performance436437```sql438SELECT439 geographic_view.country_criterion_id,440 geographic_view.location_type,441 campaign.name,442 metrics.impressions,443 metrics.clicks,444 metrics.ctr,445 metrics.cost_micros,446 metrics.conversions,447 metrics.conversions_value,448 metrics.cost_per_conversion449FROM geographic_view450WHERE campaign.status = 'ENABLED'451 AND segments.date DURING LAST_30_DAYS452 AND metrics.impressions > 0453ORDER BY metrics.cost_micros DESC454LIMIT 200455```456457### Ad Copy Performance (RSA Asset-Level)458459```sql460SELECT461 campaign.name,462 ad_group.name,463 ad_group_ad.ad.id,464 ad_group_ad.ad.responsive_search_ad.headlines,465 ad_group_ad.ad.responsive_search_ad.descriptions,466 ad_group_ad.ad.final_urls,467 metrics.impressions,468 metrics.clicks,469 metrics.ctr,470 metrics.cost_micros,471 metrics.conversions472FROM ad_group_ad473WHERE campaign.status = 'ENABLED'474 AND ad_group.status = 'ENABLED'475 AND ad_group_ad.status = 'ENABLED'476 AND ad_group_ad.ad.type = 'RESPONSIVE_SEARCH_AD'477 AND segments.date DURING LAST_30_DAYS478ORDER BY metrics.impressions DESC479```480481Asset-level performance:482483```sql484SELECT485 campaign.name,486 ad_group.name,487 ad_group_ad_asset_view.field_type,488 ad_group_ad_asset_view.performance_label,489 asset.text_asset.text,490 metrics.impressions,491 metrics.clicks,492 metrics.ctr,493 metrics.cost_micros,494 metrics.conversions495FROM ad_group_ad_asset_view496WHERE campaign.status = 'ENABLED'497 AND ad_group.status = 'ENABLED'498 AND segments.date DURING LAST_30_DAYS499ORDER BY ad_group_ad_asset_view.performance_label DESC, metrics.impressions DESC500```501502### Budget Utilization / Impression Share503504```sql505SELECT506 campaign.name,507 campaign.campaign_budget,508 campaign_budget.amount_micros,509 campaign.bidding_strategy_type,510 metrics.impressions,511 metrics.cost_micros,512 metrics.search_impression_share,513 metrics.search_top_impression_share,514 metrics.search_absolute_top_impression_share,515 metrics.search_budget_lost_impression_share,516 metrics.search_rank_lost_impression_share517FROM campaign518WHERE campaign.status = 'ENABLED'519 AND campaign.advertising_channel_type = 'SEARCH'520 AND segments.date DURING LAST_30_DAYS521ORDER BY metrics.search_budget_lost_impression_share DESC522```523524### Conversion Action Breakdown525526```sql527SELECT528 campaign.name,529 segments.conversion_action_name,530 segments.conversion_action_category,531 metrics.conversions,532 metrics.conversions_value,533 metrics.all_conversions,534 metrics.all_conversions_value,535 metrics.cost_per_conversion536FROM campaign537WHERE campaign.status = 'ENABLED'538 AND segments.date DURING LAST_30_DAYS539 AND metrics.conversions > 0540ORDER BY metrics.conversions DESC541```542543### Change History Audit544545```sql546SELECT547 change_event.change_date_time,548 change_event.change_resource_type,549 change_event.change_resource_name,550 change_event.resource_change_operation,551 change_event.changed_fields,552 change_event.old_resource,553 change_event.new_resource,554 change_event.user_email555FROM change_event556WHERE change_event.change_date_time DURING LAST_14_DAYS557 AND change_event.change_resource_type IN (558 'CAMPAIGN', 'AD_GROUP', 'AD_GROUP_AD',559 'AD_GROUP_CRITERION', 'CAMPAIGN_BUDGET'560 )561ORDER BY change_event.change_date_time DESC562LIMIT 500563```564565## Gotchas and Important Notes566567### cost_micros Requires Division568569All cost fields are in micros (1/1,000,000 of the currency unit):570571```572Actual cost = metrics.cost_micros / 1,000,000573Actual CPC = metrics.average_cpc / 1,000,000574```575576Example: `cost_micros = 5430000` means $5.43.577578### Segment + Metric Compatibility579580- `segments.conversion_action` — impressions/clicks repeat across each conversion action row. Do not sum them.581- `segments.click_type` — clicks and impressions fragment by click type. Summing overcounts.582- `segments.slot` — only compatible with search campaigns.583- `segments.hour` — cannot be combined with `segments.date` for some resources.584- Check the Google Ads API field compatibility matrix when in doubt.585586### Date Range Requirements587588- Queries with `metrics.*` fields require a date range (`segments.date DURING ...` or `BETWEEN`).589- Resource-only queries (no metrics) do not need a date range.590591### Enum Values592593Enum fields must use string constant names:594595- **CampaignStatus:** `ENABLED`, `PAUSED`, `REMOVED`596- **AdGroupStatus:** `ENABLED`, `PAUSED`, `REMOVED`597- **AdvertisingChannelType:** `SEARCH`, `DISPLAY`, `SHOPPING`, `VIDEO`, `PERFORMANCE_MAX`, `MULTI_CHANNEL`, `LOCAL`, `SMART`, `HOTEL`, `DISCOVERY`598- **KeywordMatchType:** `BROAD`, `PHRASE`, `EXACT`599- **BiddingStrategyType:** `TARGET_CPA`, `TARGET_ROAS`, `MAXIMIZE_CONVERSIONS`, `MAXIMIZE_CONVERSION_VALUE`, `MANUAL_CPC`, `ENHANCED_CPC`, `TARGET_IMPRESSION_SHARE`600- **Device:** `DESKTOP`, `MOBILE`, `TABLET`, `CONNECTED_TV`, `OTHER`601- **QualityScoreBucket:** `BELOW_AVERAGE`, `AVERAGE`, `ABOVE_AVERAGE`602603### Rate Limits604605- **Standard access:** 15,000 requests/day, 1,600 operations/minute.606- **Basic access:** 10,000 requests/day.607- Use `SearchStream` for large result sets (one operation regardless of size).608609### Other Pitfalls610611- **No `OR`:** All WHERE conditions are AND-joined. Use `IN` or separate queries.612- **No joins:** GAQL queries operate on a single resource.613- **No `GROUP BY`:** Aggregation is implicit by selected fields + segments.614- **No aliases:** Cannot use `AS` in GAQL.615- **No arithmetic:** Calculate `cost_micros / 1000000` client-side.616- **Segment auto-grouping:** Adding a segment splits rows by that dimension.617- **Removed resources:** Excluded by default. Filter explicitly to include them.618- **PARAMETERS clause:** `include_drafts = true` for drafts, `omit_unselected_resource_names = true` to reduce response size.619620## Resources621622- **GAQL Grammar:** https://developers.google.com/google-ads/api/docs/query/grammar623- **Interactive Query Builder:** https://developers.google.com/google-ads/api/fields/v17/overview_query_builder624- **Resource Reference:** https://developers.google.com/google-ads/api/fields/v17/overview625- **Rate Limits:** https://developers.google.com/google-ads/api/docs/best-practices/rate-limits626- **Full Cogny Docs:** https://cogny.com/docs/gaql-reference