{"version":1,"pages":[{"id":"VCUz989r1rYCOlQhZxyp","title":"Welcome","pathname":"/","siteSpaceId":"sitesp_yiUCw","description":"API-first, privacy-respecting analytics for vibe coders, small startups, and AI agents."},{"id":"QNSR8UGvQRIiEsMB3avM","title":"Quickstart","pathname":"/quickstart","siteSpaceId":"sitesp_yiUCw","description":""},{"id":"zOmXD8D6Z1XdnujZgM19","title":"Architecture","pathname":"/architecture","siteSpaceId":"sitesp_yiUCw","description":""},{"id":"G2jdK08mSvS23xufd8OF","title":"Events","pathname":"/core-concepts/events","siteSpaceId":"sitesp_yiUCw","description":"What an event is, how to send one, and what the server adds.","breadcrumbs":[{"label":"Core concepts"}]},{"id":"RNgl6CqqIcTi5d29idJi","title":"Properties","pathname":"/core-concepts/properties","siteSpaceId":"sitesp_yiUCw","description":"What to put in `properties`, what the SDK adds automatically, and how to design a clean schema.","breadcrumbs":[{"label":"Core concepts"}]},{"id":"Djxv7ctWbC4Vc9sG1gGa","title":"Identities","pathname":"/core-concepts/identities","siteSpaceId":"sitesp_yiUCw","description":"anonymous_id, user_id, and how /v1/identify stitches them together.","breadcrumbs":[{"label":"Core concepts"}]},{"id":"N31am8ZEGeefNqd8QUAH","title":"Sessions","pathname":"/core-concepts/sessions","siteSpaceId":"sitesp_yiUCw","description":"How session_id is derived, when to override it, and what the sessions view does for you.","breadcrumbs":[{"label":"Core concepts"}]},{"id":"DcOdy39UFOjblnY7ivtR","title":"API keys","pathname":"/core-concepts/api-keys","siteSpaceId":"sitesp_yiUCw","description":"pk_, sk_, rk_, ak_ — when to use which.","breadcrumbs":[{"label":"Core concepts"}]},{"id":"Rdi2exwFdYwHJLKm5axA","title":"Attribution & the classifier","pathname":"/core-concepts/attribution","siteSpaceId":"sitesp_yiUCw","description":"How the classifier turns a URL + referrer into (source, medium, confidence).","breadcrumbs":[{"label":"Core concepts"}]},{"id":"focGMANbVs3X4N2VyUr8","title":"Privacy & data retention","pathname":"/core-concepts/privacy","siteSpaceId":"sitesp_yiUCw","description":"Exactly what gets stored, and what doesn't.","breadcrumbs":[{"label":"Core concepts"}]},{"id":"4b9phx1osltUnpEkrdNp","title":"Overview","pathname":"/api-reference/overview","siteSpaceId":"sitesp_yiUCw","description":"Base URL, auth, content type, errors, rate limits.","breadcrumbs":[{"label":"API reference"}]},{"id":"LSrgOvW3pUGTZO0ijy10","title":"POST /v1/track","pathname":"/api-reference/track","siteSpaceId":"sitesp_yiUCw","description":"POST /v1/track — emit a single event.","breadcrumbs":[{"label":"API reference"}]},{"id":"1QB0iP05GHDhUunmmaZK","title":"POST /v1/batch","pathname":"/api-reference/batch","siteSpaceId":"sitesp_yiUCw","description":"POST /v1/batch — emit up to 1000 events in one call.","breadcrumbs":[{"label":"API reference"}]},{"id":"UVciADWamylgHyc9eI7m","title":"POST /v1/identify","pathname":"/api-reference/identify","siteSpaceId":"sitesp_yiUCw","description":"POST /v1/identify — link an anonymous_id to a user_id.","breadcrumbs":[{"label":"API reference"}]},{"id":"CsVOItlleEIpsqcgOzDo","title":"POST /v1/forget","pathname":"/api-reference/forget","siteSpaceId":"sitesp_yiUCw","description":"POST /v1/forget — GDPR delete for a user.","breadcrumbs":[{"label":"API reference"}]},{"id":"66iEE5JpZC0iOjhr3OSE","title":"GET /v1/query","pathname":"/api-reference/query","siteSpaceId":"sitesp_yiUCw","description":"GET /v1/query — return raw events filtered by time range.","breadcrumbs":[{"label":"API reference"}]},{"id":"uzRU1wJUJIkFQoi87eAX","title":"GET /v1/stats","pathname":"/api-reference/stats","siteSpaceId":"sitesp_yiUCw","description":"GET /v1/stats — aggregations over events.","breadcrumbs":[{"label":"API reference"}]},{"id":"1sOFYZ8b29oserQjJqyj","title":"GET /v1/sources","pathname":"/api-reference/sources","siteSpaceId":"sitesp_yiUCw","description":"GET /v1/sources — top sources/mediums with the FB social-vs-paid split.","breadcrumbs":[{"label":"API reference"}]},{"id":"jTfo44GVdELz4ySsIanM","title":"Browser — @millimetric/track","pathname":"/sdks/browser","siteSpaceId":"sitesp_yiUCw","description":"@millimetric/track — the browser SDK. ~1.8 KB gzipped.","breadcrumbs":[{"label":"SDKs"}]},{"id":"m17I8XeWsuBDuGHVgnem","title":"Node — @millimetric/track-node","pathname":"/sdks/node","siteSpaceId":"sitesp_yiUCw","description":"@millimetric/track-node — server-side SDK. Node 18+ / Bun / Deno.","breadcrumbs":[{"label":"SDKs"}]},{"id":"QRWFcoB43nMXOY55b2P4","title":"curl & raw HTTP","pathname":"/sdks/curl","siteSpaceId":"sitesp_yiUCw","description":"Plain HTTP — no SDK required.","breadcrumbs":[{"label":"SDKs"}]},{"id":"RXl3yNk0COUJaLY4s0xN","title":"Framework recipes","pathname":"/sdks/frameworks","siteSpaceId":"sitesp_yiUCw","description":"Drop-in setup for React, Next.js, Vue, Svelte, and other JS frameworks.","breadcrumbs":[{"label":"SDKs"}]},{"id":"EH6IjkT2U0tDNa41K9P1","title":"React","pathname":"/sdks/frameworks/react","siteSpaceId":"sitesp_yiUCw","description":"React (Vite, CRA, Remix client) + @millimetric/track.","breadcrumbs":[{"label":"SDKs"},{"label":"Framework recipes"}]},{"id":"x6TWcQiUCCbrFDgIinbn","title":"Next.js","pathname":"/sdks/frameworks/nextjs","siteSpaceId":"sitesp_yiUCw","description":"Next.js (App Router and Pages) + @millimetric/track. Covers RSC and edge.","breadcrumbs":[{"label":"SDKs"},{"label":"Framework recipes"}]},{"id":"5CsVSttSAevmGAiljZoa","title":"Vue","pathname":"/sdks/frameworks/vue","siteSpaceId":"sitesp_yiUCw","description":"Vue 3 (and Nuxt) + @millimetric/track.","breadcrumbs":[{"label":"SDKs"},{"label":"Framework recipes"}]},{"id":"9AGhb3cW1wOnNtpyuYbR","title":"Svelte / SvelteKit","pathname":"/sdks/frameworks/svelte","siteSpaceId":"sitesp_yiUCw","description":"Svelte 5 / SvelteKit + @millimetric/track.","breadcrumbs":[{"label":"SDKs"},{"label":"Framework recipes"}]},{"id":"plKJjdbhhQkJY6QxAO7f","title":"MCP server","pathname":"/mcp-for-ai-agents/overview","siteSpaceId":"sitesp_yiUCw","description":"The MCP server — AI agents emit and query analytics natively.","breadcrumbs":[{"label":"MCP for AI agents"}]},{"id":"YKJMs0D0bzoePgwCsrvR","title":"Overview","pathname":"/recipes/recipes","siteSpaceId":"sitesp_yiUCw","description":"End-to-end worked examples for the things people actually want to do.","breadcrumbs":[{"label":"Recipes"}]},{"id":"aUW0cbMWygU1d4MgI5io","title":"Track a signup funnel","pathname":"/recipes/signup-funnel","siteSpaceId":"sitesp_yiUCw","description":"A full signup funnel — pageview, CTA click, form view, signup, activation — with drop-off queries.","breadcrumbs":[{"label":"Recipes"}]},{"id":"mbVnMmRGU1f5GxPog6Gc","title":"E-commerce events","pathname":"/recipes/ecommerce","siteSpaceId":"sitesp_yiUCw","description":"A standard e-commerce taxonomy with revenue and AOV queries.","breadcrumbs":[{"label":"Recipes"}]},{"id":"GeJ15mLbvjYNFZiTY2Gg","title":"Marketing attribution dashboards","pathname":"/recipes/marketing-attribution","siteSpaceId":"sitesp_yiUCw","description":"First-touch vs last-touch, the FB social-vs-paid split, channel ROI.","breadcrumbs":[{"label":"Recipes"}]},{"id":"wa7AUIDr0J9oSTFsgZHy","title":"Server-side events from a backend","pathname":"/recipes/server-side","siteSpaceId":"sitesp_yiUCw","description":"When to track from your backend, how to thread anonymous_id, and patterns for batching.","breadcrumbs":[{"label":"Recipes"}]},{"id":"lrU4av6tgjqKypubtyoB","title":"Link anonymous → known users","pathname":"/recipes/anonymous-to-known","siteSpaceId":"sitesp_yiUCw","description":"Stitching pre-login activity to the post-login user, including multi-device.","breadcrumbs":[{"label":"Recipes"}]},{"id":"lByqBC9qM9ynLZYqsbzw","title":"GDPR right-to-be-forgotten","pathname":"/recipes/gdpr-delete","siteSpaceId":"sitesp_yiUCw","description":"A complete /v1/forget flow including audit-trail patterns and what doesn't get deleted.","breadcrumbs":[{"label":"Recipes"}]},{"id":"jAvKPRtYYY7bDll0QUQk","title":"Funnel & retention analysis","pathname":"/recipes/funnels","siteSpaceId":"sitesp_yiUCw","description":"SQL templates for n-step funnels, day-N retention, and time-to-event.","breadcrumbs":[{"label":"Recipes"}]},{"id":"SzSMo5ytDM6S19wQzfSt","title":"Event schema","pathname":"/reference/event-schema","siteSpaceId":"sitesp_yiUCw","description":"Full Zod schemas, ClickHouse columns, and what's required vs optional.","breadcrumbs":[{"label":"Reference"}]},{"id":"L16H42Ve7VfYTDmgwBLK","title":"Event & property naming","pathname":"/reference/event-naming","siteSpaceId":"sitesp_yiUCw","description":"A short, opinionated style guide for event and property names.","breadcrumbs":[{"label":"Reference"}]},{"id":"80C7HSRMnkirucJScozC","title":"Errors","pathname":"/reference/errors","siteSpaceId":"sitesp_yiUCw","description":"Every error code the API can return, what triggers it, and how to fix it.","breadcrumbs":[{"label":"Reference"}]},{"id":"NPUlDD6lHmFXZHnNf7yl","title":"Rate limits","pathname":"/reference/rate-limits","siteSpaceId":"sitesp_yiUCw","description":"Per-project, per-route token buckets — and how to stay under them.","breadcrumbs":[{"label":"Reference"}]}]}