CLIENT API / V1 GOOGLE ANALYTICS 4

Read an exact calendar-month GA4 report

GET/sites/{site_id}/ga4/monthly-reports/{report_type}analytics:read

Read a completed calendar month from canonical storage. Use site_totals or summary_kpis for exact interval totals; sessions_over_time and audience_funnel retain daily rows. Never sum daily/page distinct users or sessions to approximate interval totals. Pending remains HTTP 200: inspect data.metadata.state and explicitly prepare if authorized. Default limit 100, maximum 500. Preserve report_set_id while paging an exact publication.

RequestGET https://satelliteai.io/api/v1/sites/{site_id}/ga4/monthly-reports/{report_type}
Permissionanalytics:read
ResponseA single object: data is Ga4MonthlyData.
Operation IDgetGa4MonthlyReport

More context and worked examples are in the developer guide.

Example request

cURL · Bash
curl --fail-with-body --get \
  'https://satelliteai.io/api/v1/sites/123/ga4/monthly-reports/sessions_over_time' \
  --data-urlencode 'month=2026-09' \
  -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

NameInTypeDescription
site_idrequiredpathintegerAuthorized site id. Parent and site grants must also match.
min 1 · max 9223372036854775807
report_typerequiredpathstringAuthorized report type. Parent and site grants must also match.
monthrequiredquerystringCompleted calendar month YYYY-MM in the connected GA4 property timezone.
pattern ^[0-9]{4}-[0-9]{2}$ · example 2026-09
limitqueryintegerMaximum rows per page. Default 100, maximum 500.
default 100 · min 1 · max 500
offsetqueryintegerZero-based row offset, default 0, maximum 100000.
default 0 · min 0 · max 100000
report_set_idqueryintegerOptional ready publication ID; keep it while paging to pin the same exact report.
min 1

Unknown or repeated query parameters return 400.

Data dictionary

Scoped result. Lists return pagination metadata; unavailable records return 404. Canonical publication for a completed calendar month. Daily report aliases retain daily rows; use site_totals or summary_kpis for interval totals. GET never prepares missing data. Pending reads remain HTTP 200; inspect metadata.state and metadata.aggregation.

[] 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.

Fields in data
FieldTypeDescription
data.columnsarray of stringOrdered dimension and metric column names.
data.rowsarray of array of string | numberRow arrays aligned positionally with columns.
data.metadataobjectPublication provenance. A pending/unsupported state is not a zero-traffic report. Additional publication metadata may be present.
data.metadata.statestringnullableState.
data.metadata.sourcestringnullableSource.
data.metadata.binding_idintegernullableBinding id.
data.metadata.connection_revisionintegernullableConnection revision.
data.metadata.property_idstringnullableProperty id.
data.metadata.timezonestringnullableTimezone.
data.metadata.startstringnullableStart.
data.metadata.endstringnullableEnd.
data.metadata.datasetstringnullableDataset.
data.metadata.definition_versionintegernullableDefinition version.
data.metadata.report_set_idintegernullableReport set id.
data.metadata.report_statestringnullableReport state.
data.metadata.fetched_atstringnullableFetched at.
data.metadata.total_rowsintegernullableTotal rows.
data.metadata.next_offsetintegernullableNext offset.
data.metadata.aggregationstringnullableAggregation.
data.metadata.qualityarray of objectStored provider quality metadata.

Response metadata

Fields in meta
FieldTypeDescription
meta.request_idstringalways presentRequest identifier; also returned in X-Request-ID. Include it in support requests.
meta.api_versionstringalways presentAPI version that produced the response.
one of: v1
meta.limitintegerMaximum records per page applied to this request.
min 1 · max 100
meta.has_morebooleanTrue when another page is available.
meta.next_cursorstringnullableOpaque cursor for the next page; send as cursor. Null on the last page.
meta.availabilitystringavailable when stored data exists; not_available when it does not.
one of: available, not_available
meta.billingobjectPresent for paid live SERP requests; replayed receipts describe the original debit, not an additional charge.
meta.billing.operationstringalways present
one of: client_api_serp_refresh
meta.billing.credits_chargedintegeralways present
min 0
meta.billing.transaction_idintegeralways present
meta.billing.replayedbooleanalways present

Error responses

Errors return {"error": {"code", "message", "request_id"}}. See error handling for retry guidance.

HTTPWhen
400Invalid parameters
401Invalid credentials
403Missing permission
404Missing or inaccessible resource