{"service": "bsmeet-api", "name": "BS Meet", "description": "The BSafe Group meeting room: rooms, calls, a shared board, recording and playback", "version": "1.0.0", "base_url": "https://meet-api.bsafegroup.be", "client": "https://meet.bsafegroup.be", "api": "/api", "health": "/healthz", "websocket": "/ws", "documentation": "https://meet.bsafegroup.be/docs", "endpoint_count": 58, "endpoints": [{"group": "meta", "method": "GET", "path": "/", "auth": "none", "summary": "This document: what the service is and every route it serves"}, {"group": "meta", "method": "GET", "path": "/healthz", "auth": "none", "summary": "Whether the service is up and can reach its database"}, {"group": "meta", "method": "GET", "path": "/api/config", "auth": "none", "summary": "What this deployment allows: features, limits and the file types a board takes"}, {"group": "meta", "method": "GET", "path": "/api/ice", "auth": "none", "summary": "The STUN and TURN servers a browser should use, with a short-lived credential"}, {"group": "meta", "method": "GET", "path": "/api/version", "auth": "none", "summary": "The build, and whether the media server, TURN and the queue are configured"}, {"group": "meta", "method": "GET", "path": "/api/stats", "auth": "none", "summary": "How many connections are open and how deep the board conversion queue is"}, {"group": "auth", "method": "POST", "path": "/api/auth/register", "auth": "none", "summary": "Create an account"}, {"group": "auth", "method": "POST", "path": "/api/auth/login", "auth": "none", "summary": "Turn an email and a password into a session"}, {"group": "auth", "method": "POST", "path": "/api/auth/refresh", "auth": "none", "summary": "Exchange a refresh token for the next pair; presenting a spent one ends the session"}, {"group": "auth", "method": "POST", "path": "/api/auth/logout", "auth": "none", "summary": "End this device's session"}, {"group": "auth", "method": "POST", "path": "/api/auth/password", "auth": "user", "summary": "Change the password, which signs out every other device"}, {"group": "auth", "method": "GET", "path": "/api/auth/me", "auth": "user", "summary": "The signed-in account"}, {"group": "auth", "method": "PATCH", "path": "/api/auth/me", "auth": "user", "summary": "Change the display name or avatar"}, {"group": "auth", "method": "GET", "path": "/api/auth/sessions", "auth": "user", "summary": "The devices this account is signed in on"}, {"group": "auth", "method": "DELETE", "path": "/api/auth/sessions", "auth": "user", "summary": "Sign out every device except this one"}, {"group": "auth", "method": "DELETE", "path": "/api/auth/sessions/:familyId", "auth": "user", "summary": "Sign out one device"}, {"group": "rooms", "method": "GET", "path": "/api/rooms", "auth": "user", "summary": "The rooms this account owns"}, {"group": "rooms", "method": "POST", "path": "/api/rooms", "auth": "user", "summary": "Create a room"}, {"group": "rooms", "method": "GET", "path": "/api/rooms/:slug/preview", "auth": "none", "summary": "What a join page needs before anybody is in: title, host and whether it is live"}, {"group": "rooms", "method": "GET", "path": "/api/rooms/:slug", "auth": "user", "summary": "One room in full"}, {"group": "rooms", "method": "PATCH", "path": "/api/rooms/:id", "auth": "user", "summary": "Rename a room or change its settings"}, {"group": "rooms", "method": "DELETE", "path": "/api/rooms/:id", "auth": "user", "summary": "Delete a room"}, {"group": "rooms", "method": "GET", "path": "/api/rooms/:id/participants", "auth": "user", "summary": "Who is in the room now"}, {"group": "history", "method": "GET", "path": "/api/rooms/:slug/calls", "auth": "user", "summary": "The meetings this room has already held"}, {"group": "history", "method": "GET", "path": "/api/calls/:id/events", "auth": "user", "summary": "The story of one meeting, in order"}, {"group": "history", "method": "GET", "path": "/api/calls/:id/attendance", "auth": "user", "summary": "Who was in one meeting and for how long"}, {"group": "history", "method": "GET", "path": "/api/rooms/:slug/recordings", "auth": "user", "summary": "The recordings kept from this room"}, {"group": "playback", "method": "GET", "path": "/api/playback/:slug/:id", "auth": "none", "summary": "Everything needed to replay one recording: its media files, people, boards and timeline"}, {"group": "playback", "method": "GET", "path": "/api/playback/:slug/:id/events", "auth": "none", "summary": "The rest of a long recording's timeline, a page at a time"}, {"group": "meetings", "method": "GET", "path": "/api/meetings", "auth": "user", "summary": "Meetings this account organises or is invited to"}, {"group": "meetings", "method": "POST", "path": "/api/meetings", "auth": "user", "summary": "Schedule a meeting"}, {"group": "meetings", "method": "GET", "path": "/api/meetings/:id", "auth": "user", "summary": "One meeting"}, {"group": "meetings", "method": "PATCH", "path": "/api/meetings/:id", "auth": "user", "summary": "Change a scheduled meeting"}, {"group": "meetings", "method": "DELETE", "path": "/api/meetings/:id", "auth": "user", "summary": "Cancel it, and tell everybody invited"}, {"group": "meetings", "method": "POST", "path": "/api/meetings/:id/invites", "auth": "user", "summary": "Invite more people"}, {"group": "meetings", "method": "DELETE", "path": "/api/meetings/:id/invites/:inviteId", "auth": "user", "summary": "Withdraw one invitation"}, {"group": "meetings", "method": "GET", "path": "/api/invites/:token", "auth": "none", "summary": "What an invitation link points at, without signing in"}, {"group": "meetings", "method": "POST", "path": "/api/invites/:token/respond", "auth": "none", "summary": "Accept or decline an invitation"}, {"group": "boards", "method": "POST", "path": "/api/rooms/:slug/boards", "auth": "user", "summary": "Open a blank whiteboard in a room"}, {"group": "boards", "method": "GET", "path": "/api/rooms/:slug/boards/hash/:hash", "auth": "user", "summary": "Whether this room already holds a board made from a file with this hash"}, {"group": "boards", "method": "GET", "path": "/api/boards/:id", "auth": "none", "summary": "One board and its pages"}, {"group": "boards", "method": "DELETE", "path": "/api/boards/:id", "auth": "user", "summary": "Delete a board and its slides"}, {"group": "service", "method": "POST", "path": "/api/service/rooms", "auth": "service", "summary": "Create a room on behalf of one of your users"}, {"group": "service", "method": "GET", "path": "/api/service/rooms/:slug", "auth": "service", "summary": "Look a room up"}, {"group": "service", "method": "POST", "path": "/api/service/presence", "auth": "service", "summary": "Which rooms an address is in right now"}, {"group": "service", "method": "PATCH", "path": "/api/service/rooms/:slug", "auth": "service", "summary": "Change a room's settings; merged over what is there"}, {"group": "service", "method": "POST", "path": "/api/service/rooms/:slug/end", "auth": "service", "summary": "End the call in a room now, disconnecting everyone"}, {"group": "service", "method": "POST", "path": "/api/service/meetings", "auth": "service", "summary": "Schedule a meeting from your calendar; idempotent on externalId"}, {"group": "service", "method": "GET", "path": "/api/service/meetings/:externalId", "auth": "service", "summary": "Find a meeting by your own id"}, {"group": "service", "method": "DELETE", "path": "/api/service/meetings/:externalId", "auth": "service", "summary": "Cancel it"}, {"group": "service", "method": "GET", "path": "/api/service/meetings/:externalId/recordings", "auth": "service", "summary": "Every recording kept from that meeting's room, each with its playback link"}, {"group": "service", "method": "POST", "path": "/api/service/join-tokens", "auth": "service", "summary": "Let one of your users into one room for five minutes, under a name you choose"}, {"group": "internal", "method": "POST", "path": "/api/internal/speaking", "auth": "internal", "summary": "The media server reporting who is talking"}, {"group": "internal", "method": "POST", "path": "/api/internal/boards", "auth": "internal", "summary": "A document the media server has written to disk, to be turned into slides"}, {"group": "internal", "method": "POST", "path": "/api/internal/image-boards", "auth": "internal", "summary": "An empty deck to be filled a page at a time"}, {"group": "internal", "method": "POST", "path": "/api/internal/board-pages", "auth": "internal", "summary": "One page of an existing deck"}, {"group": "internal", "method": "POST", "path": "/api/internal/recordings/track-started", "auth": "internal", "summary": "A media file has started being written for a recording"}, {"group": "internal", "method": "POST", "path": "/api/internal/recordings/track-ended", "auth": "internal", "summary": "That file is closed, with its size and whether it is usable"}], "time": "2026-10-10T02:20:12Z"}