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:

bash
# 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.

http
Authorization: Bearer satsu_live_xxxxxxxxxxxxxxxxxxxx

Revoke 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

http
GET /v1/sites
json
{
  "sites": [
    { "id": "a1b2c3d4e5", "name": "acme.com", "domain": "acme.com" }
  ]
}

Overview

Headline totals for the range: visitors, pageviews, custom events, bounce rate, average visit duration.

http
GET /v1/sites/{site_id}/overview
json
{
  "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.

http
GET /v1/sites/{site_id}/timeseries

Breakdown

Top values for a dimension — one of pages, referrers, channels, countries, devices, events.

http
GET /v1/sites/{site_id}/breakdown/{dimension}
json
[
  { "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.

http
GET /v1/sites/{site_id}/goals/{goal_id}/conversions

Query parameters

ParameterValues
from, toRFC3339 or YYYY-MM-DD. Defaults to the last 30 days. Clamped to your plan's retention window.
intervalhour or day (timeseries).
Filterspath, 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.

http
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 118
X-RateLimit-Reset: 1783768800

Errors

Errors are JSON with a stable code:

json
{ "error": { "code": "invalid_key", "message": "invalid or revoked API key" } }
StatusMeaning
401Missing, invalid or revoked key.
403plan_downgraded — the org no longer includes API access.
404The site isn't in your organization (or doesn't exist).
429Rate limited; retry after the window.