CLIENT API / V1 GOOGLE ANALYTICS 4

Read published GA4 facts with exact interval provenance

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

Requires analytics:read and site access. Uses contract_version 2 and the same canonical storage as the original GA4 endpoint. Window defaults to 30 completed property-local days. Query accepts window, limit (1-500), offset, and a pinned report_set_id. A missing interval returns pending, never zero or a live fallback. POST to the same path with a JSON object containing window, limit, offset and optional report_set_id to prepare missing data on the regular async worker. Retain report_set_id for stable exact-range pagination; daily sessions_over_time and audience_funnel use dates and offsets without a report_set_id. New dataset names include pages, pages_engagement, acquisition, manual_campaigns, event_totals, and manual_campaign_totals. Collection job IDs can be polled at /sites/{site_id}/ga4/jobs/{job_id} using analytics:read.

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

More context and worked examples are in the developer guide.

Example request

cURL · Bash
curl --fail-with-body \
  'https://satelliteai.io/api/v1/sites/123/ga4/store/reports/sessions_over_time' \
  -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_idrequiredpathinteger
report_typerequiredpathstring
windowquerystringPreset or YYYY-MM-DD/YYYY-MM-DD, completed property-local days.
default 30d
limitqueryinteger
default 100 · min 1 · max 500
offsetqueryinteger
default 0 · min 0 · max 100000
report_set_idqueryintegerPinned exact interval report. Actual dates are returned in metadata.
min 1

Unknown or repeated query parameters return 400.

Data dictionary

Typed columns and rows plus dates, binding, coverage and quality metadata.

202: Report preparation or collection pending

[] 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 string
data.rowsarray of array of any
data.metadataobject
data.metadata.sourcestring
one of: stored
data.metadata.statestring
one of: ready, pending, partial, unsupported, empty_period
data.metadata.report_set_idintegernullable
data.metadata.binding_idinteger
data.metadata.startstring (date)
data.metadata.endstring (date)
data.metadata.timezonestring
data.metadata.qualityarray of object
data.metadata.next_offsetintegernullable
data.metadata.total_rowsinteger

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
503Store disabled or unavailable