# RealtimeKit API Reference Complete API reference for Meeting object, REST endpoints, and SDK methods. ## Meeting Object API ### `meeting.self` - Local Participant ```typescript // Properties: id, userId, name, audioEnabled, videoEnabled, screenShareEnabled, audioTrack, videoTrack, screenShareTracks, roomJoined, roomState // Methods await meeting.self.enableAudio() / disableAudio() / enableVideo() / disableVideo() / enableScreenShare() / disableScreenShare() await meeting.self.setName("Name") // Before join only await meeting.self.setDevice(device) const devices = await meeting.self.getAllDevices() / getAudioDevices() / getVideoDevices() / getSpeakerDevices() // Events: 'roomJoined', 'audioUpdate', 'videoUpdate', 'screenShareUpdate', 'deviceUpdate', 'deviceListUpdate' meeting.self.on('roomJoined', () => {}) meeting.self.on('audioUpdate', ({ audioEnabled, audioTrack }) => {}) ``` ### `meeting.participants` - Remote Participants **Collections**: ```typescript meeting.participants.joined / active / waitlisted / pinned // Maps const participants = meeting.participants.joined.toArray() const count = meeting.participants.joined.size() const p = meeting.participants.joined.get('peer-id') ``` **Participant Properties**: ```typescript participant.id / userId / name participant.audioEnabled / videoEnabled / screenShareEnabled participant.audioTrack / videoTrack / screenShareTracks ``` **Events**: ```typescript meeting.participants.joined.on('participantJoined', (participant) => {}) meeting.participants.joined.on('participantLeft', (participant) => {}) ``` ### `meeting.meta` - Metadata ```typescript meeting.meta.meetingId / meetingTitle / meetingStartedTimestamp ``` ### `meeting.chat` - Chat ```typescript meeting.chat.messages // Array await meeting.chat.sendTextMessage("Hello") / sendImageMessage(file) meeting.chat.on('chatUpdate', ({ message, messages }) => {}) ``` ### `meeting.polls` - Polling ```typescript meeting.polls.items // Array await meeting.polls.create(question, options, anonymous, hideVotes) await meeting.polls.vote(pollId, optionIndex) ``` ### `meeting.plugins` - Collaborative Apps ```typescript meeting.plugins.all // Array await meeting.plugins.activate(pluginId) / deactivate() ``` ### `meeting.ai` - AI Features ```typescript meeting.ai.transcripts // Live transcriptions (when enabled in Preset) ``` ### Core Methods ```typescript await meeting.join() // Emits 'roomJoined' on meeting.self await meeting.leave() ``` ## TypeScript Types ```typescript import type { RealtimeKitClient, States, UIConfig, Participant } from '@cloudflare/realtimekit'; // Main interface interface RealtimeKitClient { self: SelfState; // Local participant (id, userId, name, audioEnabled, videoEnabled, roomJoined, roomState) participants: { joined, active, waitlisted, pinned }; // Reactive Maps chat: ChatNamespace; // messages[], sendTextMessage(), sendImageMessage() polls: PollsNamespace; // items[], create(), vote() plugins: PluginsNamespace; // all[], activate(), deactivate() ai: AINamespace; // transcripts[] meta: MetaState; // meetingId, meetingTitle, meetingStartedTimestamp join(): Promise; leave(): Promise; } // Participant (self & remote share same shape) interface Participant { id: string; // Peer ID (changes on rejoin) userId: string; // Persistent participant ID name: string; audioEnabled: boolean; videoEnabled: boolean; screenShareEnabled: boolean; audioTrack: MediaStreamTrack | null; videoTrack: MediaStreamTrack | null; screenShareTracks: MediaStreamTrack[]; } ``` ## Store Architecture RealtimeKit uses reactive store (event-driven updates, live Maps): ```typescript // Subscribe to state changes meeting.self.on('audioUpdate', ({ audioEnabled, audioTrack }) => {}); meeting.participants.joined.on('participantJoined', (p) => {}); // Access current state synchronously const isAudioOn = meeting.self.audioEnabled; const count = meeting.participants.joined.size(); ``` **Key principles:** State updates emit events after changes. Use `.toArray()` sparingly. Collections are live Maps. ## REST API Base: `https://api.cloudflare.com/client/v4/accounts/{account_id}/realtime/kit/{app_id}` ### Meetings ```bash GET /meetings # List all GET /meetings/{meeting_id} # Get details POST /meetings # Create: {"title": "..."} PATCH /meetings/{meeting_id} # Update: {"title": "...", "record_on_start": true} ``` ### Participants ```bash GET /meetings/{meeting_id}/participants # List all GET /meetings/{meeting_id}/participants/{participant_id} # Get details POST /meetings/{meeting_id}/participants # Add: {"name": "...", "preset_name": "...", "custom_participant_id": "..."} PATCH /meetings/{meeting_id}/participants/{participant_id} # Update: {"name": "...", "preset_name": "..."} DELETE /meetings/{meeting_id}/participants/{participant_id} # Delete POST /meetings/{meeting_id}/participants/{participant_id}/token # Refresh token ``` ### Active Session ```bash GET /meetings/{meeting_id}/active-session # Get active session POST /meetings/{meeting_id}/active-session/kick # Kick users: {"user_ids": ["id1", "id2"]} POST /meetings/{meeting_id}/active-session/kick-all # Kick all POST /meetings/{meeting_id}/active-session/poll # Create poll: {"question": "...", "options": [...], "anonymous": false} ``` ### Recording ```bash GET /recordings?meeting_id={meeting_id} # List recordings GET /recordings/active-recording/{meeting_id} # Get active recording POST /recordings # Start: {"meeting_id": "...", "type": "composite"} (or "track") PUT /recordings/{recording_id} # Control: {"action": "pause"} (or "resume", "stop") POST /recordings/track # Track recording: {"meeting_id": "...", "layers": [...]} ``` ### Livestreaming ```bash GET /livestreams?exclude_meetings=false # List all GET /livestreams/{livestream_id} # Get details POST /meetings/{meeting_id}/livestreams # Start for meeting POST /meetings/{meeting_id}/active-livestream/stop # Stop POST /livestreams # Create independent: returns {ingest_server, stream_key, playback_url} ``` ### Sessions & Analytics ```bash GET /sessions # List all GET /sessions/{session_id} # Get details GET /sessions/{session_id}/participants # List participants GET /sessions/{session_id}/participants/{participant_id} # Call stats GET /sessions/{session_id}/chat # Download chat CSV GET /sessions/{session_id}/transcript # Download transcript CSV GET /sessions/{session_id}/summary # Get summary POST /sessions/{session_id}/summary # Generate summary GET /analytics/daywise?start_date=YYYY-MM-DD&end_date=YYYY-MM-DD # Day-wise analytics GET /analytics/livestreams/overall # Livestream analytics ``` ### Webhooks ```bash GET /webhooks # List all POST /webhooks # Create: {"url": "https://...", "events": ["session.started", "session.ended"]} PATCH /webhooks/{webhook_id} # Update DELETE /webhooks/{webhook_id} # Delete ``` ## Session Lifecycle ``` Initialization → Join Intent → [Waitlist?] → Meeting Screen (Stage) → Ended ↓ Approved [Rejected → Ended] ``` UI Kit handles state transitions automatically. ## See Also - [Configuration](./configuration.md) - Setup and installation - [Patterns](./patterns.md) - Usage examples - [README](./README.md) - Overview and quick start