API
Ohlow has two HTTP surfaces. The app API under /api powers the website and editor and is authenticated with your session cookie. The public API under /v1 is served by the Rust service (apps/api) and is read-only.
Public API (v1)
| Method | Path | Returns |
|---|---|---|
GET | /v1/health | Service health (Rust API) |
GET | /v1/profiles/{username} | Public profile: display name, avatar, signal, published pages |
GET | /v1/profiles/{username}/pages/{slug} | Published page document (validated, version 1) |
GET | /v1/profiles/{username}/stats | Public totals: views (bots excluded) |
Only public, published data is exposed. Unlisted and private pages, emails, analytics details and drafts never are.
Errors
Every error has the same shape on both surfaces:
{ "error": { "code": "not_found", "message": "Profile not found." } }Rate limits
Public endpoints allow 120 requests per minute per IP. Exceeding it returns 429 with code rate_limited.
Page document format
Pages are JSON documents with schema: "ohlow.page" and version: 1: a mode, a theme (tokens, fonts, moods), scenes, a flat map of elements (each with geometry, style, props, overrides per breakpoint, motion and interactions) and variables. The TypeScript types live in packages/schema, and every write is validated against the same Zod schema.
Roadmap
Personal API tokens, write endpoints, webhooks and generated SDKs are planned. They're not available yet.