Read stored Ads metrics
/sites/{site_id}/google-ads/accounts/{account_id}/reports/{report_type}google-ads:readRequires google-ads:read. Stored reads only: no source=live, refresh, GAQL, provider account overrides, jobs, or credit charges. Explicit site grants and current campaign assignments constrain reports. Shared account collection coverage never grants other-site metrics. Summary and daily roll up campaign facts only; summary rejects pagination. All other reports use limit/offset.
| Request | GET https://satelliteai.io/api/v1/sites/{site_id}/google-ads/accounts/{account_id}/reports/{report_type} |
| Permission | google-ads:read |
| Response | A single object: data is GoogleAdsReport. |
| Operation ID | getGoogleAdsReport |
More context and worked examples are in the developer guide.
Example request
curl --fail-with-body \
'https://satelliteai.io/api/v1/sites/123/google-ads/accounts/12/reports/summary' \
-H "Authorization: Bearer $SATELLITE_API_KEY"Replace the example IDs with values returned by the discovery endpoints. Example values are placeholders, not real records.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
site_idrequired | path | integer | ID from GET /sites. min 1 |
account_idrequired | path | integer | Satellite account ID from /google-ads/accounts; not the Google customer ID. min 1 · max 2147483647 · example 12 |
report_typerequired | path | string | one of: summary, daily, campaigns, ad-groups, ads, asset-groups, keywords, search-terms, landing-pages, conversions, geography · example summary |
start_date | query | string (date) | Paired inclusive account-local dates, at most 1131 dates. Default last 30 completed account-local dates, excluding today. |
end_date | query | string (date) | Paired inclusive account-local dates, at most 1131 dates. Default last 30 completed account-local dates, excluding today. |
limit | query | integer | default 50 · min 1 · max 100 |
offset | query | integer | Bounded offset; next_offset is null at the cap. Mutable stored data is not an atomic pagination snapshot. default 0 · min 0 · max 100000 |
campaign_id | query | string | Assigned Google campaign ID, signed 64-bit positive decimal string. Inaccessible campaign returns 404. pattern ^[0-9]{1,19}$ |
url_kind | query | string | Only landing-pages. One URL variant per request; variants overlap. one of: expanded, unexpanded · default expanded |
location_type | query | string | Only geography. One location variant per request; variants overlap. one of: physical, area_of_interest · default physical |
Unknown or repeated query parameters return 400.
Data dictionary
Stored site-assigned results. No provider refresh or credit debit.
[] marks an array element. nullable means the value can be null; treat it as unknown, not zero. always present means the key is always included in the object.
| Field | Type | Description |
|---|---|---|
data.site_id | integeralways present | Satellite site ID (from GET /sites). |
data.account_id | integeralways present | |
data.customer_id | stringalways present | max length 4096 |
data.report_type | stringalways present | one of: summary, daily, campaigns, ad-groups, ads, asset-groups, keywords, search-terms, landing-pages, conversions, geography · max length 4096 |
data.source | stringalways present | one of: stored · max length 4096 |
data.time_zone | stringalways present | max length 4096 |
data.date_range | objectalways present | |
data.date_range.start_date | string (date)always present | max length 4096 |
data.date_range.end_date | string (date)always present | max length 4096 |
data.rows | array of GoogleAdsMetricRowalways present | max items 100 |
data.rows[].account_id | integeralways present | |
data.rows[].date | string (date)nullablealways present | max length 4096 |
data.rows[].campaign_id | stringnullablealways present | max length 4096 · pattern ^[0-9]+$ |
data.rows[].campaign_name | stringnullablealways present | max length 4096 |
data.rows[].currency_code | stringalways present | Currency of this row. Never combine different currencies. max length 4096 |
data.rows[].fetched_at | string (date-time)nullablealways present | When Satellite fetched the data from its source (UTC, RFC 3339). max length 4096 |
data.rows[].dimensions | objectalways present | |
data.rows[].dimensions.device | stringnullable | max length 4096 |
data.rows[].dimensions.ad_network_type | stringnullable | max length 4096 |
data.rows[].dimensions.ad_group_id | stringnullable | max length 4096 · pattern ^[0-9]+$ |
data.rows[].dimensions.ad_id | stringnullable | max length 4096 · pattern ^[0-9]+$ |
data.rows[].dimensions.asset_group_id | stringnullable | max length 4096 · pattern ^[0-9]+$ |
data.rows[].dimensions.criterion_id | stringnullable | max length 4096 · pattern ^[0-9]+$ |
data.rows[].dimensions.search_term_id | stringnullable | max length 4096 · pattern ^[0-9]+$ |
data.rows[].dimensions.match_type | stringnullable | max length 4096 |
data.rows[].dimensions.source_view | stringnullable | max length 4096 |
data.rows[].dimensions.landing_url_id | stringnullable | max length 4096 · pattern ^[0-9]+$ |
data.rows[].dimensions.url_kind | stringnullable | max length 4096 |
data.rows[].dimensions.conversion_action_id | stringnullable | max length 4096 · pattern ^[0-9]+$ |
data.rows[].dimensions.geo_target_id | stringnullable | max length 4096 · pattern ^[0-9]+$ |
data.rows[].dimensions.location_type | stringnullable | max length 4096 |
data.rows[].dimensions.keyword_text | stringnullable | max length 4096 |
data.rows[].dimensions.quality_score | integernullable | |
data.rows[].dimensions.search_term | stringnullable | max length 4096 |
data.rows[].dimensions.landing_url | stringnullable | max length 2048 |
data.rows[].dimensions.page_id | integernullable | Satellite page ID (from GET /sites/{site_id}/pages). |
data.rows[].dimensions.conversion_action_name | stringnullable | max length 4096 |
data.rows[].dimensions.geo_name | stringnullable | max length 4096 |
data.rows[].dimensions.country_code | stringnullable | max length 4096 |
data.rows[].impressions | integernullablealways present | |
data.rows[].clicks | integernullablealways present | |
data.rows[].cost_micros | stringnullablealways present | Cost in millionths of the row currency, serialized as an integer decimal string. max length 4096 · pattern ^-?[0-9]+(?:\.[0-9]{6})?$ |
data.rows[].interactions | integernullablealways present | |
data.rows[].view_through_conversions | integernullablealways present | |
data.rows[].conversions | numbernullablealways present | |
data.rows[].conversions_value | stringnullablealways present | Conversion value in the row currency; six decimal places. Unknown remains null. max length 4096 · pattern ^-?[0-9]+(?:\.[0-9]{6})?$ |
data.rows[].all_conversions | numbernullablealways present | |
data.rows[].all_conversions_value | stringnullablealways present | Conversion value in the row currency; six decimal places. Unknown remains null. max length 4096 · pattern ^-?[0-9]+(?:\.[0-9]{6})?$ |
data.rows[].cost | stringnullablealways present | Cost in currency units, six decimal places. max length 4096 · pattern ^-?[0-9]+(?:\.[0-9]{6})?$ |
data.rows[].cpc | stringnullablealways present | Cost per click in currency units, null if denominator is zero or unknown. max length 4096 · pattern ^-?[0-9]+(?:\.[0-9]{6})?$ |
data.rows[].ctr | numbernullablealways present | Clicks / impressions, a fraction (0.1 = 10%). |
data.rows[].conversion_rate | numbernullablealways present | Conversions / interactions, a fraction. |
data.rows[].roas | numbernullablealways present | Conversion value / cost, a multiplier. |
data.rows[].search_impression_share | numbernullablealways present | Stored campaign grain share; null in summary/daily rollups. Never sum or average shares across rows. |
data.rows[].search_budget_lost_impression_share | numbernullablealways present | Stored campaign grain share; null in summary/daily rollups. Never sum or average shares across rows. |
data.rows[].search_rank_lost_impression_share | numbernullablealways present | Stored campaign grain share; null in summary/daily rollups. Never sum or average shares across rows. |
data.rows[].truncated_fields | array of stringalways present | Fields shortened or omitted because they exceeded public size limits. max items 30 |
data.coverage | objectalways present | Collection coverage is account-wide, not a site row count. Missing dates are not zeros; rebuilding suppresses facts. A committed window remains valid if its containing sync is still running or later fails. |
data.coverage.collection_scope | stringalways present | one of: account · max length 4096 |
data.coverage.report_scope | stringalways present | one of: site · max length 4096 |
data.coverage.periods | array of objectalways present | max items 1131 |
data.coverage.periods[].date | string (date)always present | max length 4096 |
data.coverage.periods[].status | stringalways present | complete, empty, failed, partial, or another stored collection status. max length 4096 |
data.coverage.periods[].fetched_at | string (date-time)nullablealways present | When Satellite fetched the data from its source (UTC, RFC 3339). max length 4096 |
data.coverage.missing_dates | array of string (date)always present | max items 1131 |
data.coverage.complete | booleanalways present | |
data.coverage.rebuild_pending | booleanalways present | |
data.restatement_notice | stringalways present | max length 4096 |
Response metadata
| Field | Type | Description |
|---|---|---|
meta.request_id | stringalways present | Request identifier; also returned in X-Request-ID. Include it in support requests. |
meta.api_version | stringalways present | API version that produced the response. one of: v1 |
meta.limit | integer | Maximum records per page applied to this request. min 1 · max 100 |
meta.has_more | boolean | True when another page is available. |
meta.next_cursor | stringnullable | Opaque cursor for the next page; send as cursor. Null on the last page. |
meta.availability | string | available when stored data exists; not_available when it does not. one of: available, not_available |
meta.source | stringalways present | one of: stored · max length 4096 |
meta.access_scope | string | one of: site · max length 4096 |
meta.connection_status | string | max length 128 |
meta.offset | integer | min 0 · max 100000 |
meta.next_offset | integernullable | min 0 · max 100000 |
meta.offset_limit_reached | boolean |
Error responses
Errors return {"error": {"code", "message", "request_id"}}. See error handling for retry guidance.
| HTTP | When |
|---|---|
400 | Unknown/repeated query, invalid filter or dates. summary rejects limit/offset; variant filters are only accepted by their corresponding report. |
401 | Missing, invalid, expired, or revoked credential. |
403 | Required explicit scope, active integration, or company API access unavailable. |
404 | Missing or inaccessible site, account, campaign, report, entity type, or dataset. |
409 | google_ads_timezone_unavailable: stored account time zone needs correction. |
413 | Response too large. |
429 | Request allowance exceeded; honor Retry-After. |
503 | Stored reporting or authentication temporarily unavailable. |