Reading a campaign's current daily budget, whether that budget is shared, and its impression-share metrics currently requires GET /v1/ads/insights GAQL passthrough, which draws on the shared Google operations budget. These are not
exotic reporting needs — they are what you need to answer "is this campaign capped by its budget?", which is the single most common budget question a customer has.
Concretely we need, per campaign: campaign_budget.amount_micros, campaign_budget.explicitly_shared, campaign_budget.resource_name, metrics.search_impression_share, metrics.search_budget_lost_impression_share,
metrics.search_rank_lost_impression_share.
The explicitly_shared flag is a safety requirement, not a nicety. Your team's guidance isnotto point budget writes at campaigns on a shared budget until the behaviour is confirmed. Right now the only way for us to know which
campaigns those areis a GAQL callon the quota we are trying to protect — so the safe path and the cheap path arein conflict.
Request: add these to the campaign response (GET/v1/ads/campaigns) ortoGET/v1/ads/campaigns/{campaignId}/analytics.
Shipped and live. Every field you asked for is now on the normal endpoints, with no GAQL passthrough and no cost to the shared Google operations budget beyond the one call the endpoint already makes.
Budget, on GET /v1/ads/campaigns. Each Google campaign's budget object now carries amountMicros, resourceName, deliveryMethod and explicitlyShared alongside the existing amount and type. Live example from our own account just now:
The values populate on the next campaign sync after this deploy, so an account that has not synced yet will briefly show only the old two fields.
Impression share, on GET /v1/ads/campaigns/{campaignId}/analytics. You get searchImpressionShare, searchBudgetLostImpressionShare and searchRankLostImpressionShare, and we added searchAbsoluteTopImpressionShare and searchTopImpressionShare since they come back in the same query for free.
On the safety point you raised. You were right that the safe path and the cheap path were in conflict. Beyond exposing the flag, a budget write through PUT /v1/ads/campaigns/{campaignId} now refuses with a clear error when the campaign sits on a shared budget, so you cannot hit that case by accident even if you skip the check.
Thanks for the precise write-up, it made this straightforward to build.
Log in to comment and vote
Comments1
Miquel Palet López
Sep 9
Shipped and live. Every field you asked for is now on the normal endpoints, with no GAQL passthrough and no cost to the shared Google operations budget beyond the one call the endpoint already makes.
Budget, on
GET /v1/ads/campaigns. Each Google campaign'sbudgetobject now carriesamountMicros,resourceName,deliveryMethodandexplicitlySharedalongside the existingamountandtype. Live example from our own account just now:"budget": { "type": "daily", "amount": 490, "amountMicros": "490000000", "resourceName": "customers/9122445560/campaignBudgets/15820595193", "deliveryMethod": "STANDARD", "explicitlyShared": false }The values populate on the next campaign sync after this deploy, so an account that has not synced yet will briefly show only the old two fields.
Impression share, on
GET /v1/ads/campaigns/{campaignId}/analytics. You getsearchImpressionShare,searchBudgetLostImpressionShareandsearchRankLostImpressionShare, and we addedsearchAbsoluteTopImpressionShareandsearchTopImpressionSharesince they come back in the same query for free.On the safety point you raised. You were right that the safe path and the cheap path were in conflict. Beyond exposing the flag, a budget write through
PUT /v1/ads/campaigns/{campaignId}now refuses with a clear error when the campaign sits on a shared budget, so you cannot hit that case by accident even if you skip the check.Thanks for the precise write-up, it made this straightforward to build.