Reference
Read-only JSON and CSV endpoints for every metric the dashboard shows, versioned under /api/stats/v1.
Every endpoint is a GET that returns the active project’s data for the requested window.
curl "https://sea.zshlabs.com/api/stats/v1/overview?range=30d" \
--cookie "$(cat sea-session-cookies.txt)"
# CSV export
curl -o pages.csv "https://sea.zshlabs.com/api/stats/v1/pages?range=7d&format=csv" \
--cookie "$(cat sea-session-cookies.txt)"Authentication is session-based today: the API accepts the same Supabase session cookie the dashboard uses, so a browser that is signed in can call these URLs directly. API tokens are not issued yet.
/api/stats/v1/overviewHeadline metrics, traffic timeseries, and the top five pages, sources, crawlers, and opportunities.
{
"data": {
"metrics": { "visitors": 1284, "pageviews": 3120, "events": 412, "crawler_requests": 908, "total_events": 4440 },
"traffic": [{ "date": "2026-08-01", "visitors": 41, "pageviews": 96, "bots": 23 }],
"pages": [{ "pathname": "/pricing", "visitors": 210, "views": 388 }],
"sources": [{ "source": "google.com", "visitors": 190, "views": 260 }],
"crawlers": [{ "crawler_family": "GPTBot", "crawler_category": "AI training", "requests": 412, "last_seen": "2026-08-08 09:12:04" }],
"opportunities": [{ "pathname": "/docs/v2", "requests": 38, "distinct_crawlers": 2, "crawler_families": "GPTBot, ClaudeBot", "last_seen": "2026-08-08 08:41:55" }],
"audience": { "countries": [], "devices": [], "browsers": [], "metrics": {} }
},
"meta": { "project": { "id": "demo", "name": "Sea", "slug": "sea" }, "range": "30d", "generated_at": "2026-08-08T09:15:00.000Z" }
}CSV columns · One row per headline metric (metric, value).
/api/stats/v1/pagesUp to 100 paths ordered by views, plus page totals for the window.
{
"data": {
"pages": [{ "pathname": "/pricing", "visitors": 210, "views": 388 }],
"metrics": { "pages": 34, "views": 3120, "visitors": 1284 }
},
"meta": { "project": { "id": "demo", "name": "Sea", "slug": "sea" }, "range": "30d", "generated_at": "2026-08-08T09:15:00.000Z" }
}CSV columns · pathname, visitors, views
/api/stats/v1/sourcesReferrer hosts ordered by visitors, including direct traffic and AI referral totals.
{
"data": {
"sources": [{ "source": "chatgpt.com", "visitors": 96, "views": 121 }],
"metrics": { "domains": 18, "visitors": 1284, "aiVisitors": 143 }
},
"meta": { "project": { "id": "demo", "name": "Sea", "slug": "sea" }, "range": "30d", "generated_at": "2026-08-08T09:15:00.000Z" }
}CSV columns · source, visitors, views
/api/stats/v1/crawlersCrawler families, their most recent requested paths, and 404 opportunities.
{
"data": {
"requests": 908,
"families": [{ "crawler_family": "GPTBot", "crawler_category": "AI training", "requests": 412, "last_seen": "2026-08-08 09:12:04" }],
"paths": [{ "timestamp": "2026-08-08 09:12:04", "crawler_family": "GPTBot", "crawler_category": "AI training", "pathname": "/blog", "method": "GET", "status": 200 }],
"opportunities": [{ "pathname": "/docs/v2", "requests": 38, "distinct_crawlers": 2, "crawler_families": "GPTBot, ClaudeBot", "last_seen": "2026-08-08 08:41:55" }],
"pagesDiscovered": 27
},
"meta": { "project": { "id": "demo", "name": "Sea", "slug": "sea" }, "range": "30d", "generated_at": "2026-08-08T09:15:00.000Z" }
}CSV columns · crawler_family, crawler_category, requests, last_seen
/api/stats/v1/eventsCustom event names ordered by volume, with reach and events-per-visitor metrics.
{
"data": {
"events": [{ "name": "signup_started", "events": 210, "visitors": 168, "last_seen": "2026-08-08 09:02:11" }],
"metrics": { "events": 412, "names": 9, "visitorReach": 340, "eventsPerVisitor": 1.21 }
},
"meta": { "project": { "id": "demo", "name": "Sea", "slug": "sea" }, "range": "30d", "generated_at": "2026-08-08T09:15:00.000Z" }
}CSV columns · name, events, visitors, last_seen