Read published GA4 facts with exact interval provenance
/sites/{site_id}/ga4/store/reports/{report_type}analytics:readRequires 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.
| Request | GET https://satelliteai.io/api/v1/sites/{site_id}/ga4/store/reports/{report_type} |
| Permission | analytics:read |
| Response | A single object: data is object. |
| Operation ID | ga4StoredReport |
More context and worked examples are in the developer guide.
Example request
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
| Name | In | Type | Description |
|---|---|---|---|
site_idrequired | path | integer | |
report_typerequired | path | string | |
window | query | string | Preset or YYYY-MM-DD/YYYY-MM-DD, completed property-local days. default 30d |
limit | query | integer | default 100 · min 1 · max 500 |
offset | query | integer | default 0 · min 0 · max 100000 |
report_set_id | query | integer | Pinned 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.
| Field | Type | Description |
|---|---|---|
data.columns | array of string | |
data.rows | array of array of any | |
data.metadata | object | |
data.metadata.source | string | one of: stored |
data.metadata.state | string | one of: ready, pending, partial, unsupported, empty_period |
data.metadata.report_set_id | integernullable | |
data.metadata.binding_id | integer | |
data.metadata.start | string (date) | |
data.metadata.end | string (date) | |
data.metadata.timezone | string | |
data.metadata.quality | array of object | |
data.metadata.next_offset | integernullable | |
data.metadata.total_rows | integer |
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.billing | object | Present for paid live SERP requests; replayed receipts describe the original debit, not an additional charge. |
meta.billing.operation | stringalways present | one of: client_api_serp_refresh |
meta.billing.credits_charged | integeralways present | min 0 |
meta.billing.transaction_id | integeralways present | |
meta.billing.replayed | booleanalways present |
Error responses
Errors return {"error": {"code", "message", "request_id"}}. See error handling for retry guidance.
| HTTP | When |
|---|---|
503 | Store disabled or unavailable |