Performance Report
performance_reportPerformance report (cost, clicks, impressions, conversions). level: campaign | ad_group | ad | keyword. Keyword level reports from keyword_view and is where pause / negative-keyword decisions are actually made, because one ad group usually mixes match types and intents; negative criteria are excluded (they have no performance and would read as "keywords with zero results"). Keyword rows come back flattened: campaign, ad_group, keyword, match_type, metrics. PAGING: keyword level can easily exceed ten thousand rows, which is more than a tool result can carry, so rows are capped (500 at keyword level, 2000 elsewhere) and the response carries total_rows / returned / offset / truncated / next_offset — call again with offset to walk the rest. limit/offset are only on this tool; get_report always returns the first page.
segment: empty | device | date | day_of_week | hour | network | city | region | country | conversion_action | audience — adds a breakdown ("day" is accepted for date, "geo" for country). network splits Search / Search partners / Display / YouTube. Geo segments (city/region/country) report from geographic_view and always come back at campaign level with a readable location field. conversion_action answers "which conversion actions is each campaign actually producing" (the UI's Segment > Conversions > Conversion action): one row per campaign x conversion action, with primary conversions and all_conversions side by side, which is how you reconcile a campaign total against an account total when offline/CRM uploads are mixed with website tags. That segment returns NO cost, clicks or impressions — Google does not split spend by conversion action and would repeat the campaign total on every row, so anyone summing it would inflate the spend. AUDIENCE: segment="audience" answers "which audiences should I add, bid up or split out" — the UI's Audiences > Segments. One row per audience, at ad group level when level is ad_group/ad/keyword and at campaign level otherwise, with the audience NAME resolved: Google returns internal codes like uservertical::93017 for in-market, affinity and demographic segments, which is unreadable on its own. Each row carries taxonomy (IN_MARKET vs AFFINITY), audience_type, bid_modifier and the usual metrics. targeting_mode is the field the decision rests on: observation means measure only, delivery is NOT narrowed, while targeting means delivery is restricted to that audience. Pair it with manage_audience_targeting, which attaches or excludes an audience, so a change can be measured before and after instead of only made. IMPRESSION SHARE (no segment only): campaign returns all three — impression_share_pct, lost_is_rank_pct, lost_is_budget_pct; ad_group and keyword return impression share and rank-lost but NOT budget-lost, because Google only exposes budget-lost at campaign level (budget is a campaign constraint); the ad level has none at all. Values come as readable percentages next to Google's raw 0-1 fractions, and a missing field means the metric does not exist for that row (Display/PMax, or no impressions) rather than zero. This is what separates "efficient but saturated, no headroom" from "efficient and budget-starved, scale it".
DATE: if you provide period it is used instead of days — 'today' (TODAY 00:00–now), 'yesterday', 'this_week', 'last_week', 'this_month', 'last_month', 'last_7_days'/'last_14_days'/'last_30_days', or an explicit 'YYYY-MM-DD' / 'YYYY-MM-DD:YYYY-MM-DD'. If period is empty, days applies (days=0 = today only).
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| level | No | campaign | |
| limit | No | ||
| offset | No | ||
| period | No | ||
| segment | No | ||
| customer_id | Yes |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||