{"name":"Spoar API","baseUrl":"https://api.analytics.remcostoeten.nl","links":{"docs":"https://api.analytics.remcostoeten.nl/v2/openapi","openapi":"https://api.analytics.remcostoeten.nl/v2/openapi/json","health":"https://api.analytics.remcostoeten.nl/v2/health","source":"https://github.com/remcostoeten/analytics"},"health":{"ok":true,"version":"2.0.0-next","time":"2026-10-03T10:48:23.338Z","runtime":"bun 1.3.14","bootedAt":"2026-10-03T10:47:13.483Z","geo":{"city":"/var/task/apps/api/data/GeoLite2-City.mmdb","asn":"/var/task/apps/api/data/GeoLite2-ASN.mmdb","loadMs":810}},"groups":[{"name":"Ingest","description":"Send events from browsers and servers","routes":[{"method":"POST","path":"/v2/events","summary":"Send a batch of events"}]},{"name":"Sign-in","description":"GitHub sign-in through Better Auth and the current session","routes":[{"method":"GET","path":"/v2/auth/session","summary":"Current session"}]},{"name":"Projects","description":"Projects, their visibility and keys","routes":[{"method":"GET","path":"/v2/projects","summary":"List projects"},{"method":"POST","path":"/v2/projects","summary":"Create a project"},{"method":"GET","path":"/v2/projects/:project","summary":"Get a project"},{"method":"PATCH","path":"/v2/projects/:project","summary":"Change project settings"},{"method":"POST","path":"/v2/projects/:project/keys","summary":"Rotate a key"}]},{"name":"Tokens","description":"API tokens for scripts and CI","routes":[{"method":"GET","path":"/v2/tokens","summary":"List API tokens"},{"method":"POST","path":"/v2/tokens","summary":"Create an API token"},{"method":"DELETE","path":"/v2/tokens/:token","summary":"Revoke an API token"}]},{"name":"Reads","description":"Aggregate reads for one project","routes":[{"method":"GET","path":"/v2/projects/:project/breakdown/:dimension","summary":"Top values of a dimension"},{"method":"GET","path":"/v2/projects/:project/heatmap","summary":"Weekday and hour heatmap"},{"method":"GET","path":"/v2/projects/:project/lifecycle","summary":"New, returning, resurrected and dormant visitors"},{"method":"GET","path":"/v2/projects/:project/map","summary":"Visitors per place"},{"method":"GET","path":"/v2/projects/:project/paths","summary":"Where visitors went next"},{"method":"GET","path":"/v2/projects/:project/realtime","summary":"The last five minutes"},{"method":"GET","path":"/v2/projects/:project/realtime/events","summary":"Live events"},{"method":"GET","path":"/v2/projects/:project/retention","summary":"Returning visitors by cohort"},{"method":"GET","path":"/v2/projects/:project/stats","summary":"Headline numbers"},{"method":"GET","path":"/v2/projects/:project/stickiness","summary":"Visitors by days active"},{"method":"GET","path":"/v2/projects/:project/timeseries","summary":"One metric over time"}]},{"name":"Visitor-level reads","description":"Events, visitors and sessions at the detail level","routes":[{"method":"GET","path":"/v2/projects/:project/events","summary":"Raw events"},{"method":"GET","path":"/v2/projects/:project/sessions","summary":"Sessions"},{"method":"GET","path":"/v2/projects/:project/sessions/:session/events","summary":"One session's events"},{"method":"GET","path":"/v2/projects/:project/visitors","summary":"Visitors"},{"method":"GET","path":"/v2/projects/:project/visitors/:visitor","summary":"One visitor"},{"method":"PATCH","path":"/v2/projects/:project/visitors/:visitor","summary":"Mark a visitor as internal"},{"method":"GET","path":"/v2/projects/:project/visitors/:visitor/visits","summary":"A visitor's visits"}]},{"name":"All projects","description":"The same reads across every readable project","routes":[{"method":"GET","path":"/v2/breakdown/:dimension","summary":"Top values of a dimension across projects"},{"method":"GET","path":"/v2/breakdown/project","summary":"One row per project"},{"method":"GET","path":"/v2/events","summary":"Raw events across projects"},{"method":"GET","path":"/v2/heatmap","summary":"Weekday and hour heatmap across projects"},{"method":"GET","path":"/v2/issues","summary":"Issues across projects"},{"method":"GET","path":"/v2/lifecycle","summary":"Visitor lifecycle across projects"},{"method":"GET","path":"/v2/map","summary":"Visitors per place across projects"},{"method":"GET","path":"/v2/paths","summary":"Where visitors went next, across projects"},{"method":"GET","path":"/v2/people","summary":"Identified people"},{"method":"GET","path":"/v2/people/:userId","summary":"One person across projects"},{"method":"GET","path":"/v2/realtime","summary":"The last five minutes across projects"},{"method":"GET","path":"/v2/realtime/events","summary":"Live events across projects"},{"method":"GET","path":"/v2/retention","summary":"Returning visitors by cohort, across projects"},{"method":"GET","path":"/v2/sessions","summary":"Sessions across projects"},{"method":"GET","path":"/v2/speed","summary":"Speed across projects"},{"method":"GET","path":"/v2/speed/elements","summary":"Elements behind slow values across projects"},{"method":"GET","path":"/v2/speed/routes","summary":"Speed per route across projects"},{"method":"GET","path":"/v2/speed/timeseries","summary":"One metric per day across projects"},{"method":"GET","path":"/v2/stats","summary":"Headline numbers across projects"},{"method":"GET","path":"/v2/stickiness","summary":"Visitors by days active, across projects"},{"method":"GET","path":"/v2/timeseries","summary":"One metric over time across projects"},{"method":"GET","path":"/v2/visitors","summary":"Visitors across projects"}]},{"name":"Speed","description":"Core Web Vitals and the Real Experience Score","routes":[{"method":"GET","path":"/v2/projects/:project/speed","summary":"Speed and the Real Experience Score"},{"method":"GET","path":"/v2/projects/:project/speed/elements","summary":"Elements behind slow values"},{"method":"GET","path":"/v2/projects/:project/speed/routes","summary":"Speed per route"},{"method":"GET","path":"/v2/projects/:project/speed/timeseries","summary":"One metric per day"}]},{"name":"Issues","description":"Error tracking, issues and error rules","routes":[{"method":"GET","path":"/v2/projects/:project/error-rules","summary":"Error rules"},{"method":"POST","path":"/v2/projects/:project/error-rules","summary":"Add an error rule"},{"method":"DELETE","path":"/v2/projects/:project/error-rules/:rule","summary":"Remove an error rule"},{"method":"GET","path":"/v2/projects/:project/issues","summary":"Issues"},{"method":"GET","path":"/v2/projects/:project/issues/:issue","summary":"One issue"},{"method":"PATCH","path":"/v2/projects/:project/issues/:issue","summary":"Resolve, ignore or reopen an issue"},{"method":"GET","path":"/v2/projects/:project/issues/:issue/events","summary":"An issue's events"}]},{"name":"SQL","description":"The read-only SQL console and saved queries","routes":[{"method":"POST","path":"/v2/projects/:project/query","summary":"Run SQL on one project"},{"method":"GET","path":"/v2/queries","summary":"Saved queries"},{"method":"POST","path":"/v2/queries","summary":"Save a query"},{"method":"GET","path":"/v2/queries/:query","summary":"One saved query"},{"method":"PATCH","path":"/v2/queries/:query","summary":"Change a saved query"},{"method":"DELETE","path":"/v2/queries/:query","summary":"Delete a saved query"},{"method":"GET","path":"/v2/queries/history","summary":"Latest query runs"},{"method":"POST","path":"/v2/query","summary":"Run SQL across projects"},{"method":"POST","path":"/v2/query/explain","summary":"Estimate a query's cost"},{"method":"GET","path":"/v2/query/schema","summary":"The queryable views"}]},{"name":"Jobs","description":"Scheduled jobs and operations metrics","routes":[{"method":"POST","path":"/v2/admin/jobs/alerts","summary":"Queue and send alerts"},{"method":"POST","path":"/v2/admin/jobs/cleanup","summary":"Delete expired rows"},{"method":"POST","path":"/v2/admin/jobs/crux","summary":"Compare speed with the Chrome UX Report"},{"method":"POST","path":"/v2/admin/jobs/rollup","summary":"Roll up speed"},{"method":"GET","path":"/v2/admin/metrics","summary":"Operations metrics"}]},{"name":"System","description":"Health and documentation","routes":[{"method":"GET","path":"/v2/health","summary":"Liveness, version and cold start details"}]}],"history":null}