Analytics API
A read-only HTTP API for your site analytics, available on Pro and Business. Base URL:
https://api.satsu.pro/v1
Quickstart
Create a key in Settings → API keys, then read your overview:
# list your sites
curl https://api.satsu.pro/v1/sites \
-H "Authorization: Bearer satsu_live_..."
# 30-day overview for one site
curl "https://api.satsu.pro/v1/sites/{site_id}/overview?from=2026-06-01" \
-H "Authorization: Bearer satsu_live_..."Authentication
Every request needs an API key in the Authorization header. Keys are created
per organization in Settings → API keys and shown once — store yours somewhere
safe. A key grants read access to every site in its organization.
Authorization: Bearer satsu_live_xxxxxxxxxxxxxxxxxxxxRevoke a key any time from the same page; it stops working immediately.
Endpoints
All endpoints are GET. Site-scoped paths take a site_id (your site's public
ID).
List sites
GET /v1/sites{
"sites": [
{ "id": "a1b2c3d4e5", "name": "acme.com", "domain": "acme.com" }
]
}Overview
Headline totals for the range: visitors, pageviews, custom events, bounce rate, average visit duration.
GET /v1/sites/{site_id}/overview{
"visitors": 3878,
"pageviews": 7179,
"custom_events": 214,
"bounce_rate": 0.56,
"avg_duration_s": 166
}Timeseries
Visitors and pageviews per bucket. Set ?interval=hour or ?interval=day.
GET /v1/sites/{site_id}/timeseriesBreakdown
Top values for a dimension — one of pages, referrers, channels,
countries, devices, events.
GET /v1/sites/{site_id}/breakdown/{dimension}[
{ "value": "DE", "visitors": 877, "pageviews": 1614 },
{ "value": "US", "visitors": 633, "pageviews": 1190 }
]Goal conversions
Conversion totals and rate for a goal. Add ?breakdown= to split by a dimension.
GET /v1/sites/{site_id}/goals/{goal_id}/conversionsQuery parameters
| Parameter | Values |
|---|---|
from, to | RFC3339 or YYYY-MM-DD. Defaults to the last 30 days. Clamped to your plan's retention window. |
interval | hour or day (timeseries). |
| Filters | path, referrer, country, device, browser, os, event, channel. One value each, combined with AND. |
Rate limits
Requests are limited per key. Every response carries the current budget; a
limited request returns 429 with Retry-After.
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 118
X-RateLimit-Reset: 1783768800Errors
Errors are JSON with a stable code:
{ "error": { "code": "invalid_key", "message": "invalid or revoked API key" } }| Status | Meaning |
|---|---|
401 | Missing, invalid or revoked key. |
403 | plan_downgraded — the org no longer includes API access. |
404 | The site isn't in your organization (or doesn't exist). |
429 | Rate limited; retry after the window. |