{"openapi":"3.1.0","info":{"title":"Nebulm Meet API","version":"1 (server 2.55.0)","description":"Create meetings, give people signed join links (no account needed), embed the call in your app, and get attendance, recordings, transcripts and AI notes back — with webhooks when things happen.\n\n**Auth** — `Authorization: Bearer nmk_live_…` (or `x-api-key`). Never put a key in a URL. Keys are made in Settings → Developers, per organization, with scopes.\n**Errors** — `{ error, code, requestId, details? }`; branch on `code`.\n**Pagination** — `?limit` + `?cursor` (from `nextCursor`), with `hasMore`.\n**Idempotency** — send `Idempotency-Key` on creates; retries return the first response for 24 h.\n**Rate limits** — per key (default 600/min); see the `RateLimit-*` headers, 429 `rate_limited` when exceeded.\n**Webhook signatures** — `Nebulm-Signature: t=<unix>,v1=<hex>` where v1 = HMAC-SHA256(secret, `<t>.<raw body>`); reject t older than 5 minutes, compare in constant time."},"servers":[{"url":"https://meet.nebulm.com/api/v1"}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"tags":[{"name":"Meetings"},{"name":"Join links & embedding"},{"name":"Attendance & live"},{"name":"Recordings"},{"name":"AI notes"},{"name":"Webhooks"},{"name":"Organization"}],"paths":{"/me":{"get":{"tags":["Organization"],"summary":"The organization and key behind this request","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"organization":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"}}},"scopes":{"type":"array","items":{"type":"string"}},"key":{"type":"object"}}}}}},"401":{"$ref":"#/components/responses/E401"},"429":{"$ref":"#/components/responses/E429"}}}},"/meetings":{"get":{"tags":["Meetings"],"summary":"List meetings","description":"Newest first.","security":[{"bearerAuth":["meetings:read"]},{"apiKeyHeader":["meetings:read"]}],"x-required-scope":"meetings:read","parameters":[{"name":"status","in":"query","description":"scheduled | active | ended","schema":{"type":"string"}},{"name":"externalId","in":"query","description":"Only meetings with this externalId","schema":{"type":"string"}},{"name":"limit","in":"query","description":"Page size (default 200, max 500)","schema":{"type":"integer","minimum":1,"maximum":500}},{"name":"cursor","in":"query","description":"The `nextCursor` of the previous page (alias: `before`)","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"meetings":{"type":"array","items":{"$ref":"#/components/schemas/Meeting"}},"nextCursor":{"type":["string","null"]},"hasMore":{"type":"boolean"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}},"post":{"tags":["Meetings"],"summary":"Create a meeting","description":"Instant or scheduled. Unset options follow the organization’s meeting defaults.","security":[{"bearerAuth":["meetings:write"]},{"apiKeyHeader":["meetings:write"]}],"x-required-scope":"meetings:write","parameters":[{"name":"Idempotency-Key","in":"header","description":"Make a retried create safe: the same key + body within 24 h returns the first response (header `Idempotent-Replayed: true`).","schema":{"type":"string","maxLength":255}}],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"meeting":{"$ref":"#/components/schemas/Meeting"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"409":{"$ref":"#/components/responses/E409"},"422":{"$ref":"#/components/responses/E422"},"429":{"$ref":"#/components/responses/E429"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeetingInput"}}}}}},"/meetings/{id}":{"get":{"tags":["Meetings"],"summary":"Get a meeting","description":"With its raw join log and recordings, and a series’ next dates.","security":[{"bearerAuth":["meetings:read"]},{"apiKeyHeader":["meetings:read"]}],"x-required-scope":"meetings:read","parameters":[{"name":"id","in":"path","required":true,"description":"Meeting id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"meeting":{"$ref":"#/components/schemas/Meeting"},"participants":{"type":"array","items":{"type":"object"}},"recordings":{"type":"array","items":{"$ref":"#/components/schemas/Recording"}},"occurrences":{"type":"array","items":{"$ref":"#/components/schemas/Occurrence"}}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}},"patch":{"tags":["Meetings"],"summary":"Update a meeting","description":"Only the fields you send change. Rescheduling updates emailed invitations. On a recurring meeting this edits the whole series, from its next date on; dates that have passed stay as they were. To change one date, use its occurrence.","security":[{"bearerAuth":["meetings:write"]},{"apiKeyHeader":["meetings:write"]}],"x-required-scope":"meetings:write","parameters":[{"name":"id","in":"path","required":true,"description":"Meeting id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"meeting":{"$ref":"#/components/schemas/Meeting"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeetingInput"}}}}},"delete":{"tags":["Meetings"],"summary":"Delete a meeting","description":"Ends the call first (recordings are finalized, then deleted with the meeting).","security":[{"bearerAuth":["meetings:write"]},{"apiKeyHeader":["meetings:write"]}],"x-required-scope":"meetings:write","parameters":[{"name":"id","in":"path","required":true,"description":"Meeting id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/meetings/{id}/occurrences":{"get":{"tags":["Meetings"],"summary":"List the dates of a recurring meeting","description":"The next dates (the coming 10 or so exist at any time), or the past ones with ?when=past, newest first.","security":[{"bearerAuth":["meetings:read"]},{"apiKeyHeader":["meetings:read"]}],"x-required-scope":"meetings:read","parameters":[{"name":"id","in":"path","required":true,"description":"Meeting id","schema":{"type":"string"}},{"name":"when","in":"query","description":"upcoming (default) | past","schema":{"type":"string"}},{"name":"limit","in":"query","description":"Page size (default 50, max 200)","schema":{"type":"integer","minimum":1,"maximum":200}},{"name":"cursor","in":"query","description":"The `nextCursor` of the previous page (alias: `before`)","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"occurrences":{"type":"array","items":{"$ref":"#/components/schemas/Occurrence"}},"nextCursor":{"type":["string","null"]},"hasMore":{"type":"boolean"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/meetings/{id}/occurrences/{occurrenceId}":{"get":{"tags":["Meetings"],"summary":"Get one date","security":[{"bearerAuth":["meetings:read"]},{"apiKeyHeader":["meetings:read"]}],"x-required-scope":"meetings:read","parameters":[{"name":"id","in":"path","required":true,"description":"Meeting id","schema":{"type":"string"}},{"name":"occurrenceId","in":"path","required":true,"description":"Occurrence id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"occurrence":{"$ref":"#/components/schemas/Occurrence"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}},"patch":{"tags":["Meetings"],"summary":"Edit one date","description":"Moves or changes this date only. The link and the meeting’s settings stay the series’. Invitees get an update for this date. 409 once it has started.","security":[{"bearerAuth":["meetings:write"]},{"apiKeyHeader":["meetings:write"]}],"x-required-scope":"meetings:write","parameters":[{"name":"id","in":"path","required":true,"description":"Meeting id","schema":{"type":"string"}},{"name":"occurrenceId","in":"path","required":true,"description":"Occurrence id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"occurrence":{"$ref":"#/components/schemas/Occurrence"},"meeting":{"$ref":"#/components/schemas/Meeting"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"409":{"$ref":"#/components/responses/E409"},"429":{"$ref":"#/components/responses/E429"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OccurrenceInput"}}}}}},"/meetings/{id}/occurrences/{occurrenceId}/cancel":{"post":{"tags":["Meetings"],"summary":"Cancel one date","description":"Invitees get a cancellation for this date; calendars show it as cancelled. 409 once it has started.","security":[{"bearerAuth":["meetings:write"]},{"apiKeyHeader":["meetings:write"]}],"x-required-scope":"meetings:write","parameters":[{"name":"id","in":"path","required":true,"description":"Meeting id","schema":{"type":"string"}},{"name":"occurrenceId","in":"path","required":true,"description":"Occurrence id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"occurrence":{"$ref":"#/components/schemas/Occurrence"},"meeting":{"$ref":"#/components/schemas/Meeting"}}}}}},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"409":{"$ref":"#/components/responses/E409"},"429":{"$ref":"#/components/responses/E429"}}}},"/meetings/{id}/occurrences/{occurrenceId}/restore":{"post":{"tags":["Meetings"],"summary":"Bring a cancelled date back","security":[{"bearerAuth":["meetings:write"]},{"apiKeyHeader":["meetings:write"]}],"x-required-scope":"meetings:write","parameters":[{"name":"id","in":"path","required":true,"description":"Meeting id","schema":{"type":"string"}},{"name":"occurrenceId","in":"path","required":true,"description":"Occurrence id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"occurrence":{"$ref":"#/components/schemas/Occurrence"},"meeting":{"$ref":"#/components/schemas/Meeting"}}}}}},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"409":{"$ref":"#/components/responses/E409"},"429":{"$ref":"#/components/responses/E429"}}}},"/meetings/{id}/end":{"post":{"tags":["Meetings"],"summary":"End for everyone","description":"Removes everyone; a running recording is stopped and kept.","security":[{"bearerAuth":["meetings:write"]},{"apiKeyHeader":["meetings:write"]}],"x-required-scope":"meetings:write","parameters":[{"name":"id","in":"path","required":true,"description":"Meeting id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"alreadyEnded":{"type":"boolean"},"meeting":{"$ref":"#/components/schemas/Meeting"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/meetings/{id}/reopen":{"post":{"tags":["Meetings"],"summary":"Reopen an ended meeting","description":"Meetings go live by themselves when the first person joins; this makes an ENDED one joinable again.","security":[{"bearerAuth":["meetings:write"]},{"apiKeyHeader":["meetings:write"]}],"x-required-scope":"meetings:write","parameters":[{"name":"id","in":"path","required":true,"description":"Meeting id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"reopened":{"type":"boolean"},"meeting":{"$ref":"#/components/schemas/Meeting"}}}}}},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"409":{"$ref":"#/components/responses/E409"},"429":{"$ref":"#/components/responses/E429"}}}},"/meetings/{id}/token":{"post":{"tags":["Join links & embedding"],"summary":"Mint a raw LiveKit token","description":"For apps running their own LiveKit client. Most integrations want a join link. Identities starting u_, g_ or x_ are reserved. While the meeting is locked only `role: host` gets a token; anything else answers 423 `meeting_locked`, like join links and the dashboard.","security":[{"bearerAuth":["meetings:write"]},{"apiKeyHeader":["meetings:write"]}],"x-required-scope":"meetings:write","parameters":[{"name":"id","in":"path","required":true,"description":"Meeting id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string"},"wsUrl":{"type":"string"},"room":{"type":"string"},"identity":{"type":"string"},"role":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"410":{"$ref":"#/components/responses/E410"},"423":{"$ref":"#/components/responses/E423"},"429":{"$ref":"#/components/responses/E429"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"adminUser":{"type":"string","description":"Host tokens only. Email or user id of an admin of this organization, if that is who this token is for. They also get an admin's rights in the call. Refused (403 not_org_admin) for anyone else."},"identity":{"type":"string"},"name":{"type":"string"},"role":{"type":"string","enum":["host","participant","guest","viewer"]},"restart":{"type":"boolean","description":"Reopen an ended meeting first"}}}}}}}},"/meetings/{id}/join-links":{"post":{"tags":["Join links & embedding"],"summary":"Create join links","description":"A signed, expiring link for one person — no account needed. Their name and role are fixed by the link; they skip the waiting room. Send one object, or `{ links: [...] }` with up to 200 (e.g. one per student; top-level expiresAt/expiresInSec apply to all).","security":[{"bearerAuth":["meetings:write"]},{"apiKeyHeader":["meetings:write"]}],"x-required-scope":"meetings:write","parameters":[{"name":"id","in":"path","required":true,"description":"Meeting id","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","description":"Make a retried create safe: the same key + body within 24 h returns the first response (header `Idempotent-Replayed: true`).","schema":{"type":"string","maxLength":255}}],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"joinLink":{"$ref":"#/components/schemas/JoinLink"}}},{"type":"object","properties":{"joinLinks":{"type":"array","items":{"$ref":"#/components/schemas/JoinLink"}}}}]}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"409":{"$ref":"#/components/responses/E409"},"422":{"$ref":"#/components/responses/E422"},"429":{"$ref":"#/components/responses/E429"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/JoinLinkInput"},{"type":"object","properties":{"links":{"type":"array","items":{"$ref":"#/components/schemas/JoinLinkInput"}},"expiresAt":{"type":"string","format":"date-time"},"expiresInSec":{"type":"integer"}},"required":["links"]}]}}}}},"get":{"tags":["Join links & embedding"],"summary":"List join links","description":"Newest first. The url/token are not shown again.","security":[{"bearerAuth":["meetings:read"]},{"apiKeyHeader":["meetings:read"]}],"x-required-scope":"meetings:read","parameters":[{"name":"id","in":"path","required":true,"description":"Meeting id","schema":{"type":"string"}},{"name":"limit","in":"query","description":"Page size (default 50, max 200)","schema":{"type":"integer","minimum":1,"maximum":200}},{"name":"cursor","in":"query","description":"The `nextCursor` of the previous page (alias: `before`)","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"joinLinks":{"type":"array","items":{"$ref":"#/components/schemas/JoinLink"}},"nextCursor":{"type":["string","null"]},"hasMore":{"type":"boolean"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/meetings/{id}/join-links/{linkId}":{"delete":{"tags":["Join links & embedding"],"summary":"Revoke a join link","description":"Whoever is already in the call stays (remove them separately).","security":[{"bearerAuth":["meetings:write"]},{"apiKeyHeader":["meetings:write"]}],"x-required-scope":"meetings:write","parameters":[{"name":"id","in":"path","required":true,"description":"Meeting id","schema":{"type":"string"}},{"name":"linkId","in":"path","required":true,"description":"Join link id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"joinLink":{"$ref":"#/components/schemas/JoinLink"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/meetings/{id}/attendance":{"get":{"tags":["Attendance & live"],"summary":"Attendance","description":"One row per person — join-link users keyed by externalUserId, rejoins summed. Works during and after the meeting.","security":[{"bearerAuth":["meetings:read"]},{"apiKeyHeader":["meetings:read"]}],"x-required-scope":"meetings:read","parameters":[{"name":"id","in":"path","required":true,"description":"Meeting id","schema":{"type":"string"}},{"name":"from","in":"query","description":"Only time after this instant (ISO) — one session of a reused meeting","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","description":"Only time before this instant (ISO)","schema":{"type":"string","format":"date-time"}},{"name":"include","in":"query","description":"\"sessions\" adds every join/leave","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"meeting":{"type":"object"},"attendance":{"type":"array","items":{"$ref":"#/components/schemas/Attendee"}}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/meetings/{id}/live":{"get":{"tags":["Attendance & live"],"summary":"Who is in the call right now","description":"Every room of the meeting (breakouts and waiting rooms too), with each person’s mic / camera / screen share, raised hand, permissions and the latest \"ask to unmute\".","security":[{"bearerAuth":["meetings:read"]},{"apiKeyHeader":["meetings:read"]}],"x-required-scope":"meetings:read","parameters":[{"name":"id","in":"path","required":true,"description":"Meeting id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"participants":{"type":"array","items":{"$ref":"#/components/schemas/LiveParticipant"}}}},"example":{"status":"active","participants":[{"identity":"x_5f0c1e9a2b7d4c3e8f1a6b2d","name":"Lina Haddad","role":"participant","externalUserId":"stu-1042","userId":null,"roomId":null,"roomName":null,"joinedAt":"2026-10-26T09:02:11.000Z","microphone":"muted","camera":"on","screenShare":"off","handRaised":true,"handRaisedAt":"2026-10-26T09:12:40.000Z","permissions":{"microphone":true,"camera":true,"screenShare":false,"localRecording":false},"unmuteRequest":{"askedAt":"2026-10-26T09:14:03.000Z","answer":"unmuted","answeredAt":"2026-10-26T09:14:06.000Z"}}]}}}},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"},"503":{"$ref":"#/components/responses/E503"}}}},"/meetings/{id}/participants/{identity}/remove":{"post":{"tags":["Attendance & live"],"summary":"Remove a participant","description":"They are kept out (their link stops working for this meeting) until a host lets them back in.","security":[{"bearerAuth":["meetings:write"]},{"apiKeyHeader":["meetings:write"]}],"x-required-scope":"meetings:write","parameters":[{"name":"id","in":"path","required":true,"description":"Meeting id","schema":{"type":"string"}},{"name":"identity","in":"path","required":true,"description":"Participant identity (from live / attendance)","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/meetings/{id}/participants/{identity}/mute":{"post":{"tags":["Attendance & live"],"summary":"Mute a participant","description":"Turns their microphone (default) or camera off; they may turn it back on unless the meeting forces mute.","security":[{"bearerAuth":["meetings:write"]},{"apiKeyHeader":["meetings:write"]}],"x-required-scope":"meetings:write","parameters":[{"name":"id","in":"path","required":true,"description":"Meeting id","schema":{"type":"string"}},{"name":"identity","in":"path","required":true,"description":"Participant identity","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"muted":{"type":"integer"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"},"503":{"$ref":"#/components/responses/E503"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"track":{"type":"string","enum":["microphone","camera"]}}}}}}}},"/meetings/{id}/participants/{identity}/stop-share":{"post":{"tags":["Attendance & live"],"summary":"Stop a screen share","description":"Ends their screen share (and its audio). One-off, like mute: they may share again — set their `screenShare` permission to false to prevent it. `stopped` is the number of tracks stopped (0: they weren’t sharing).","security":[{"bearerAuth":["meetings:write"]},{"apiKeyHeader":["meetings:write"]}],"x-required-scope":"meetings:write","parameters":[{"name":"id","in":"path","required":true,"description":"Meeting id","schema":{"type":"string"}},{"name":"identity","in":"path","required":true,"description":"Participant identity","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"stopped":{"type":"integer"}}},"example":{"ok":true,"stopped":2}}}},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"},"503":{"$ref":"#/components/responses/E503"}}}},"/meetings/{id}/participants/{identity}/ask-unmute":{"post":{"tags":["Attendance & live"],"summary":"Ask a participant to unmute","description":"Nobody is unmuted remotely: they get a prompt in the call (\"The host is asking you to unmute\" · Unmute · Stay muted). Their answer appears as `unmuteRequest` in GET /meetings/{id}/live (`unmuted`, `stay`, or `unavailable` when they have no usable microphone). Once per person every 30 s — sooner answers 429 `rate_limited` with `Retry-After` and `details.retryAfterSec`. 409 `mic_locked` when their mic is locked (allow it first with …/permissions), `cannot_publish` for watch-only participants, `not_live` when the meeting isn’t live. Already unmuted: 200 with `asked: false, reason: \"already_unmuted\"`. Send an `Idempotency-Key` to make a retried request return the first answer.","security":[{"bearerAuth":["meetings:write"]},{"apiKeyHeader":["meetings:write"]}],"x-required-scope":"meetings:write","parameters":[{"name":"id","in":"path","required":true,"description":"Meeting id","schema":{"type":"string"}},{"name":"identity","in":"path","required":true,"description":"Participant identity","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","description":"Make a retried create safe: the same key + body within 24 h returns the first response (header `Idempotent-Replayed: true`).","schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"asked":{"type":"boolean"},"askedAt":{"type":"string","description":"When asked = true","format":"date-time"},"reason":{"type":"string","description":"When asked = false","enum":["already_unmuted"]}}},"example":{"ok":true,"asked":true,"askedAt":"2026-10-26T09:14:03.000Z"}}}},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"409":{"$ref":"#/components/responses/E409"},"422":{"$ref":"#/components/responses/E422"},"429":{"$ref":"#/components/responses/E429"},"503":{"$ref":"#/components/responses/E503"}}}},"/meetings/{id}/participants/{identity}/lower-hand":{"post":{"tags":["Attendance & live"],"summary":"Lower a raised hand","description":"The same as a host lowering it in the call: it goes down for them and for everyone in the call, people who join later included. `lowered` is false when their hand wasn’t up.","security":[{"bearerAuth":["meetings:write"]},{"apiKeyHeader":["meetings:write"]}],"x-required-scope":"meetings:write","parameters":[{"name":"id","in":"path","required":true,"description":"Meeting id","schema":{"type":"string"}},{"name":"identity","in":"path","required":true,"description":"Participant identity","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"lowered":{"type":"boolean"}}},"example":{"ok":true,"lowered":true}}}},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"},"503":{"$ref":"#/components/responses/E503"}}}},"/meetings/{id}/participants/{identity}/permissions":{"post":{"tags":["Attendance & live"],"summary":"Change what a participant may do","description":"Lock or allow their microphone, screen sharing and recording on their own device. Only the fields you send change. It sticks for this meeting (rejoins and room moves keep it); the meeting-wide switches (force mute, screen sharing) reset it. Hosts are never restricted (409 `host_unrestricted`); watch-only participants publish nothing (409 `cannot_publish`). Answers their permissions after the change.","security":[{"bearerAuth":["meetings:write"]},{"apiKeyHeader":["meetings:write"]}],"x-required-scope":"meetings:write","parameters":[{"name":"id","in":"path","required":true,"description":"Meeting id","schema":{"type":"string"}},{"name":"identity","in":"path","required":true,"description":"Participant identity","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"permissions":{"type":"object","properties":{"microphone":{"type":"boolean"},"screenShare":{"type":"boolean"},"localRecording":{"type":"boolean"}}}}},"example":{"ok":true,"permissions":{"microphone":false,"screenShare":true,"localRecording":false}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"409":{"$ref":"#/components/responses/E409"},"429":{"$ref":"#/components/responses/E429"},"503":{"$ref":"#/components/responses/E503"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParticipantPermissionsInput"},"example":{"microphone":false,"screenShare":true}}}}}},"/meetings/{id}/recording/start":{"post":{"tags":["Recordings"],"summary":"Start recording","security":[{"bearerAuth":["meetings:write"]},{"apiKeyHeader":["meetings:write"]}],"x-required-scope":"meetings:write","parameters":[{"name":"id","in":"path","required":true,"description":"Meeting id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"recording":{"$ref":"#/components/schemas/Recording"}}}}}},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"409":{"$ref":"#/components/responses/E409"},"429":{"$ref":"#/components/responses/E429"},"503":{"$ref":"#/components/responses/E503"}}}},"/meetings/{id}/recording/stop":{"post":{"tags":["Recordings"],"summary":"Stop recording","security":[{"bearerAuth":["meetings:write"]},{"apiKeyHeader":["meetings:write"]}],"x-required-scope":"meetings:write","parameters":[{"name":"id","in":"path","required":true,"description":"Meeting id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"stopped":{"type":"integer"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/meetings/{id}/polls":{"get":{"tags":["Attendance & live"],"summary":"Polls and quizzes with their results. Anonymous polls have counts only; named polls also list voters.","security":[{"bearerAuth":["meetings:read"]},{"apiKeyHeader":["meetings:read"]}],"x-required-scope":"meetings:read","parameters":[{"name":"id","in":"path","required":true,"description":"Meeting id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"polls":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"question":{"type":"string"},"multi":{"type":"boolean"},"anonymous":{"type":"boolean"},"quiz":{"type":"boolean"},"status":{"type":"string"},"options":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"text":{"type":"string"},"votes":{"type":"integer"}}}},"totalVoters":{"type":"integer"},"roomId":{"type":["string","null"]},"openedAt":{"type":["string","null"],"format":"date-time"},"closedAt":{"type":["string","null"],"format":"date-time"}}}},"count":{"type":"integer"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/meetings/{id}/questions":{"get":{"tags":["Attendance & live"],"summary":"Questions asked in the Q&A. Anonymous questions carry no name or id.","security":[{"bearerAuth":["meetings:read"]},{"apiKeyHeader":["meetings:read"]}],"x-required-scope":"meetings:read","parameters":[{"name":"id","in":"path","required":true,"description":"Meeting id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"questions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"text":{"type":"string"},"name":{"type":["string","null"]},"anonymous":{"type":"boolean"},"status":{"type":"string"},"pinned":{"type":"boolean"},"answer":{"type":["string","null"]},"votes":{"type":"integer"},"roomId":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"}}}},"count":{"type":"integer"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/meetings/{id}/chat":{"get":{"tags":["Attendance & live"],"summary":"In-call chat history","security":[{"bearerAuth":["meetings:read"]},{"apiKeyHeader":["meetings:read"]}],"x-required-scope":"meetings:read","parameters":[{"name":"id","in":"path","required":true,"description":"Meeting id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"messages":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"senderName":{"type":"string"},"senderIdentity":{"type":"string"},"senderExternalUserId":{"type":["string","null"]},"text":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"roomId":{"type":["string","null"]}}}},"count":{"type":"integer"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/meetings/{id}/invitations":{"post":{"tags":["Meetings"],"summary":"Email calendar invitations","description":"Needs SMTP on the server (otherwise logged as skipped).","security":[{"bearerAuth":["meetings:write"]},{"apiKeyHeader":["meetings:write"]}],"x-required-scope":"meetings:write","parameters":[{"name":"id","in":"path","required":true,"description":"Meeting id","schema":{"type":"string"}}],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"invited":{"type":"array","items":{}},"alreadyInvited":{"type":"array","items":{}},"invalid":{"type":"array","items":{"type":"string"}},"emailEnabled":{"type":"boolean"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"emails":{"type":"array","items":{"oneOf":[{"type":"string"},{"type":"object","properties":{"email":{"type":"string"},"name":{"type":"string"}}}]}},"message":{"type":"string","maxLength":2000},"timeZone":{"type":"string"}},"required":["emails"]}}}}}},"/recordings":{"get":{"tags":["Recordings"],"summary":"List recordings","security":[{"bearerAuth":["recordings:read"]},{"apiKeyHeader":["recordings:read"]}],"x-required-scope":"recordings:read","parameters":[{"name":"meetingId","in":"query","description":"Only this meeting","schema":{"type":"string"}},{"name":"limit","in":"query","description":"Page size (default 200, max 500)","schema":{"type":"integer","minimum":1,"maximum":500}},{"name":"cursor","in":"query","description":"The `nextCursor` of the previous page (alias: `before`)","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"recordings":{"type":"array","items":{"$ref":"#/components/schemas/Recording"}},"nextCursor":{"type":["string","null"]},"hasMore":{"type":"boolean"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/recordings/{id}":{"get":{"tags":["Recordings"],"summary":"Get a recording","security":[{"bearerAuth":["recordings:read"]},{"apiKeyHeader":["recordings:read"]}],"x-required-scope":"recordings:read","parameters":[{"name":"id","in":"path","required":true,"description":"Recording id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"recording":{"$ref":"#/components/schemas/Recording"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}},"delete":{"tags":["Recordings"],"summary":"Delete a recording","security":[{"bearerAuth":["recordings:write"]},{"apiKeyHeader":["recordings:write"]}],"x-required-scope":"recordings:write","parameters":[{"name":"id","in":"path","required":true,"description":"Recording id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"}}}}}},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"409":{"$ref":"#/components/responses/E409"},"429":{"$ref":"#/components/responses/E429"}}}},"/recordings/{id}/download":{"get":{"tags":["Recordings"],"summary":"Download the file","description":"MP4 (or .m4a for an AI-notes-only recording). 302 to a short-lived storage URL, or streamed. Follow redirects.","security":[{"bearerAuth":["recordings:read"]},{"apiKeyHeader":["recordings:read"]}],"x-required-scope":"recordings:read","parameters":[{"name":"id","in":"path","required":true,"description":"Recording id","schema":{"type":"string"}}],"responses":{"200":{"description":"The file"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"409":{"$ref":"#/components/responses/E409"},"429":{"$ref":"#/components/responses/E429"}}}},"/recordings/{id}/stream":{"get":{"tags":["Recordings"],"summary":"Stream inline (Range-aware)","security":[{"bearerAuth":["recordings:read"]},{"apiKeyHeader":["recordings:read"]}],"x-required-scope":"recordings:read","parameters":[{"name":"id","in":"path","required":true,"description":"Recording id","schema":{"type":"string"}}],"responses":{"200":{"description":"The file"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"409":{"$ref":"#/components/responses/E409"},"429":{"$ref":"#/components/responses/E429"}}}},"/recordings/{id}/download-url":{"get":{"tags":["Recordings"],"summary":"A direct, expiring download URL","description":"Hand it to a browser without proxying the bytes. For a restricted recording (a private or confidential meeting, or an org that narrowed access) the link is short whatever you ask for: 2 minutes to download, at most 15 to stream. Check expiresAt.","security":[{"bearerAuth":["recordings:read"]},{"apiKeyHeader":["recordings:read"]}],"x-required-scope":"recordings:read","parameters":[{"name":"id","in":"path","required":true,"description":"Recording id","schema":{"type":"string"}},{"name":"expiresIn","in":"query","description":"Seconds, 60–86400 (default 3600)","schema":{"type":"integer"}},{"name":"disposition","in":"query","description":"attachment | inline","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"409":{"$ref":"#/components/responses/E409"},"429":{"$ref":"#/components/responses/E429"}}}},"/recordings/{id}/thumbnail":{"get":{"tags":["Recordings"],"summary":"Poster frame (JPEG)","security":[{"bearerAuth":["recordings:read"]},{"apiKeyHeader":["recordings:read"]}],"x-required-scope":"recordings:read","parameters":[{"name":"id","in":"path","required":true,"description":"Recording id","schema":{"type":"string"}}],"responses":{"200":{"description":"image/jpeg"},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/recordings/{id}/stems":{"get":{"tags":["Recordings"],"summary":"Per-speaker audio stems","description":"Aligned to the recording’s t=0. status pending → ask again later.","security":[{"bearerAuth":["recordings:read"]},{"apiKeyHeader":["recordings:read"]}],"x-required-scope":"recordings:read","parameters":[{"name":"id","in":"path","required":true,"description":"Recording id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"durationSec":{"type":["number","null"]},"stems":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"identity":{"type":"string"},"name":{"type":"string"},"externalUserId":{"type":["string","null"]},"talkSec":{"type":"number"},"talkPct":{"type":"integer"},"url":{"type":"string"}}}}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/recordings/{id}/stems/{stemId}":{"get":{"tags":["Recordings"],"summary":"Download one stem (.m4a)","security":[{"bearerAuth":["recordings:read"]},{"apiKeyHeader":["recordings:read"]}],"x-required-scope":"recordings:read","parameters":[{"name":"id","in":"path","required":true,"description":"Recording id","schema":{"type":"string"}},{"name":"stemId","in":"path","required":true,"description":"Stem id","schema":{"type":"string"}}],"responses":{"200":{"description":"audio/mp4"},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/recordings/{id}/share-links":{"post":{"tags":["Recordings"],"summary":"Create a public share link","description":"Anyone with the link can watch until it expires or is revoked.","security":[{"bearerAuth":["recordings:write"]},{"apiKeyHeader":["recordings:write"]}],"x-required-scope":"recordings:write","parameters":[{"name":"id","in":"path","required":true,"description":"Recording id","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","description":"Make a retried create safe: the same key + body within 24 h returns the first response (header `Idempotent-Replayed: true`).","schema":{"type":"string","maxLength":255}}],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"shareLink":{"$ref":"#/components/schemas/ShareLink"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"409":{"$ref":"#/components/responses/E409"},"429":{"$ref":"#/components/responses/E429"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"expiresIn":{"oneOf":[{"type":"string","enum":["1h","24h","7d","30d"]},{"type":"integer","minimum":60,"maximum":2592000}]}}}}}}},"get":{"tags":["Recordings"],"summary":"Active share links","security":[{"bearerAuth":["recordings:read"]},{"apiKeyHeader":["recordings:read"]}],"x-required-scope":"recordings:read","parameters":[{"name":"id","in":"path","required":true,"description":"Recording id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"shareLinks":{"type":"array","items":{"$ref":"#/components/schemas/ShareLink"}}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/recordings/{id}/share-links/{shareId}":{"delete":{"tags":["Recordings"],"summary":"Revoke a share link","security":[{"bearerAuth":["recordings:write"]},{"apiKeyHeader":["recordings:write"]}],"x-required-scope":"recordings:write","parameters":[{"name":"id","in":"path","required":true,"description":"Recording id","schema":{"type":"string"}},{"name":"shareId","in":"path","required":true,"description":"Share link id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/recordings/{id}/ai":{"get":{"tags":["AI notes"],"summary":"AI notes status","security":[{"bearerAuth":["recordings:read"]},{"apiKeyHeader":["recordings:read"]}],"x-required-scope":"recordings:read","parameters":[{"name":"id","in":"path","required":true,"description":"Recording id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ai":{"type":"object"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}},"post":{"tags":["AI notes"],"summary":"Generate AI notes","description":"Also accepted with meetings:write (older keys).","security":[{"bearerAuth":["recordings:write"]},{"apiKeyHeader":["recordings:write"]}],"x-required-scope":"recordings:write","parameters":[{"name":"id","in":"path","required":true,"description":"Recording id","schema":{"type":"string"}}],"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"type":"object","properties":{"job":{"type":"object"},"budget":{"type":"object"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"409":{"$ref":"#/components/responses/E409"},"429":{"$ref":"#/components/responses/E429"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"quality":{"type":"string"},"language":{"type":"string"},"summaryLanguage":{"type":"string"},"templateId":{"type":"string","description":"A notes template of this organization (built-in ids start with builtin:); default: the meeting's, then the organization's"}}}}}}}},"/recordings/{id}/transcript":{"get":{"tags":["AI notes"],"summary":"Transcript","description":"JSON segments with speakers (incl. externalUserId) and timestamps, paged with offset/limit; or ?format=txt|vtt|srt.","security":[{"bearerAuth":["recordings:read"]},{"apiKeyHeader":["recordings:read"]}],"x-required-scope":"recordings:read","parameters":[{"name":"id","in":"path","required":true,"description":"Recording id","schema":{"type":"string"}},{"name":"format","in":"query","description":"json (default) | txt | vtt | srt","schema":{"type":"string"}},{"name":"offset","in":"query","description":"Segments to skip","schema":{"type":"integer"}},{"name":"limit","in":"query","description":"Segments per page","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"language":{"type":"string"},"total":{"type":"integer"},"offset":{"type":"integer"},"limit":{"type":"integer"},"speakers":{"type":"array","items":{"type":"object","properties":{"identity":{"type":["string","null"]},"name":{"type":"string"},"externalUserId":{"type":["string","null"]},"speechSeconds":{"type":"number"},"segments":{"type":"integer"}}}},"segments":{"type":"array","items":{"$ref":"#/components/schemas/TranscriptSegment"}}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/recordings/{id}/summary":{"get":{"tags":["AI notes"],"summary":"Meeting notes","description":"JSON (summary, decisions, action items…) or ?format=md|html|pdf|docx.","security":[{"bearerAuth":["recordings:read"]},{"apiKeyHeader":["recordings:read"]}],"x-required-scope":"recordings:read","parameters":[{"name":"id","in":"path","required":true,"description":"Recording id","schema":{"type":"string"}},{"name":"format","in":"query","description":"json (default) | md | html | pdf | docx","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"language":{"type":"string"},"summary":{"type":"object"},"job":{"type":"object"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/recordings/{id}/ai/download":{"get":{"tags":["AI notes"],"summary":"Download a notes artifact","security":[{"bearerAuth":["recordings:read"]},{"apiKeyHeader":["recordings:read"]}],"x-required-scope":"recordings:read","parameters":[{"name":"id","in":"path","required":true,"description":"Recording id","schema":{"type":"string"}},{"name":"format","in":"query","description":"pdf (default) | docx | md | html | txt | vtt | srt","schema":{"type":"string"}}],"responses":{"200":{"description":"The file"},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/webhook-events":{"get":{"tags":["Webhooks"],"summary":"The event catalogue","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"events":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"description":{"type":"string"}}}}}}}}},"401":{"$ref":"#/components/responses/E401"},"429":{"$ref":"#/components/responses/E429"}}}},"/webhooks":{"get":{"tags":["Webhooks"],"summary":"List webhook endpoints","security":[{"bearerAuth":["webhooks:read"]},{"apiKeyHeader":["webhooks:read"]}],"x-required-scope":"webhooks:read","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"webhooks":{"type":"array","items":{"$ref":"#/components/schemas/Webhook"}}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}},"post":{"tags":["Webhooks"],"summary":"Add a webhook endpoint","description":"The signing secret is returned once.","security":[{"bearerAuth":["webhooks:write"]},{"apiKeyHeader":["webhooks:write"]}],"x-required-scope":"webhooks:write","parameters":[{"name":"Idempotency-Key","in":"header","description":"Make a retried create safe: the same key + body within 24 h returns the first response (header `Idempotent-Replayed: true`).","schema":{"type":"string","maxLength":255}}],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"webhook":{"$ref":"#/components/schemas/Webhook"},"secret":{"type":"string","description":"whsec_…"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"409":{"$ref":"#/components/responses/E409"},"422":{"$ref":"#/components/responses/E422"},"429":{"$ref":"#/components/responses/E429"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookInput"}}}}}},"/webhooks/{id}":{"get":{"tags":["Webhooks"],"summary":"Get a webhook endpoint","security":[{"bearerAuth":["webhooks:read"]},{"apiKeyHeader":["webhooks:read"]}],"x-required-scope":"webhooks:read","parameters":[{"name":"id","in":"path","required":true,"description":"Webhook id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"webhook":{"$ref":"#/components/schemas/Webhook"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}},"patch":{"tags":["Webhooks"],"summary":"Update a webhook endpoint","security":[{"bearerAuth":["webhooks:write"]},{"apiKeyHeader":["webhooks:write"]}],"x-required-scope":"webhooks:write","parameters":[{"name":"id","in":"path","required":true,"description":"Webhook id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"webhook":{"$ref":"#/components/schemas/Webhook"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookInput"}}}}},"delete":{"tags":["Webhooks"],"summary":"Delete a webhook endpoint","security":[{"bearerAuth":["webhooks:write"]},{"apiKeyHeader":["webhooks:write"]}],"x-required-scope":"webhooks:write","parameters":[{"name":"id","in":"path","required":true,"description":"Webhook id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/webhooks/{id}/rotate-secret":{"post":{"tags":["Webhooks"],"summary":"Rotate the signing secret","security":[{"bearerAuth":["webhooks:write"]},{"apiKeyHeader":["webhooks:write"]}],"x-required-scope":"webhooks:write","parameters":[{"name":"id","in":"path","required":true,"description":"Webhook id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"webhook":{"$ref":"#/components/schemas/Webhook"},"secret":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/webhooks/{id}/test":{"post":{"tags":["Webhooks"],"summary":"Send a test event now","security":[{"bearerAuth":["webhooks:write"]},{"apiKeyHeader":["webhooks:write"]}],"x-required-scope":"webhooks:write","parameters":[{"name":"id","in":"path","required":true,"description":"Webhook id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"delivered":{"type":"boolean"},"status":{"type":["integer","null"]},"error":{"type":"string"},"deliveryId":{"type":"string"},"eventId":{"type":"string"}}}}}},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"409":{"$ref":"#/components/responses/E409"},"429":{"$ref":"#/components/responses/E429"}}}},"/webhooks/{id}/deliveries":{"get":{"tags":["Webhooks"],"summary":"Recent deliveries","security":[{"bearerAuth":["webhooks:read"]},{"apiKeyHeader":["webhooks:read"]}],"x-required-scope":"webhooks:read","parameters":[{"name":"id","in":"path","required":true,"description":"Webhook id","schema":{"type":"string"}},{"name":"limit","in":"query","description":"Page size (default 50, max 200)","schema":{"type":"integer","minimum":1,"maximum":200}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"deliveries":{"type":"array","items":{"$ref":"#/components/schemas/Delivery"}}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/webhooks/{id}/deliveries/{deliveryId}/retry":{"post":{"tags":["Webhooks"],"summary":"Send a delivery again","security":[{"bearerAuth":["webhooks:write"]},{"apiKeyHeader":["webhooks:write"]}],"x-required-scope":"webhooks:write","parameters":[{"name":"id","in":"path","required":true,"description":"Webhook id","schema":{"type":"string"}},{"name":"deliveryId","in":"path","required":true,"description":"Delivery id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"delivery":{"$ref":"#/components/schemas/Delivery"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/members":{"get":{"tags":["Organization"],"summary":"List team members","security":[{"bearerAuth":["members:read"]},{"apiKeyHeader":["members:read"]}],"x-required-scope":"members:read","parameters":[{"name":"limit","in":"query","description":"Page size (default 50, max 200)","schema":{"type":"integer","minimum":1,"maximum":200}},{"name":"cursor","in":"query","description":"The `nextCursor` of the previous page (alias: `before`)","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"members":{"type":"array","items":{"$ref":"#/components/schemas/Member"}},"nextCursor":{"type":["string","null"]},"hasMore":{"type":"boolean"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/members/invitations":{"post":{"tags":["Organization"],"summary":"Invite a member by email","description":"Returns a single-use, 14-day invite link to send them. Admins are invited from the dashboard.","security":[{"bearerAuth":["members:write"]},{"apiKeyHeader":["members:write"]}],"x-required-scope":"members:write","parameters":[{"name":"Idempotency-Key","in":"header","description":"Make a retried create safe: the same key + body within 24 h returns the first response (header `Idempotent-Replayed: true`).","schema":{"type":"string","maxLength":255}}],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"invitation":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"role":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"},"url":{"type":"string"}}}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"409":{"$ref":"#/components/responses/E409"},"422":{"$ref":"#/components/responses/E422"},"429":{"$ref":"#/components/responses/E429"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"role":{"type":"string","enum":["member"]}},"required":["email"]}}}}}},"/members/{userId}":{"delete":{"tags":["Organization"],"summary":"Remove a member","security":[{"bearerAuth":["members:write"]},{"apiKeyHeader":["members:write"]}],"x-required-scope":"members:write","parameters":[{"name":"userId","in":"path","required":true,"description":"User id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/usage":{"get":{"tags":["Organization"],"summary":"Usage","description":"Meeting minutes, attendance, recordings, storage and AI notes spend in a window (default: this month).","security":[{"bearerAuth":["usage:read"]},{"apiKeyHeader":["usage:read"]}],"x-required-scope":"usage:read","parameters":[{"name":"from","in":"query","description":"ISO start","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","description":"ISO end","schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Usage"}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}}},"webhooks":{"meeting.started":{"post":{"summary":"meeting.started","description":"The first person joined; the meeting is live.\n\nHeaders: Nebulm-Signature (t=…,v1=…), Nebulm-Event, Nebulm-Event-Id, Nebulm-Webhook-Id, Nebulm-Delivery-Id. Answer 2xx within 5 s; anything else is retried (1m, 5m, 15m, 1h, then every 6h; 8 attempts). 410 stops retries.","requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"const":"meeting.started"},"data":{"type":"object","properties":{"meetingId":{"type":"string"},"title":{"type":"string"},"slug":{"type":"string"},"startedAt":{"type":"string","format":"date-time"},"meeting":{"type":"object"}}}}}]}}}},"responses":{"200":{"description":"Received"}}}},"meeting.ended":{"post":{"summary":"meeting.ended","description":"The meeting ended (host ended it, everyone left, or the organization was suspended).\n\nHeaders: Nebulm-Signature (t=…,v1=…), Nebulm-Event, Nebulm-Event-Id, Nebulm-Webhook-Id, Nebulm-Delivery-Id. Answer 2xx within 5 s; anything else is retried (1m, 5m, 15m, 1h, then every 6h; 8 attempts). 410 stops retries.","requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"const":"meeting.ended"},"data":{"type":"object","properties":{"meetingId":{"type":"string"},"title":{"type":"string"},"slug":{"type":"string"},"reason":{"type":"string","enum":["host","empty","suspended"]},"meeting":{"type":"object"}}}}}]}}}},"responses":{"200":{"description":"Received"}}}},"meeting.reopened":{"post":{"summary":"meeting.reopened","description":"An ended meeting was reopened.\n\nHeaders: Nebulm-Signature (t=…,v1=…), Nebulm-Event, Nebulm-Event-Id, Nebulm-Webhook-Id, Nebulm-Delivery-Id. Answer 2xx within 5 s; anything else is retried (1m, 5m, 15m, 1h, then every 6h; 8 attempts). 410 stops retries.","requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"const":"meeting.reopened"},"data":{"type":"object","properties":{"meetingId":{"type":"string"},"title":{"type":"string"},"slug":{"type":"string"},"meeting":{"type":"object"}}}}}]}}}},"responses":{"200":{"description":"Received"}}}},"meeting.occurrence_updated":{"post":{"summary":"meeting.occurrence_updated","description":"One date of a recurring meeting was moved or edited on its own.\n\nHeaders: Nebulm-Signature (t=…,v1=…), Nebulm-Event, Nebulm-Event-Id, Nebulm-Webhook-Id, Nebulm-Delivery-Id. Answer 2xx within 5 s; anything else is retried (1m, 5m, 15m, 1h, then every 6h; 8 attempts). 410 stops retries.","requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"const":"meeting.occurrence_updated"},"data":{"type":"object","properties":{"meetingId":{"type":"string"},"slug":{"type":"string"},"occurrenceId":{"type":"string"},"originalStart":{"type":"string","format":"date-time"},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["scheduled","cancelled"]},"title":{"type":"string"},"meeting":{"type":"object"}}}}}]}}}},"responses":{"200":{"description":"Received"}}}},"meeting.occurrence_cancelled":{"post":{"summary":"meeting.occurrence_cancelled","description":"One date of a recurring meeting was cancelled.\n\nHeaders: Nebulm-Signature (t=…,v1=…), Nebulm-Event, Nebulm-Event-Id, Nebulm-Webhook-Id, Nebulm-Delivery-Id. Answer 2xx within 5 s; anything else is retried (1m, 5m, 15m, 1h, then every 6h; 8 attempts). 410 stops retries.","requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"const":"meeting.occurrence_cancelled"},"data":{"type":"object","properties":{"meetingId":{"type":"string"},"slug":{"type":"string"},"occurrenceId":{"type":"string"},"originalStart":{"type":"string","format":"date-time"},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["scheduled","cancelled"]},"title":{"type":"string"},"meeting":{"type":"object"}}}}}]}}}},"responses":{"200":{"description":"Received"}}}},"meeting.occurrence_restored":{"post":{"summary":"meeting.occurrence_restored","description":"A cancelled date of a recurring meeting was brought back.\n\nHeaders: Nebulm-Signature (t=…,v1=…), Nebulm-Event, Nebulm-Event-Id, Nebulm-Webhook-Id, Nebulm-Delivery-Id. Answer 2xx within 5 s; anything else is retried (1m, 5m, 15m, 1h, then every 6h; 8 attempts). 410 stops retries.","requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"const":"meeting.occurrence_restored"},"data":{"type":"object","properties":{"meetingId":{"type":"string"},"slug":{"type":"string"},"occurrenceId":{"type":"string"},"originalStart":{"type":"string","format":"date-time"},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["scheduled","cancelled"]},"title":{"type":"string"},"meeting":{"type":"object"}}}}}]}}}},"responses":{"200":{"description":"Received"}}}},"participant.joined":{"post":{"summary":"participant.joined","description":"Someone joined (carries externalUserId for join-link users).\n\nHeaders: Nebulm-Signature (t=…,v1=…), Nebulm-Event, Nebulm-Event-Id, Nebulm-Webhook-Id, Nebulm-Delivery-Id. Answer 2xx within 5 s; anything else is retried (1m, 5m, 15m, 1h, then every 6h; 8 attempts). 410 stops retries.","requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"const":"participant.joined"},"data":{"type":"object","properties":{"meetingId":{"type":"string"},"participant":{"type":"object","properties":{"identity":{"type":"string"},"name":{"type":"string"},"role":{"type":"string"},"externalUserId":{"type":["string","null"]},"joinLinkId":{"type":["string","null"]},"metadata":{"type":["object","null"]},"userId":{"type":["string","null"]},"roomId":{"type":["string","null"]},"joinedAt":{"type":"string","format":"date-time"}}},"meeting":{"type":"object"}}}}}]}}}},"responses":{"200":{"description":"Received"}}}},"participant.left":{"post":{"summary":"participant.left","description":"Someone left (with the duration of that session).\n\nHeaders: Nebulm-Signature (t=…,v1=…), Nebulm-Event, Nebulm-Event-Id, Nebulm-Webhook-Id, Nebulm-Delivery-Id. Answer 2xx within 5 s; anything else is retried (1m, 5m, 15m, 1h, then every 6h; 8 attempts). 410 stops retries.","requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"const":"participant.left"},"data":{"type":"object","properties":{"meetingId":{"type":"string"},"participant":{"type":"object","properties":{"identity":{"type":"string"},"name":{"type":"string"},"role":{"type":"string"},"externalUserId":{"type":["string","null"]},"joinedAt":{"type":"string","format":"date-time"},"leftAt":{"type":"string","format":"date-time"},"durationSec":{"type":"integer"}}},"meeting":{"type":"object"}}}}}]}}}},"responses":{"200":{"description":"Received"}}}},"participant.role_changed":{"post":{"summary":"participant.role_changed","description":"A host made someone a co-host, or took it away.\n\nHeaders: Nebulm-Signature (t=…,v1=…), Nebulm-Event, Nebulm-Event-Id, Nebulm-Webhook-Id, Nebulm-Delivery-Id. Answer 2xx within 5 s; anything else is retried (1m, 5m, 15m, 1h, then every 6h; 8 attempts). 410 stops retries.","requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"const":"participant.role_changed"},"data":{"type":"object"}}}]}}}},"responses":{"200":{"description":"Received"}}}},"poll.closed":{"post":{"summary":"poll.closed","description":"A poll closed, with its results (counts only).\n\nHeaders: Nebulm-Signature (t=…,v1=…), Nebulm-Event, Nebulm-Event-Id, Nebulm-Webhook-Id, Nebulm-Delivery-Id. Answer 2xx within 5 s; anything else is retried (1m, 5m, 15m, 1h, then every 6h; 8 attempts). 410 stops retries.","requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"const":"poll.closed"},"data":{"type":"object"}}}]}}}},"responses":{"200":{"description":"Received"}}}},"question.created":{"post":{"summary":"question.created","description":"Someone asked a question in the Q&A (no name when anonymous).\n\nHeaders: Nebulm-Signature (t=…,v1=…), Nebulm-Event, Nebulm-Event-Id, Nebulm-Webhook-Id, Nebulm-Delivery-Id. Answer 2xx within 5 s; anything else is retried (1m, 5m, 15m, 1h, then every 6h; 8 attempts). 410 stops retries.","requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"const":"question.created"},"data":{"type":"object"}}}]}}}},"responses":{"200":{"description":"Received"}}}},"recording.ready":{"post":{"summary":"recording.ready","description":"A recording finished processing and can be downloaded.\n\nHeaders: Nebulm-Signature (t=…,v1=…), Nebulm-Event, Nebulm-Event-Id, Nebulm-Webhook-Id, Nebulm-Delivery-Id. Answer 2xx within 5 s; anything else is retried (1m, 5m, 15m, 1h, then every 6h; 8 attempts). 410 stops retries.","requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"const":"recording.ready"},"data":{"type":"object","properties":{"recordingId":{"type":"string"},"meetingId":{"type":"string"},"durationSec":{"type":"integer"},"sizeBytes":{"type":"integer"},"meeting":{"type":"object"}}}}}]}}}},"responses":{"200":{"description":"Received"}}}},"recording.failed":{"post":{"summary":"recording.failed","description":"A recording could not be completed.\n\nHeaders: Nebulm-Signature (t=…,v1=…), Nebulm-Event, Nebulm-Event-Id, Nebulm-Webhook-Id, Nebulm-Delivery-Id. Answer 2xx within 5 s; anything else is retried (1m, 5m, 15m, 1h, then every 6h; 8 attempts). 410 stops retries.","requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"const":"recording.failed"},"data":{"type":"object","properties":{"recordingId":{"type":"string"},"meetingId":{"type":"string"},"error":{"type":"string"},"meeting":{"type":"object"}}}}}]}}}},"responses":{"200":{"description":"Received"}}}},"transcript.ready":{"post":{"summary":"transcript.ready","description":"The AI transcript of a recording is ready.\n\nHeaders: Nebulm-Signature (t=…,v1=…), Nebulm-Event, Nebulm-Event-Id, Nebulm-Webhook-Id, Nebulm-Delivery-Id. Answer 2xx within 5 s; anything else is retried (1m, 5m, 15m, 1h, then every 6h; 8 attempts). 410 stops retries.","requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"const":"transcript.ready"},"data":{"type":"object","properties":{"recordingId":{"type":"string"},"meetingId":{"type":"string"},"jobId":{"type":"string"},"language":{"type":"string"},"durationSec":{"type":"integer"},"segments":{"type":"integer"},"speakers":{"type":"integer"},"meeting":{"type":"object"}}}}}]}}}},"responses":{"200":{"description":"Received"}}}},"notes.ready":{"post":{"summary":"notes.ready","description":"The AI meeting notes (summary, action items) are ready.\n\nHeaders: Nebulm-Signature (t=…,v1=…), Nebulm-Event, Nebulm-Event-Id, Nebulm-Webhook-Id, Nebulm-Delivery-Id. Answer 2xx within 5 s; anything else is retried (1m, 5m, 15m, 1h, then every 6h; 8 attempts). 410 stops retries.","requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"const":"notes.ready"},"data":{"type":"object","properties":{"recordingId":{"type":"string"},"meetingId":{"type":"string"},"jobId":{"type":"string"},"title":{"type":"string"},"language":{"type":"string"},"actionItems":{"type":"integer"},"decisions":{"type":"integer"},"costUsd":{"type":"number"},"meeting":{"type":"object"}}}}}]}}}},"responses":{"200":{"description":"Received"}}}},"notes.failed":{"post":{"summary":"notes.failed","description":"AI notes could not be produced.\n\nHeaders: Nebulm-Signature (t=…,v1=…), Nebulm-Event, Nebulm-Event-Id, Nebulm-Webhook-Id, Nebulm-Delivery-Id. Answer 2xx within 5 s; anything else is retried (1m, 5m, 15m, 1h, then every 6h; 8 attempts). 410 stops retries.","requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"const":"notes.failed"},"data":{"type":"object","properties":{"recordingId":{"type":"string"},"meetingId":{"type":"string"},"jobId":{"type":"string"},"stage":{"type":["string","null"]},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}},"meeting":{"type":"object"}}}}}]}}}},"responses":{"200":{"description":"Received"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Organization API key. Scopes: meetings:read, meetings:write, recordings:read, recordings:write, webhooks:read, webhooks:write, members:read, members:write, usage:read, confidential:read"},"apiKeyHeader":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string","description":"Human-readable message"},"code":{"type":"string","description":"Machine-readable code, e.g. validation_error, insufficient_scope, not_found, rate_limited, link_expired"},"requestId":{"type":"string","description":"Quote it when contacting support"},"details":{"type":"object","description":"Extra context, e.g. { field }"}},"required":["error","code"]},"Meeting":{"type":"object","properties":{"id":{"type":"string"},"orgId":{"type":"string"},"title":{"type":"string"},"slug":{"type":"string","description":"Short code in the invite link /j/<slug>"},"status":{"type":"string","enum":["scheduled","active","ended"]},"scheduledAt":{"type":["string","null"],"description":"A recurring meeting: its next date","format":"date-time"},"durationMin":{"type":["integer","null"]},"timezone":{"type":["string","null"]},"recurrence":{"oneOf":[{"$ref":"#/components/schemas/Recurrence"},{"type":"null"}],"description":"null = a single meeting"},"startedAt":{"type":["string","null"],"format":"date-time"},"endedAt":{"type":["string","null"],"format":"date-time"},"endReason":{"type":["string","null"],"enum":["host","empty",null]},"recordingMode":{"type":"string","enum":["off","manual","auto"]},"recordingQuality":{"type":"string","enum":["720p","1080p","1440p"]},"aiNotes":{"type":"boolean","description":"AI notes for this meeting (own choice or the organization default)"},"waitingRoom":{"type":"boolean","description":"Guests using the public invite link knock first (join links skip it)"},"autoAdmit":{"type":"boolean"},"allowScreenShare":{"type":"boolean"},"allowClientRecording":{"type":"boolean"},"hideParticipants":{"type":"boolean"},"forceMute":{"type":"boolean","description":"Guests’ mics are locked: they can’t unmute until a host allows it"},"lockCameras":{"type":"boolean","description":"Guests’ cameras are locked: they can’t turn them on until a host allows it"},"hideOthers":{"type":"boolean","description":"Guests see and hear only the hosts and co-hosts"},"locked":{"type":"boolean","description":"Nobody new can join; only host tokens and host links get in"},"maxParticipants":{"type":"integer","description":"0 = unlimited"},"hasPasscode":{"type":"boolean"},"passcode":{"type":["string","null"]},"inviteUrl":{"type":"string","description":"Public invite link (guests type their own name)"},"externalId":{"type":["string","null"],"description":"Your id for this meeting (e.g. an LMS class session)"},"metadata":{"type":["object","null"],"description":"Your JSON (≤ 4 KB), echoed in webhooks"},"hostUserId":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"}}},"RecurrenceInput":{"type":"object","properties":{"freq":{"type":"string","enum":["daily","weekly","monthly"]},"interval":{"type":"integer","description":"Every N days, weeks or months","minimum":1,"maximum":99,"default":1},"byDay":{"type":"array","items":{"type":"string","pattern":"^(-?[1-5])?(SU|MO|TU|WE|TH|FR|SA)$"},"description":"Weekly: MO, WE… (default: the weekday of scheduledAt). Monthly: with its position, 2TU or -1FR."},"byMonthDay":{"type":"integer","description":"Monthly: 1–31, or -1 for the last day (default: the day of scheduledAt). A month without that day is skipped."},"until":{"type":"string","description":"Last date, YYYY-MM-DD in the meeting’s time zone, or an ISO instant. Not with count."},"count":{"type":"integer","description":"How many dates in all, from scheduledAt. Not with until. Neither: it goes on until stopped.","minimum":1,"maximum":1000},"weekStart":{"type":"string","description":"The day a week starts on, for \"every N weeks\"","enum":["MO","SU","SA"],"default":"MO"},"rule":{"type":"string","description":"Instead of the above: an RRULE value, e.g. FREQ=WEEKLY;INTERVAL=2;BYDAY=MO,WE"}},"description":"Needs scheduledAt and timezone. The series keeps its local time across daylight saving changes."},"Recurrence":{"type":"object","properties":{"freq":{"type":"string","enum":["daily","weekly","monthly"]},"interval":{"type":"integer"},"byDay":{"type":"array","items":{"type":"string"}},"byMonthDay":{"type":["integer","null"]},"until":{"type":["string","null"],"description":"Last date, in the meeting’s time zone"},"count":{"type":["integer","null"]},"weekStart":{"type":"string"},"rule":{"type":"string","description":"RRULE value"},"timezone":{"type":"string","description":"IANA zone the rule runs in"},"startsAt":{"type":"string","description":"First date of the rule (DTSTART)","format":"date-time"},"summary":{"type":"string","description":"In words, e.g. \"Every 2 weeks on Mon and Wed\""}}},"Occurrence":{"type":"object","properties":{"id":{"type":"string"},"meetingId":{"type":"string"},"originalStart":{"type":"string","description":"Where the rule puts it (iCalendar RECURRENCE-ID)","format":"date-time"},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["scheduled","cancelled"]},"title":{"type":"string"},"durationMin":{"type":"integer"},"edited":{"type":"boolean","description":"Has its own time, title or length"},"moved":{"type":"boolean","description":"Has its own time"},"sequence":{"type":"integer","description":"iCalendar SEQUENCE of its own changes"},"recordingIds":{"type":"array","items":{"type":"string"},"description":"Recordings of this date"}}},"OccurrenceInput":{"type":"object","properties":{"scheduledAt":{"type":["string","null"],"description":"Move this date. null: back to where the rule puts it","format":"date-time"},"durationMin":{"type":["integer","null"],"description":"null: the series’ length","minimum":5,"maximum":1440},"title":{"type":["string","null"],"description":"null: the series’ name","maxLength":200}},"description":"Send at least one field; the others stay as they are","minProperties":1},"MeetingInput":{"type":"object","properties":{"title":{"type":"string","maxLength":200},"scheduledAt":{"type":["string","null"],"format":"date-time"},"durationMin":{"type":"integer","minimum":5,"maximum":1440},"timezone":{"type":"string","description":"IANA zone, e.g. Europe/London"},"recordingMode":{"type":"string","description":"off: nobody can record until this is changed (AI notes are separate). manual: a host starts it. auto: records from the start. Default: the organization’s meeting defaults (manual). A value you send wins over the default.","enum":["off","manual","auto"]},"recurrence":{"oneOf":[{"$ref":"#/components/schemas/RecurrenceInput"},{"type":"null"}],"description":"Make it a recurring meeting (one link, one set of settings). null on update: stop repeating."},"recordingQuality":{"type":"string","description":"Composed recording size. Default: the organization’s meeting defaults (1080p). 1440p only when the platform has enabled it for the organization; otherwise 400.","enum":["720p","1080p","1440p"]},"aiNotes":{"type":"boolean","description":"Default: the organization’s meeting defaults (off)"},"notesTemplateId":{"type":"string","description":"AI notes template of this organization (built-in ids start with builtin:); null = the organization’s default"},"waitingRoom":{"type":"boolean","description":"Default: the organization’s meeting defaults (off)"},"autoAdmit":{"type":"boolean","description":"Guests join without waiting. Default: the organization’s meeting defaults (off)"},"allowScreenShare":{"type":"boolean","description":"Guests (not only hosts) can share their screen. Default: the organization’s meeting defaults (off)"},"allowClientRecording":{"type":"boolean","description":"Guests can record on their device. Default: the organization’s meeting defaults (off)"},"hideParticipants":{"type":"boolean","description":"Hide the participant list from guests. Default: the organization’s meeting defaults (off). Refused (403 locked_by_org) when the organization decides it for every meeting (Settings → Privacy & recording); allowClientRecording true is refused (403 device_recording_off) unless the organization leaves device recording to hosts"},"forceMute":{"type":"boolean","description":"Guests join with their mic locked and can’t unmute until a host allows it. On a live meeting it applies to everyone in the call at once. Default: the organization’s meeting defaults (off)"},"lockCameras":{"type":"boolean","description":"Guests join with their camera locked and can’t turn it on until a host allows it. On a live meeting it applies to everyone in the call at once. Default: the organization’s meeting defaults (off)"},"hideOthers":{"type":"boolean","description":"Guests see and hear only the hosts and co-hosts (webinar style). Default: the organization’s meeting defaults (off)"},"maxParticipants":{"type":"integer","description":"0 = unlimited, else 2–500. Default: the organization’s meeting defaults (unlimited)"},"passcode":{"type":["string","null"],"maxLength":64},"externalId":{"type":["string","null"],"maxLength":128},"metadata":{"type":["object","null"]},"hostUserId":{"type":["string","null"],"description":"A member of the organization who gets host controls in the dashboard"}}},"JoinLinkInput":{"type":"object","properties":{"displayName":{"type":"string","description":"Shown in the call, the attendance and the transcript","maxLength":80},"role":{"type":"string","description":"host: full controls · participant: camera/mic/chat · viewer: watch + chat only","enum":["host","participant","viewer"],"default":"participant"},"externalUserId":{"type":"string","description":"Your user id — returned in attendance, transcripts, stems, chat and webhooks","maxLength":128},"adminUser":{"type":"string","description":"Host links only. Email or user id of an admin of this organization, if that is who will use the link. They also get an admin's rights in the call, such as turning on a recording that is off. Refused (403 not_org_admin) for anyone else, and checked again each time the link is used."},"metadata":{"type":"object","description":"Your JSON (≤ 2 KB), returned with attendance and participant webhooks"},"expiresAt":{"type":"string","description":"Default: 24 h from now; at most 30 days","format":"date-time"},"expiresInSec":{"type":"integer","minimum":60,"maximum":2592000}},"required":["displayName"]},"JoinLink":{"type":"object","properties":{"id":{"type":"string"},"meetingId":{"type":"string"},"role":{"type":"string","enum":["host","participant","viewer"]},"displayName":{"type":"string"},"externalUserId":{"type":["string","null"]},"metadata":{"type":["object","null"]},"identity":{"type":"string","description":"The participant identity (x_…) in the call"},"url":{"type":"string","description":"Open it, or put it in an <iframe> on an allowed embed origin. Only returned when created."},"token":{"type":"string","description":"The signed token inside the url (#t=…). Only returned when created."},"expiresAt":{"type":"string","format":"date-time"},"revokedAt":{"type":["string","null"],"format":"date-time"},"useCount":{"type":"integer"},"lastUsedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Attendee":{"type":"object","properties":{"externalUserId":{"type":["string","null"]},"userId":{"type":["string","null"],"description":"Dashboard user id (members)"},"name":{"type":"string"},"role":{"type":"string","enum":["host","participant","viewer"]},"metadata":{"type":["object","null"]},"identities":{"type":"array","items":{"type":"string"}},"firstJoinedAt":{"type":"string","format":"date-time"},"lastLeftAt":{"type":["string","null"],"format":"date-time"},"totalSeconds":{"type":"integer","description":"Time in the meeting, rejoins summed"},"sessionCount":{"type":"integer"},"stillPresent":{"type":"boolean"},"sessions":{"type":"array","items":{"type":"object","properties":{"identity":{"type":"string"},"roomId":{"type":["string","null"]},"joinedAt":{"type":"string","format":"date-time"},"leftAt":{"type":["string","null"],"format":"date-time"}}},"description":"With ?include=sessions"}}},"LiveParticipant":{"type":"object","properties":{"identity":{"type":"string"},"name":{"type":"string"},"role":{"type":"string","enum":["host","participant","viewer"]},"externalUserId":{"type":["string","null"]},"userId":{"type":["string","null"]},"roomId":{"type":["string","null"],"description":"Breakout room, null = main room"},"roomName":{"type":["string","null"],"description":"The breakout room’s name (null = main room)"},"joinedAt":{"type":["string","null"],"format":"date-time"},"microphone":{"type":"string","enum":["on","muted","off"]},"camera":{"type":"string","enum":["on","muted","off"]},"screenShare":{"type":"string","enum":["on","muted","off"]},"handRaised":{"type":"boolean"},"handRaisedAt":{"type":["string","null"],"format":"date-time"},"permissions":{"type":"object","properties":{"microphone":{"type":"boolean","description":"May turn their microphone on (false: locked by a host or the meeting’s force mute)"},"camera":{"type":"boolean","description":"May turn their camera on (false: locked by a host or the meeting’s camera lock)"},"screenShare":{"type":"boolean","description":"May share their screen"},"localRecording":{"type":"boolean","description":"Allowed to record on their own device (the meeting may also allow everyone)"}},"description":"Always false for watch-only participants (viewers)"},"unmuteRequest":{"type":["object","null"],"properties":{"askedAt":{"type":"string","format":"date-time"},"answer":{"type":["string","null"],"description":"null while they haven’t answered","enum":["unmuted","stay","unavailable",null]},"answeredAt":{"type":["string","null"],"format":"date-time"}},"description":"The latest \"ask to unmute\" (last 10 minutes)"}}},"ParticipantPermissionsInput":{"type":"object","properties":{"microphone":{"type":"boolean","description":"false locks their mic (and mutes it now); true lets them speak"},"camera":{"type":"boolean","description":"false locks their camera (and turns it off now); true lets them use it"},"screenShare":{"type":"boolean"},"localRecording":{"type":"boolean"}},"description":"Send at least one field; the others stay as they are","minProperties":1},"Recording":{"type":"object","properties":{"id":{"type":"string"},"meetingId":{"type":"string"},"orgId":{"type":"string"},"meetingTitle":{"type":"string"},"occurrenceId":{"type":["string","null"],"description":"The date of a recurring meeting it belongs to"},"status":{"type":"string","enum":["recording","stopping","processing","complete","failed","aborted","lost"]},"mode":{"type":"string","description":"audio = AI-notes-only capture · tracks = video","enum":["audio","tracks","composite"]},"durationSec":{"type":["integer","null"]},"size":{"type":["integer","null"]},"startedAt":{"type":"string","format":"date-time"},"endedAt":{"type":["string","null"],"format":"date-time"},"roomId":{"type":["string","null"]},"downloadUrl":{"type":["string","null"]},"streamUrl":{"type":["string","null"]},"thumbnailUrl":{"type":["string","null"]},"rerendering":{"type":"boolean","description":"A re-render is running (status processing): downloadUrl / streamUrl / thumbnailUrl serve the previous version until the new one replaces it"},"ai":{"type":"object","properties":{"status":{"type":"string"},"progress":{"type":["integer","null"]},"language":{"type":["string","null"]},"hasSummary":{"type":"boolean"},"hasTranscript":{"type":"boolean"}}},"stems":{"type":["object","null"]}}},"TranscriptSegment":{"type":"object","properties":{"idx":{"type":"integer"},"start":{"type":"number","description":"Seconds from the recording start"},"end":{"type":"number"},"text":{"type":"string"},"speaker":{"type":"object","properties":{"identity":{"type":["string","null"]},"name":{"type":"string"},"externalUserId":{"type":["string","null"]}}}}},"Webhook":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"},"description":{"type":["string","null"]},"events":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"lastSuccessAt":{"type":["string","null"],"format":"date-time"},"lastFailureAt":{"type":["string","null"],"format":"date-time"},"lastError":{"type":["string","null"]},"failureStreak":{"type":"integer"},"createdAt":{"type":"string","format":"date-time"}}},"WebhookInput":{"type":"object","properties":{"url":{"type":"string","description":"https, public host","format":"uri"},"events":{"oneOf":[{"type":"array","items":{"type":"string"}},{"const":"*"}],"description":"Event types, \"meeting.*\"-style wildcards, or \"*\" (default)"},"description":{"type":"string","maxLength":200},"enabled":{"type":"boolean"}}},"Delivery":{"type":"object","properties":{"id":{"type":"string"},"eventType":{"type":"string"},"eventId":{"type":"string"},"status":{"type":"string","enum":["pending","delivered","dead"]},"attempts":{"type":"integer"},"lastStatusCode":{"type":["integer","null"]},"lastError":{"type":["string","null"]},"nextAttemptAt":{"type":["string","null"],"format":"date-time"},"deliveredAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Event":{"type":"object","properties":{"id":{"type":"string","description":"evt_… — stable across retries; dedupe on it"},"type":{"type":"string","enum":["meeting.started","meeting.ended","meeting.reopened","meeting.occurrence_updated","meeting.occurrence_cancelled","meeting.occurrence_restored","participant.joined","participant.left","participant.role_changed","poll.closed","question.created","recording.ready","recording.failed","transcript.ready","notes.ready","notes.failed"]},"createdAt":{"type":"string","format":"date-time"},"orgId":{"type":"string"},"data":{"type":"object","description":"Event-specific. Events about a meeting carry meetingId and meeting { id, title, slug, externalId, metadata }."}},"required":["id","type","createdAt","data"]},"Member":{"type":"object","properties":{"userId":{"type":"string"},"email":{"type":"string"},"displayName":{"type":["string","null"]},"role":{"type":"string","enum":["admin","member"]},"status":{"type":"string"},"lastLoginAt":{"type":["string","null"],"format":"date-time"},"addedAt":{"type":"string","format":"date-time"}}},"ShareLink":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":["string","null"]},"expiresAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"Usage":{"type":"object","properties":{"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"},"meetings":{"type":"object","properties":{"created":{"type":"integer"},"sessions":{"type":"integer"},"minutes":{"type":"integer"}}},"participants":{"type":"object","properties":{"sessions":{"type":"integer"},"attendees":{"type":"integer"},"minutes":{"type":"integer"}}},"recordings":{"type":"object","properties":{"count":{"type":"integer"},"minutes":{"type":"integer"},"bytes":{"type":"integer"}}},"storage":{"type":"object","properties":{"recordings":{"type":"integer"},"bytes":{"type":"integer"}}},"aiNotes":{"type":"object","properties":{"jobs":{"type":"integer"},"audioMinutes":{"type":"integer"},"costUsd":{"type":"number"}}}}}},"responses":{"E400":{"description":"Invalid request (code validation_error, invalid_json, key_in_url…)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E423":{"description":"The meeting is locked: only hosts can join (meeting_locked)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E401":{"description":"Missing, invalid, expired or revoked key (unauthorized, invalid_api_key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E403":{"description":"The key lacks the scope (insufficient_scope) or the organization is suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E404":{"description":"Not found — or not in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E409":{"description":"Conflict with the current state (meeting_ended, not_ready, idempotency_in_progress…)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E410":{"description":"The meeting has ended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E422":{"description":"Idempotency-Key reused for a different request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E429":{"description":"Rate limit exceeded (rate_limited)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E503":{"description":"A dependency (media server, storage) is unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"x-scopes":[{"id":"meetings:read","label":"Read meetings","hint":"Meetings, attendance, live room state, chat"},{"id":"meetings:write","label":"Manage meetings","hint":"Create, update, end meetings; mint join links; remove, mute and moderate people"},{"id":"recordings:read","label":"Read recordings","hint":"Recordings, downloads, stems, AI notes and transcripts"},{"id":"recordings:write","label":"Manage recordings","hint":"Share links, delete recordings, generate AI notes"},{"id":"webhooks:read","label":"Read webhooks","hint":"Webhook endpoints and their deliveries"},{"id":"webhooks:write","label":"Manage webhooks","hint":"Add, change and remove webhook endpoints"},{"id":"members:read","label":"Read team","hint":"List the organization’s members"},{"id":"members:write","label":"Manage team","hint":"Invite members and remove them"},{"id":"usage:read","label":"Read usage","hint":"Meeting minutes, attendance, storage, AI notes spend"},{"id":"confidential:read","label":"Read confidential meetings","hint":"Also opens meetings marked confidential, and everything in them","sensitive":true}]}