Reference
API
A JSON API under /api/v1, authenticated with an x-access-token header. No cookie, no session: a token is the whole credential. The same token also opens the MCP server at /mcp.
Getting a token
Create one in an event's admin under Settings, API. The token is shown once, at creation. Only its hash is stored, so it cannot be recovered later, only revoked and replaced. A token reaches exactly the events the person who created it can open, on this API and over MCP alike.
export TOKEN=osk_... curl -H "x-access-token: $TOKEN" "https://opensession.opensession.workers.dev/api/v1/events"
Shape of a response
Collections share one envelope. Single records come back as { "data": { ... } }.
{
"data": [ ... ],
"page": 1,
"pageSize": 25,
"total": 42,
"totalPages": 2
}Paginate with page and pageSize, as query parameters or in a POST body. pageSize is capped at 100.
Errors
Errors are JSON with a stable code, never an HTML page.
{ "error": { "code": "invalid_token", "message": "That access token is not valid." } }401 missing or invalid token, 404 unknown event or record, 405 wrong method, 422 the body was understood but rejected, 400 the body was not valid JSON.
Endpoints
GET
/api/v1/eventsList events, newest first.
curl -H "x-access-token: $TOKEN" \ "https://opensession.opensession.workers.dev/api/v1/events?page=1&pageSize=25"
GET
/api/v1/event/:eventIdOne event, with submission, session, and public counts.
curl -H "x-access-token: $TOKEN" \ "https://opensession.opensession.workers.dev/api/v1/event/1"
POST
/api/v1/event/:eventId/sessionsSearch sessions. Filters go in the body: q, status, track, format, room, publicState, isAbstract, isDraft, scheduled.
curl -X POST -H "x-access-token: $TOKEN" -H "content-type: application/json" \ -d '{"q":"caching","status":"accepted","page":1,"pageSize":10}' \ "https://opensession.opensession.workers.dev/api/v1/event/1/sessions"GET
/api/v1/event/:eventId/sessionsThe same collection without a body, for a plain paginated list.
curl -H "x-access-token: $TOKEN" \ "https://opensession.opensession.workers.dev/api/v1/event/1/sessions?pageSize=5"
POST
/api/v1/event/:eventId/sessionsCreate a session. A body carrying "create" is a write rather than a search.
curl -X POST -H "x-access-token: $TOKEN" -H "content-type: application/json" \ -d '{"create":{"title":"Observability on a Budget","abstract":"What you actually need.","trackId":3}}' \ "https://opensession.opensession.workers.dev/api/v1/event/1/sessions"GET
/api/v1/event/:eventId/sessions/:sessionIdOne session with its speakers, track, format, room, and schedule.
curl -H "x-access-token: $TOKEN" \ "https://opensession.opensession.workers.dev/api/v1/event/1/sessions/1"
PATCH
/api/v1/event/:eventId/sessions/:sessionIdUpdate a session. Accepts title, abstract, trackId, formatId, levelId, roomId, startsAt, endsAt, isDraft, publicState, and status or statusId.
curl -X PATCH -H "x-access-token: $TOKEN" -H "content-type: application/json" \ -d '{"status":"accepted","roomId":1,"startsAt":"2027-06-10T17:00:00Z","endsAt":"2027-06-10T17:45:00Z"}' \ "https://opensession.opensession.workers.dev/api/v1/event/1/sessions/1"DELETE
/api/v1/event/:eventId/sessions/:sessionIdDelete a session and its speaker links.
curl -X DELETE -H "x-access-token: $TOKEN" \ "https://opensession.opensession.workers.dev/api/v1/event/1/sessions/42"
GET
/api/v1/event/:eventId/contactsEveryone on the event: roster members and anyone on a session.
curl -H "x-access-token: $TOKEN" \ "https://opensession.opensession.workers.dev/api/v1/event/1/contacts"
GET
/api/v1/event/:eventId/statusesDecision statuses, with their system keys.
curl -H "x-access-token: $TOKEN" \ "https://opensession.opensession.workers.dev/api/v1/event/1/statuses"
GET
/api/v1/event/:eventId/tracksTracks, in display order.
curl -H "x-access-token: $TOKEN" \ "https://opensession.opensession.workers.dev/api/v1/event/1/tracks"
GET
/api/v1/event/:eventId/formatsFormats, with their default durations.
curl -H "x-access-token: $TOKEN" \ "https://opensession.opensession.workers.dev/api/v1/event/1/formats"
GET
/api/v1/event/:eventId/roomsRooms, with capacities.
curl -H "x-access-token: $TOKEN" \ "https://opensession.opensession.workers.dev/api/v1/event/1/rooms"
MCP server
The same data over the Model Context Protocol, so an AI agent can run the conference program directly. Streamable HTTP transport at https://opensession.opensession.workers.dev/mcp, JSON-RPC 2.0 over a single POST. Every tool wraps the endpoints above; nothing here can do more than a token can do.
Authenticate with the same token, as an x-access-token header or as Authorization: Bearer. A request with neither gets a JSON-RPC error saying where to make one. Tools reach only the events the organizer who created the token can open, which is narrower than the REST endpoints above.
curl -X POST -H "x-access-token: $TOKEN" -H "content-type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"curl","version":"1"}}}' \
"https://opensession.opensession.workers.dev/mcp"Tools
list_eventsEvents this token can reach. Start here: it returns the eventId every other tool needs.
search_sessionsSearch sessions by free text, status, track, format, room, and scheduled state.
get_sessionOne session with speakers, status, track, format, room, and schedule.
update_sessionChange title, abstract, status, track, room, or start and end time.
list_speakersThe speaker roster with confirmation status and task and file counts.
get_speakerOne speaker with bio, sessions, and outstanding work.
list_submissions_by_statusThe submissions queue for one status, with review score averages.
accept_submissionSet a submission to Accepted, or to the Accept Queue with queue: true.
decline_submissionSet a submission to Declined, with optional feedback stored on the record.
get_agendaRooms, days, scheduled and unscheduled sessions, and the double-booking conflicts.
list_open_tasksSpeaker tasks and file requests still outstanding, marked todo or overdue.
Decision tools change status only. Sending acceptance and decline email stays the explicit step under Communications, Send decisions, which is where the templates and the calendar attachment live.
Claude Code
One command, or the JSON block if you would rather edit the file.
claude mcp add --transport http opensession https://opensession.opensession.workers.dev/mcp \ --header "x-access-token: $TOKEN"
{
"mcpServers": {
"opensession": {
"type": "http",
"url": "https://opensession.opensession.workers.dev/mcp",
"headers": { "x-access-token": "osk_..." }
}
}
}Codex
Add this to ~/.codex/config.toml.
[mcp_servers.opensession]
url = "https://opensession.opensession.workers.dev/mcp"
http_headers = { "x-access-token" = "osk_..." }