The Vibefollow API is a small, JSON-over-HTTPS surface. The TypeScript SDK wraps it — everything documented here is what the SDK does under the hood.Documentation Index
Fetch the complete documentation index at: https://docs.vibefollow.com/llms.txt
Use this file to discover all available pages before exploring further.
Base URL
All endpoints are namespaced under
/api/v1. Future major versions will use a new namespace (/api/v2); v1 will remain available indefinitely.Endpoint catalog
POST /api/v1/users
Upsert a user.
POST /api/v1/events
Track a single event.
POST /api/v1/events/batch
Track multiple events in one POST.
The customer-facing API surface is intentionally narrow. The Vibefollow backend exposes a much larger surface for the in-dashboard product (drafts, audiences, sequences, etc.) — those endpoints aren’t part of the public contract.
Response envelope
Successful responses always wrap their payload in{ data, meta? }:
meta.pagination:
Error envelope
Errors return a non-2xx status and a body shaped as{ errors: [{ code, message, field? }] }:
code is a machine-readable identifier (snake_case). message is human-readable. field names the offending field when applicable. The SDK maps each status to a typed error class — see Errors.
Idempotency
Every mutating request should carry anIdempotency-Key header:
The SDK generates a v4 UUID on every request. The backend dedupes within a 24-hour window — if the same key arrives twice, the second request returns the first response and no work is duplicated.
5xx, 429, or network failures. The SDK does this automatically.
Rate limits
Per-project, per-endpoint limits apply. When you exceed a limit you get:Retry-After seconds before retrying. The SDK does this for you — RateLimitError is only thrown after retries are exhausted.
Authentication
All endpoints require an API key in theAuthorization header:
Content types
Requests must beContent-Type: application/json. Responses are always JSON. Bodies are UTF-8 encoded.
Timestamps
All timestamps in request and response bodies are ISO 8601 strings in UTC:The backend stores timestamps as
TIMESTAMPTZ; UI renders them in the user’s timezone.