Public API reference
Rostrum exposes a deliberately small, read-only JSON API for published event data. It is a projection, not a serialization of internal workspace state.
Base URL in a local run: http://localhost:8080.
Conventions
- All
/api/healthand/api/v1/*endpoints useGETand return JSON withContent-Type: application/json; charset=utf-8. - Timestamps are RFC 3339 values. Event/session timestamps retain their configured offset; the health timestamp is UTC.
- Public API responses use
Cache-Control: publicand an ETag. - Unknown or unpublished material is omitted; there is no draft flag in the public projection.
- There is no authentication for
/api/healthor/api/v1/*. - Rostrum does not currently publish an OpenAPI document.
Health
GET /api/health
curl -fsS http://localhost:8080/api/health
{
"app": "Rostrum",
"ok": true,
"time": "2026-08-12T20:23:05Z",
"version": "<deployment release or commit>"
}
Cache: 30 seconds. version comes from ROSTRUM_VERSION; operators should set
it to an immutable release tag or commit SHA.
Workspace directory
GET /api/v1/workspace
This is the discovery endpoint. It returns public event metadata, published counts, and stable links to the other projections and public pages.
curl -fsS http://localhost:8080/api/v1/workspace
{
"name": "Rostrum public API",
"version": "v1",
"event": {
"id": "evt_m31_forum_2026",
"name": "M31 Systems Forum 2026",
"slug": "m31-systems-forum-2026",
"theme": "Tools for governed, collaborative intelligence",
"description": "…",
"location": "San Francisco, California",
"timeZone": "America/Los_Angeles",
"startsAt": "2026-10-14T09:00:00-07:00",
"endsAt": "2026-10-16T18:00:00-07:00"
},
"counts": {
"publishedSessions": 6,
"publishedSpeakers": 6
},
"links": {
"self": "/api/v1/workspace",
"schedule": "/api/v1/schedule",
"speakers": "/api/v1/speakers",
"agenda": "/public/m31-systems-forum-2026/agenda",
"gallery": "/public/m31-systems-forum-2026/speakers"
}
}
Counts above describe the fictional evaluation fixture under examples/demo/.
A fresh or operator-owned workspace returns its own values. Cache: 60 seconds.
Published schedule
GET /api/v1/schedule
curl -fsS http://localhost:8080/api/v1/schedule
Top-level fields:
| Field | Type | Meaning |
|---|---|---|
eventId |
string | Canonical event ID |
timeZone |
string | IANA event timezone |
sessions |
array | Published sessions ordered by start time, then title |
Each session contains:
| Field | Type |
|---|---|
id, title, description, format |
string |
trackId, track, roomId, room |
string |
speakerIds |
array of strings |
startsAt, endsAt |
RFC 3339 timestamp |
status |
string; always published in this projection |
Draft, cancelled, and unscheduled sessions are not returned. Cache: 60 seconds.
Published speakers
GET /api/v1/speakers
curl -fsS http://localhost:8080/api/v1/speakers
The response contains eventId and a name-sorted speakers array. A speaker
appears only when attached to at least one published session.
| Field | Type |
|---|---|
id, name, pronouns, role, company, biography, city |
string |
headshotUrl, websiteUrl, linkedInUrl |
string |
sessionIds |
array of published session IDs |
Email addresses, private task state, proposal text, and review data are never part of this endpoint. Cache: 60 seconds.
Public event calendar
GET /public-calendar/{event-slug}.ics
curl -fsS -o rostrum-program.ics \
http://localhost:8080/public-calendar/m31-systems-forum-2026.ics
This anonymous RFC 5545 feed contains the same published sessions as the
public agenda. Stable session IDs become stable VEVENT UIDs. Draft,
cancelled, and unscheduled sessions are excluded, and no speaker identity or
private workspace state is added beyond already-public session content.
Response type: text/calendar; charset=utf-8. Cache: public, 60 seconds.
Private downloads
These routes are interfaces but are not anonymous public API endpoints:
| Route | Authority | Response |
|---|---|---|
GET /calendar/{speaker}.ics?key={signed-token} |
Matching signed token, bound speaker session, or organizer-facing session | RFC 5545 calendar containing published sessions for that speaker |
GET /portal-file/{completion} |
Owning speaker session or organizer-facing session | Private approved/uploaded file |
GET /organizer/export/submissions.csv |
Organizer or chair | Formula-safe submissions CSV |
GET /organizer/export/workspace.json |
Organizer or chair | Checksummed versioned workspace envelope |
GET /organizer/export/archive.tar.gz |
Organizer or chair | Workspace, uploads, and audit segments |
GET /organizer/export/approved-uploads.zip |
Organizer or chair | Deterministic approved-file bundle plus manifest |
Organizer downloads return Cache-Control: private, no-store. Unauthorized
private file and calendar requests avoid revealing whether the requested
record exists.
Compatibility
The path prefix is the API version. Additive fields may appear within v1;
clients should ignore unknown object members. A breaking shape change should
use a new path prefix. The current repository does not promise a release
cadence or hosted availability SLA.
The serializer and its privacy contract are tested in
internal/publicapi/public_test.go.