{"name":"Stream API","database":"supabase","endpoints":{"GET /health":"Health check","GET /config":"Get rooms config","GET /token?password=xxx&role=broadcaster|guest|viewer":"Get token","POST /webhook":"LiveKit webhook receiver","GET /events?password=xxx":"View webhook events","GET /rooms?password=xxx":"View rooms","GET /participants?password=xxx":"View participants","GET /issues?password=xxx":"View connection issues","POST /recording/start":"Start MP4 recording (body: {room, layout?})","POST /recording/stop":"Stop recording (body: {room} or {egressId})","GET /recording/status":"Get recording status (?room=)","GET /recordings":"List all recordings (?room=&active=&limit=)","DELETE /recording/:room":"Clear stuck recording from memory","POST /ingress/create":"Create RTMP ingress for OBS (body: {room, name})","GET /ingress/list":"List all ingress entries (?room=)","DELETE /ingress/:ingressId":"Delete an ingress","POST /guest/invite":"Create guest invite link (body: {room, guestName})","GET /guest/join?invite=xxx&name=xxx":"Join as guest via invite link","GET /guest/invites?password=xxx":"List active guest invites","POST /guest/kick":"Kick guest from room (body: {room, guestIdentity})","POST /guest/permissions":"Update guest permissions (body: {room, guestIdentity, canPublishAudio, canPublishVideo})","POST /guest/mute-all":"Mute all guests - Take Over mode (body: {room})","POST /guest/unmute-all":"Unmute all guests - Resume mode (body: {room})","POST /heartbeat/ping":"Studio sends heartbeat ping (body: {room, studio_timestamp})","GET /heartbeat/pending":"Viewer polls for pending heartbeat (?room=)","POST /heartbeat/pong":"Viewer responds with metrics (body: {heartbeat_id, viewer_data})","GET /heartbeat/stats":"Get latency stats (?room=&limit=50)"}}