{"openapi":"3.1.0","info":{"title":"NeoConference API","version":"1.0.0","description":"Public REST API for creating meetings, minting guest join tokens, and accessing events, replays and recordings. Authenticate with an API key created in your NeoConference dashboard."},"servers":[{"url":"https://www.neoconference.app/api/v1","description":"Production"}],"security":[{"ApiKeyAuth":[]}],"tags":[{"name":"Meetings","description":"Create and manage meeting rooms."},{"name":"Tokens","description":"Mint guest join tokens."},{"name":"Events","description":"Events and cinematic replays."},{"name":"Recordings","description":"Cloud recordings and downloads."}],"paths":{"/meetings":{"get":{"tags":["Meetings"],"summary":"List meetings","responses":{"200":{"description":"A list of meetings.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeetingList"}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}},"post":{"tags":["Meetings"],"summary":"Create a meeting","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMeeting"}}}},"responses":{"201":{"description":"Meeting created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeetingEnvelope"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"description":"Plan limit exceeded."}}}},"/meetings/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Meetings"],"summary":"Get a meeting","responses":{"200":{"description":"The meeting.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeetingEnvelope"}}}},"404":{"$ref":"#/components/responses/NotFound"}}},"delete":{"tags":["Meetings"],"summary":"End a meeting","responses":{"200":{"description":"Meeting ended.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeetingEnvelope"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/meetings/{id}/tokens":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"post":{"tags":["Tokens"],"summary":"Create a guest join token","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateToken"}}}},"responses":{"201":{"description":"Join token minted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenEnvelope"}}}},"404":{"$ref":"#/components/responses/NotFound"},"409":{"description":"Meeting already ended."}}}},"/meetings/{id}/recordings":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Recordings"],"summary":"List recordings","responses":{"200":{"description":"Recordings with presigned download URLs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordingList"}}}},"404":{"$ref":"#/components/responses/NotFound"}},"description":"The meeting's recordings, newest first: each one's video and its audio-only copy, with download links that work for an hour. Files appear once a recording is stopped."},"post":{"tags":["Recordings"],"summary":"Start recording","description":"Start recording the meeting. Needs the owner's plan to include recording (Pro and above), within its hours this month, and someone in the meeting.","responses":{"201":{"description":"Recording started.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordingStarted"}}}},"402":{"description":"plan_upgrade_required or recording_hours_used.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"$ref":"#/components/responses/NotFound"},"409":{"description":"meeting_ended, or recording_not_started (nobody has joined yet).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"tags":["Recordings"],"summary":"Stop recording","description":"Stop every recording running in the meeting. Ending the meeting stops them too.","responses":{"200":{"description":"How many recordings were stopped.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordingsStopped"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/events":{"get":{"tags":["Events"],"summary":"List events","responses":{"200":{"description":"A list of events.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventList"}}}},"401":{"$ref":"#/components/responses/Unauthorized"}},"description":"Your events — the meetings you made on neoconference.app — newest first."}},"/events/{slug}":{"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Events"],"summary":"Get an event","responses":{"200":{"description":"The event.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventEnvelope"}}}},"404":{"$ref":"#/components/responses/NotFound"}},"description":"One of your events. A renamed event is still found by its old slug."}},"/events/{slug}/recordings":{"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Recordings"],"summary":"List an event's recordings","description":"Recordings made with Record on the website, by you or a host, with download links that work for an hour.","responses":{"200":{"description":"The event's recordings.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordingList"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}}},"components":{"securitySchemes":{"ApiKeyAuth":{"type":"http","scheme":"bearer","description":"Pass your API key as a Bearer token: Authorization: Bearer nc_live_..."}},"responses":{"Unauthorized":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}},"Meeting":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"createdAt":{"type":"integer"},"maxParticipants":{"type":"integer"},"status":{"type":"string","enum":["open","ended"]}}},"MeetingEnvelope":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Meeting"}}},"MeetingList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Meeting"}}}},"CreateMeeting":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"maxParticipants":{"type":"integer"},"metadata":{"type":"object","additionalProperties":true}}},"CreateToken":{"type":"object","required":["identity"],"properties":{"identity":{"type":"string"},"displayName":{"type":"string"},"canPublish":{"type":"boolean"}}},"Token":{"type":"object","properties":{"token":{"type":"string"},"url":{"type":"string"},"expiresAt":{"type":"integer"}}},"TokenEnvelope":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Token"}}},"Event":{"type":"object","description":"A meeting made on neoconference.app.","properties":{"slug":{"type":"string","example":"sunday-service"},"title":{"type":"string","example":"Sunday Service"},"state":{"type":"string","enum":["scheduled","waiting","live","ended"]},"visibility":{"type":"string","enum":["public","unlisted","private"]},"url":{"type":"string","description":"Where people join it.","example":"https://www.neoconference.app/e/sunday-service"},"createdAt":{"type":"string","format":"date-time"},"scheduledAt":{"type":["string","null"],"format":"date-time"},"startedAt":{"type":["string","null"],"format":"date-time"},"endedAt":{"type":["string","null"],"format":"date-time"},"replayUrl":{"type":["string","null"],"description":"The public replay page, when the owner leaves replays on."}}},"EventEnvelope":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Event"}}},"EventList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Event"}}}},"Recording":{"type":"object","properties":{"key":{"type":"string","example":"recordings/user_2abc/sunday-service/2026-10-01-09-10-00.mp4"},"kind":{"type":"string","enum":["video","audio"],"description":"The grid video, or its audio-only copy."},"sizeBytes":{"type":"integer"},"recordedAt":{"type":["string","null"],"format":"date-time"},"downloadUrl":{"type":"string","description":"A signed link to the file."},"downloadUrlExpiresIn":{"type":"integer","description":"Seconds the link works for (3600)."}}},"RecordingList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Recording"}}}},"RecordingStarted":{"type":"object","properties":{"data":{"type":"object","properties":{"recordingId":{"type":"string"},"startedAt":{"type":"string","format":"date-time"},"warning":{"type":"string","description":"Present when the plan's recording hours are nearly used."}}}}},"RecordingsStopped":{"type":"object","properties":{"data":{"type":"object","properties":{"stopped":{"type":"integer"}}}}}}}}