Authentication
Every request needs a Bearer token carrying theanalytics:read scope. Two token types work:
- A Personal Access Token (
op_pat_) — for accessing your own account’s stores. - An OAuth access token (
op_at_) — for an app a merchant installed and grantedanalytics:read.
Store scoping
Results are always limited to your account and the stores your token is authorized for. By default an endpoint returns data for all of the token’s authorized stores. Passstore_ids to narrow to specific stores:
store_ids you receive back in the response meta reflect the exact scope that was applied.
Data freshness
Analytics tables are rebuilt on a batch schedule (roughly every 8 hours), so data is not real-time and can be up to ~8 hours behind your live store data. Every response includes adata_freshness_at timestamp in its meta block — the time the underlying table was last rebuilt by the batch job (not a per-row timestamp):
Tables
Tables return raw, row-level records.No PII is exposed. Each table has a fixed allowlist of safe columns; personally identifiable fields (customer name, email, etc.) are never included and cannot be requested. The
fields parameter can only ever narrow to columns within that allowlist — asking for a field outside it is dropped, and a request for only disallowed fields returns 400 INVALID_FIELDS.List tables
Get rows
cursor set to meta.next_cursor until has_more is false.
Available tables
addresses is geo-only. Customer identity fields — name, email, phone, and street lines (address1/address2) — are excluded and cannot be requested. Coordinates are rounded to ~1.1 km (2 decimal places), so latitude/longitude support regional mapping but never pinpoint an individual address. Its time column is order_date.Metrics
Metrics are pre-defined aggregations computed at query time over the batch-refreshed tables. Query them as a time series or fetch the latest single value.List metrics
Time series
group_by=store_id, each data point also includes a store_id field.

