For developers

The Surf API

Watch and Ride are public reads; Web starts a task at OpenVibe.Actor as the signed-in person. Errors are RFC 9457 application/problem+json.

GET /api/v1/watch/feed?topic=all|live|clips|moments&cursor=
The merged OpenVibe.Live feed: who is live (by viewers), then clips and AI moments by freshness, never two from one channel in a row. Each item says why it is on. Cached 30 s; a source that did not answer is named in sources.
GET /api/v1/ride/maps
The surf maps from OpenVibe.Games: id, name, tier, stages, author, runs, the record. Cached 60 s.
GET /api/v1/ride/maps/:id
One map, its fastest runs and its embed_url.
POST /api/v1/web/tasks
Signed in, from this site: { query } (3–500 characters) starts an OpenVibe.Actor task as you and answers { task_id, page }; the page is in Surf.
GET /api/v1/web/tasks/:id
Your Actor task state, desk link, sources and final report, fetched with your token.
GET /api/v1/web/tasks/:id/events
Your live Actor steps as server-sent events.
POST /watch/party · GET /watch/p/:id/events
Watch together: signed in and same-site, opens an in-memory party at /watch/p/<id> (303, or 201 JSON). The SSE stream carries the host's { channel_key, position_s, playing, at } commands to every member; a restart ends the party.