Google Ads data API: campaigns, metrics and billing
Google Ads (package com.google.android.apps.adwords) is Google's first-party Android client for running Search, Smart and Performance Max campaigns from a phone. After Google-account sign-in, every screen talks to a customer-scoped data API reconstructed from those features: the account picker calls GET /v1/customers:listAccessible, the home list pages campaigns at POST /v1/customers/{customerId}/campaigns:search, and the analytics tab reads impressions, clicks, ctr and costMicros from POST /v1/customers/{customerId}/reports/campaignMetrics.
Keyword construction hits POST /v1/customers/{customerId}/keywords:search (text, matchType, qualityScore). Optimization cards come from GET /v1/customers/{customerId}/recommendations and apply through POST /v1/customers/{customerId}/recommendations:apply. Billing reads GET /v1/customers/{customerId}/billingSetups (paymentsAccountId, spendingLimitMicros); conversion tracking lists GET /v1/customers/{customerId}/conversionActions with attributionModel. Signed-in calls send an OAuth2 Bearer token minted from the Google account on the device.
Google Ads is Google's first-party Android client for running Search, Performance Max, Smart and Display campaigns from a phone: picking a customer account, watching impressions/clicks/cost, editing keywords, applying recommendations, checking billing and wiring conversion actions. Its data API is reconstructed from those screens as a signed-in REST surface scoped to a Google Ads customerId. The account picker lists every customer the Google account can access; the home list returns campaigns with advertisingChannelType, status and budget; the analytics tab pages campaign metrics (impressions, clicks, ctr, costMicros, conversions); keyword and search-term screens expose matchType and query text; recommendations cover raise-budget / raise-bid / reallocation; billing rides Google payments account ids; conversion actions carry attributionModel (data-driven, last-click, first-click, linear, time-decay, position-based). Signed-in calls send an OAuth2 Bearer token minted from the Google account on the device.
Screenshots
API surface
List accessible customers
GET
/v1/customers:listAccessibleopendataReturns every Google Ads customer the signed-in Google account can open, filling the account-picker before the home campaign list.
Auth: OAuth2 Bearer access token from the signed-in Google account (Ads scope). Issued after Google-account SSO on the device.
- resourceNames
- resourceName
- customerId
- descriptiveName
- currencyCode
- timeZone
- manager
- testAccount
- status
Illustrative example reconstructed from the app's interface — not a live capture.
GET /v1/customers:listAccessible HTTP/1.1 Authorization: Bearer <google-oauth2-access-token> Accept: application/json{ "resourceNames": [ "customers/1234567890", "customers/9876543210" ], "customers": [ { "resourceName": "customers/1234567890", "customerId": "1234567890", "descriptiveName": "Northwind Retail — Brand", "currencyCode": "USD", "timeZone": "America/New_York", "manager": false, "testAccount": false, "status": "ENABLED" } ] }Source in the app
inferred from the account-picker / initial-loading Google-account SSO flowSSOAuthPlugin fetchTokenForAccount mints the Google-account token the rest of the app attaches
Get customer account
GET
/v1/customers/{customerId}opendataLoads the selected customer header — name, currency, timezone and optimization score — shown above the campaign list.
Auth: OAuth2 Bearer access token from the signed-in Google account (Ads scope).
- resourceName
- customerId
- descriptiveName
- currencyCode
- timeZone
- autoTaggingEnabled
- optimizationScore
- status
- trackingUrlTemplate
Illustrative example reconstructed from the app's interface — not a live capture.
GET /v1/customers/1234567890 HTTP/1.1 Authorization: Bearer <google-oauth2-access-token> Accept: application/json{ "resourceName": "customers/1234567890", "customerId": "1234567890", "descriptiveName": "Northwind Retail — Brand", "currencyCode": "USD", "timeZone": "America/New_York", "autoTaggingEnabled": true, "optimizationScore": 0.82, "status": "ENABLED", "trackingUrlTemplate": "{lpurl}?utm_source=google&utm_medium=cpc" }Source in the app
inferred from the account header on the campaign home screenaccount_construction illustration is the empty/new-account state of the same customer resource
Search campaigns
POST
/v1/customers/{customerId}/campaigns:searchopendataPages the home campaign list with type (Search / Smart / Performance Max), status, budget and a spend snapshot.
Auth: OAuth2 Bearer access token from the signed-in Google account (Ads scope).
- campaign
- id
- name
- status
- advertisingChannelType
- advertisingChannelSubType
- biddingStrategyType
- campaignBudget
- amountMicros
- impressions
- clicks
- costMicros
- nextPageToken
Illustrative example reconstructed from the app's interface — not a live capture.
POST /v1/customers/1234567890/campaigns:search HTTP/1.1 Authorization: Bearer <google-oauth2-access-token> Content-Type: application/json { "pageSize": 50, "pageToken": "", "status": ["ENABLED", "PAUSED"], "advertisingChannelType": ["SEARCH", "PERFORMANCE_MAX", "SMART"] }{ "results": [ { "campaign": { "resourceName": "customers/1234567890/campaigns/111222333", "id": "111222333", "name": "Brand — US Search", "status": "ENABLED", "advertisingChannelType": "SEARCH", "advertisingChannelSubType": "SEARCH_MOBILE_APP", "biddingStrategyType": "MAXIMIZE_CONVERSIONS", "campaignBudget": "customers/1234567890/campaignBudgets/555", "amountMicros": "50000000" }, "metrics": { "impressions": "58230", "clicks": "1987", "costMicros": "412100000" } } ], "nextPageToken": "CgQItoED" }Source in the app
inferred from the campaign-list home screensearch_campaign_type, smart_campaign_type and uberversal_campaign_type assets map to advertisingChannelType values
Campaign performance metrics
POST
/v1/customers/{customerId}/reports/campaignMetricsopendataReads the analytics tab: daily impressions, clicks, CTR, average CPC, costMicros and conversions for one campaign.
Auth: OAuth2 Bearer access token from the signed-in Google account (Ads scope).
- campaignId
- currencyCode
- date
- impressions
- clicks
- ctr
- averageCpc
- costMicros
- conversions
- conversionsValue
- allConversions
Illustrative example reconstructed from the app's interface — not a live capture.
POST /v1/customers/1234567890/reports/campaignMetrics HTTP/1.1 Authorization: Bearer <google-oauth2-access-token> Content-Type: application/json { "campaignId": "111222333", "dateRange": {"startDate": "2026-09-21", "endDate": "2026-09-27"}, "segments": ["date"] }{ "campaignId": "111222333", "currencyCode": "USD", "rows": [ { "date": "2026-09-27", "impressions": "9102", "clicks": "311", "ctr": 0.0342, "averageCpc": "2070000", "costMicros": "64377000", "conversions": 18.5, "conversionsValue": 842.10, "allConversions": 21.0 } ] }Source in the app
inferred from the analytics screen plus impressions.png / clicks.png metric illustrationsfeature_promo_card_modify_columns is the column-picker for this metrics table
Search keywords
POST
/v1/customers/{customerId}/keywords:searchopendataLists keywords for a campaign with match type, quality score, CPC bid and spend — the keyword-construction screen.
Auth: OAuth2 Bearer access token from the signed-in Google account (Ads scope).
- criterionId
- adGroupId
- keyword
- text
- matchType
- status
- qualityScore
- creativeQualityScore
- cpcBidMicros
- impressions
- clicks
- costMicros
Illustrative example reconstructed from the app's interface — not a live capture.
POST /v1/customers/1234567890/keywords:search HTTP/1.1 Authorization: Bearer <google-oauth2-access-token> Content-Type: application/json { "campaignId": "111222333", "pageSize": 50, "matchType": ["EXACT", "PHRASE", "BROAD"] }{ "results": [ { "criterionId": "3344556677", "adGroupId": "888999000", "keyword": {"text": "running shoes", "matchType": "EXACT"}, "status": "ENABLED", "qualityInfo": {"qualityScore": 8, "creativeQualityScore": "ABOVE_AVERAGE"}, "cpcBidMicros": "1500000", "metrics": {"impressions": "12040", "clicks": "402", "costMicros": "60300000"} } ] }Source in the app
inferred from add-keywords.png and feature_promo_card_keyword_constructionmatch-type.png maps to keyword.matchType (EXACT / PHRASE / BROAD)
List recommendations
GET
/v1/customers/{customerId}/recommendationsopendataLoads Optimization recommendations (raise budget, raise/lower bid, reallocation) shown on the recommendations tab.
Auth: OAuth2 Bearer access token from the signed-in Google account (Ads scope).
- resourceName
- type
- campaignBudgetRecommendation
- currentAmountMicros
- recommendedAmountMicros
- impact
- baseMetrics
- potentialMetrics
- dismissed
Illustrative example reconstructed from the app's interface — not a live capture.
GET /v1/customers/1234567890/recommendations?pageSize=20 HTTP/1.1 Authorization: Bearer <google-oauth2-access-token> Accept: application/json{ "results": [ { "resourceName": "customers/1234567890/recommendations/rec-raise-budget-01", "type": "CAMPAIGN_BUDGET", "campaignBudgetRecommendation": { "currentAmountMicros": "50000000", "recommendedAmountMicros": "75000000" }, "impact": { "baseMetrics": {"clicks": 1987, "conversions": 63.0}, "potentialMetrics": {"clicks": 2610, "conversions": 81.0} }, "dismissed": false } ] }Source in the app
inferred from feature_promo_card_recommendation_intro and no-recommendations-to-display empty stateraise-budget.png, raise-bid.png, lower-bid.png, reallocation.png and forecasting_budget_raising.png are the recommendation types
Apply recommendation
POST
/v1/customers/{customerId}/recommendations:applyopendataApplies a recommendation (for example a budget raise) so the change lands on the live campaign from the phone.
Auth: OAuth2 Bearer access token from the signed-in Google account (Ads scope).
- resourceName
- applyParameters
- newAmountMicros
- applied
- campaignBudget
- amountMicros
Illustrative example reconstructed from the app's interface — not a live capture.
POST /v1/customers/1234567890/recommendations:apply HTTP/1.1 Authorization: Bearer <google-oauth2-access-token> Content-Type: application/json { "resourceName": "customers/1234567890/recommendations/rec-raise-budget-01", "applyParameters": { "campaignBudget": {"newAmountMicros": "75000000"} } }{ "results": [ { "resourceName": "customers/1234567890/recommendations/rec-raise-budget-01", "applied": true, "campaignBudget": { "resourceName": "customers/1234567890/campaignBudgets/555", "amountMicros": "75000000" } } ] }Source in the app
inferred from the raise-budget / raise-bid confirmation flow on the recommendations tabforecasting_budget_raising.png is the before/after impact card shown prior to apply
Read billing setup
GET
/v1/customers/{customerId}/billingSetupsopenfinanceLoads the billing screen: payments account, spending limit and setup status behind check-billing.
Auth: OAuth2 Bearer access token from the signed-in Google account (Ads scope). Billing writes additionally open the on-device Google payments account manager.
- resourceName
- status
- paymentsAccountId
- paymentsAccountName
- paymentsProfileId
- secondaryPaymentsAccountId
- endTimeType
- spendingLimitMicros
- currencyCode
Illustrative example reconstructed from the app's interface — not a live capture.
GET /v1/customers/1234567890/billingSetups HTTP/1.1 Authorization: Bearer <google-oauth2-access-token> Accept: application/json{ "results": [ { "resourceName": "customers/1234567890/billingSetups/42", "status": "APPROVED", "paymentsAccountId": "1234-5678-9012", "paymentsAccountName": "Northwind Retail Ads", "paymentsProfileId": "1234-5678", "secondaryPaymentsAccountId": null, "endTimeType": "FOREVER", "spendingLimitMicros": "1000000000", "currencyCode": "USD" } ] }Source in the app
inferred from feature_promo_card_check_billing and the payments_gm2_24px billing iconPaymentsListener pendingBillingAccountManagerFlowResult / billingAccountManager opens the Google payments instrument manager
List conversion actions
GET
/v1/customers/{customerId}/conversionActionsopendataLists conversion actions and their attribution model (data-driven, last-click, first-click, linear, time-decay, position-based) for the conversion-tracking screen.
Auth: OAuth2 Bearer access token from the signed-in Google account (Ads scope).
- resourceName
- id
- name
- status
- type
- category
- countingType
- attributionModel
- defaultValue
- alwaysUseDefaultValue
- primaryForGoal
Illustrative example reconstructed from the app's interface — not a live capture.
GET /v1/customers/1234567890/conversionActions HTTP/1.1 Authorization: Bearer <google-oauth2-access-token> Accept: application/json{ "results": [ { "resourceName": "customers/1234567890/conversionActions/7001", "id": "7001", "name": "Purchase", "status": "ENABLED", "type": "WEBPAGE", "category": "PURCHASE", "countingType": "ONE_PER_CLICK", "attributionModelSettings": {"attributionModel": "GOOGLE_SEARCH_ATTRIBUTION_DATA_DRIVEN"}, "valueSettings": {"defaultValue": 42.0, "alwaysUseDefaultValue": false}, "primaryForGoal": true } ] }Source in the app
inferred from conversion_tracking.png, no_conversion_goals.png and congrats_screen_conversiondata-driven / first-click / last-click / linear / time-decay / u-shaped assets are the attribution-model picker
Read change history
GET
/v1/customers/{customerId}/changeEventsopendataPages the change-history feed of who edited budgets, keywords and ads from the mobile client.
Auth: OAuth2 Bearer access token from the signed-in Google account (Ads scope).
- resourceName
- changeDateTime
- userEmail
- clientType
- changeResourceType
- changeResourceName
- resourceChangeOperation
- oldResource
- newResource
Illustrative example reconstructed from the app's interface — not a live capture.
GET /v1/customers/1234567890/changeEvents?pageSize=25 HTTP/1.1 Authorization: Bearer <google-oauth2-access-token> Accept: application/json{ "results": [ { "resourceName": "customers/1234567890/changeEvents/20260927-184422", "changeDateTime": "2026-09-27 18:44:22", "userEmail": "[email protected]", "clientType": "GOOGLE_ADS_MOBILE_APP", "changeResourceType": "CAMPAIGN_BUDGET", "changeResourceName": "customers/1234567890/campaignBudgets/555", "resourceChangeOperation": "UPDATE", "oldResource": {"campaignBudget": {"amountMicros": "50000000"}}, "newResource": {"campaignBudget": {"amountMicros": "75000000"}} } ] }Source in the app
inferred from change_history_empty_state.png, the empty state of the change-history screen
Search terms report
GET
/v1/customers/{customerId}/searchTermsopendataReturns the search-terms report: the actual queries that triggered ads, with match type and performance.
Auth: OAuth2 Bearer access token from the signed-in Google account (Ads scope).
- searchTerm
- searchTermMatchType
- status
- campaignId
- adGroupId
- impressions
- clicks
- costMicros
- conversions
Illustrative example reconstructed from the app's interface — not a live capture.
GET /v1/customers/1234567890/searchTerms?campaignId=111222333&pageSize=50 HTTP/1.1 Authorization: Bearer <google-oauth2-access-token> Accept: application/json{ "results": [ { "searchTerm": "buy running shoes online", "searchTermMatchType": "BROAD", "status": "NONE", "campaignId": "111222333", "adGroupId": "888999000", "impressions": "640", "clicks": "28", "costMicros": "4200000", "conversions": 2.0 } ] }Source in the app
inferred from search-terms-illustration.svg and the manage_search_gm2_24px search-terms entry point
Create campaign
POST
/v1/customers/{customerId}/campaigns:createopendataCreates a Search, Smart or Performance Max campaign from the in-app creation wizard (from scratch or with AI Max / Gemini).
Auth: OAuth2 Bearer access token from the signed-in Google account (Ads scope).
- campaign
- id
- name
- status
- advertisingChannelType
- biddingStrategyType
- amountMicros
- createWithAi
- resourceName
Illustrative example reconstructed from the app's interface — not a live capture.
POST /v1/customers/1234567890/campaigns:create HTTP/1.1 Authorization: Bearer <google-oauth2-access-token> Content-Type: application/json { "campaign": { "name": "PMax — Fall catalog", "status": "PAUSED", "advertisingChannelType": "PERFORMANCE_MAX", "biddingStrategyType": "MAXIMIZE_CONVERSION_VALUE", "amountMicros": "40000000", "createWithAi": true } }{ "campaign": { "resourceName": "customers/1234567890/campaigns/444555666", "id": "444555666", "name": "PMax — Fall catalog", "status": "PAUSED", "advertisingChannelType": "PERFORMANCE_MAX", "biddingStrategyType": "MAXIMIZE_CONVERSION_VALUE", "amountMicros": "40000000" } }Source in the app
inferred from ad-creation.png plus create_from_scratch.svg and create_with_ai.svgai_max_intro.svg and gemini_logo.svg are the AI-assisted creation path; search/smart/uberversal campaign-type assets pick advertisingChannelType
Data categories
- customers
- campaigns
- metrics
- keywords
- recommendations
- billing
- conversions
- change history
- search terms
Where teams use this data
Cross-channel spend dashboard
An agency BI job pages POST /v1/customers/{customerId}/reports/campaignMetrics (impressions, clicks, ctr, costMicros, conversions) per customer from GET /v1/customers:listAccessible and folds Google spend into the same daily cube as other paid channels.
Search-term mining
A keyword ops bot reads GET /v1/customers/{customerId}/searchTerms and POST /v1/customers/{customerId}/keywords:search (text, matchType, qualityScore) to flag converting queries that are still unmatched exact keywords.
Recommendation automation
A budget-pacing service lists GET /v1/customers/{customerId}/recommendations and, when impact.potentialMetrics.conversions clears a threshold, posts POST /v1/customers/{customerId}/recommendations:apply with a newAmountMicros — the same raise-budget path as the in-app card.
Billing reconciliation
Finance pulls GET /v1/customers/{customerId}/billingSetups (paymentsAccountId, spendingLimitMicros, currencyCode) and matches monthly invoices to the payments account shown on the check-billing screen.
Frequently asked questions
What data API does the Google Ads app use?
A signed-in, customer-scoped REST surface reconstructed from the app's screens: GET /v1/customers:listAccessible for the account picker, POST /v1/customers/{customerId}/campaigns:search for the home list, and POST /v1/customers/{customerId}/reports/campaignMetrics for the analytics tab. The endpoints on this page are an illustrative map of that surface, not a live traffic dump.
How does the Google Ads app authenticate?
The app signs in with the Google account on the device (SSO) and attaches an OAuth2 Bearer access token with the Ads scope to later calls. There is no anonymous browse — every customer, campaign, keyword and billing read requires that session.
Which performance fields sit behind the analytics screen?
POST /v1/customers/{customerId}/reports/campaignMetrics returns impressions, clicks, ctr, averageCpc, costMicros, conversions, conversionsValue and allConversions, segmented by date — the same columns the in-app metrics table and column-picker expose.
Can billing and conversion setup be read from the app?
Yes. GET /v1/customers/{customerId}/billingSetups returns paymentsAccountId, paymentsAccountName, spendingLimitMicros and currencyCode (the check-billing screen, with payment-method edits going through the on-device Google payments manager). GET /v1/customers/{customerId}/conversionActions lists conversion goals plus attributionModel (data-driven, last-click, first-click, linear, time-decay, position-based).
Topics
- Google Ads API
- Google Ads mobile data API
- campaign metrics costMicros
- listAccessible customers
- keyword matchType qualityScore
- Google Ads recommendations
- billingSetups paymentsAccountId
- conversionActions attributionModel
- search terms report
- Performance Max campaign
Need this app's data API integrated?
We deliver scoped integrations for any named app — from USD 500 with source-code handoff, or hosted access billed per call. Tell us the data you need.
- NDA + SOW on every engagement
- Delivery in 3–7 days
- Payment only after acceptance
- Work scoped to authorized use