📘 API reference
The API has the same shape on every platform: initialize (optional), join with options, receive callbacks, and optionally leave from your app.
🚪 Entry points and callbacks
- Android
- iOS
- Flutter
- React Native
| Kotlin | |
|---|---|
| Import | import org.bigbluebutton.bbb.sdk.* |
| Initialize (optional) | BigBlueButtonSdk.initialize(application) or BigBlueButtonSdk.initialize(application, config) |
| Join | BigBlueButtonSdk.join(activity, options, listener) |
| Leave (host-initiated) | BigBlueButtonSdk.leave() |
| In a meeting? | BigBlueButtonSdk.isInMeeting |
| Callbacks | BbbMeetingListener: onJoined(), onLeft(reason, detail), onError(message) |
| Extra listeners | BigBlueButtonSdk.addListener(listener) / BigBlueButtonSdk.removeListener(listener), for every meeting |
| Swift | |
|---|---|
| Import | import BBBMeetingSDK |
| Initialize (optional) | BigBlueButtonSDK.shared.initialize(config: BBBSDKConfig()) |
| Join | BigBlueButtonSDK.shared.join(from: viewController, options: options, delegate: self) |
| Leave (host-initiated) | BigBlueButtonSDK.shared.leave() |
| In a meeting? | BigBlueButtonSDK.shared.isInMeeting |
| Callbacks | BBBMeetingDelegate: meetingDidJoin(), meetingDidLeave(reason:detail:), meetingDidFail(message:) |
| Dart | |
|---|---|
| Import | import 'package:bbb_meeting_sdk/bbb_meeting_sdk.dart'; |
| Initialize (optional) | await BbbMeetingSdk.initialize(config: const BbbSdkConfig()) |
| Join | final left = await BbbMeetingSdk.join(options): completes with a BbbLeaveInfo when the user is back in the app |
| Leave (host-initiated) | await BbbMeetingSdk.leave() |
| In a meeting? | await BbbMeetingSdk.isInMeeting |
| Callbacks | BbbMeetingSdk.events, a broadcast stream of BbbJoinedEvent, BbbLeftEvent and BbbErrorEvent |
| TypeScript | |
|---|---|
| Import | import { BigBlueButtonMeeting, configureBigBlueButtonMeeting } from '@bbb-mobile/bigbluebutton-mobile-sdk'; |
| Initialize | configureBigBlueButtonMeeting(options), once at startup |
| Join | render <BigBlueButtonMeeting joinUrl={url} … /> full-screen |
| Leave (host-initiated) | the leaveSignal prop |
| In a meeting? | while the component is mounted |
| Callbacks | the onJoined and onLeave(info) props (onError(message) is accepted but not called yet in 0.1.0) |
Initializing is optional on the native platforms: join initializes lazily with the default configuration. Initialize at startup to pass your own clientType or appVersion, and to make the first join faster. It is idempotent.
⚙️ Join options
Only joinUrl is required.
| Option | Type | Default | Description |
|---|---|---|---|
joinUrl | string | — (required) | https://<server>/html5client/join?sessionToken=…, or any https URL whose path ends in /join |
meetingName | string | none | name of the meeting |
theme | system, light, dark | system | color theme of the meeting UI |
pictureInPicture | boolean | true | floating window when the user leaves the app (Android picture-in-picture, iOS AVKit) |
screensharePresenter | boolean | Android true, iOS false | whether this device may share its screen. The SDK turns it off where the platform cannot share (Android below 10, the iOS simulator). On iOS, set it only when your app ships the Broadcast Upload Extension. |
embedMode | auto, native, webview | auto | how the whiteboard, shared notes and external video are rendered |
largeScreenLayout | phone, sidebar | phone | composition on large screens (tablets, unfolded foldables) |
devLogging | boolean | false | verbose client logging in logcat or the Xcode console |
Enum values per platform:
| Platform | Theme | Embed mode | Large-screen layout |
|---|---|---|---|
| Android | BbbTheme.SYSTEM, LIGHT, DARK | BbbEmbedMode.AUTO, NATIVE, WEBVIEW | BbbLargeScreenLayout.PHONE, SIDEBAR |
| iOS | BBBTheme.system, .light, .dark | BBBEmbedMode.auto, .native, .webview | BBBLargeScreenLayout.phone, .sidebar |
| Flutter | BbbTheme.system, light, dark | BbbEmbedMode.auto, native, webview | BbbLargeScreenLayout.phone, sidebar |
| React Native | 'system', 'light', 'dark' | 'auto', 'native', 'webview' | 'phone', 'sidebar' |
The option types are BbbJoinOptions (Android, Flutter), BBBJoinOptions (iOS) and the props of <BigBlueButtonMeeting/> (React Native). In Flutter, leaving screensharePresenter unset uses the platform default.
🧩 Process-wide configuration
Given once, at initialization: BbbSdkConfig (Android, Flutter), BBBSDKConfig (iOS), or the options of configureBigBlueButtonMeeting (React Native).
| Option | Default | Description |
|---|---|---|
clientType | NATIVE_MOBILE | client type reported to the BigBlueButton server |
appVersion | your app's version (Android versionName, iOS CFBundleShortVersionString, Flutter the host app's); React Native: the Expo config version, or 0.0.0, so pass it explicitly | shown in the user agent |
registerWebRtcGlobals | true | React Native only: pass false when your app registers the LiveKit WebRTC globals itself |
📣 Callback behaviour
- Error is non-fatal: the meeting may still be running.
- A join that fails before the meeting opens (invalid link, network or HTTP error) ends with the leave reason
erroronce the user closes the error screen. A join the server refuses ends withended, and an unsupported server withunsupported. - On iOS, the meeting controller is already dismissed when
meetingDidLeavearrives, and all delegate calls arrive on the main thread.
🏁 Leave reasons
| Reason | Meaning |
|---|---|
left | the user left (leave button, declined recording, cancelled the guest lobby), or your app asked the meeting to leave (detail is host_leave) |
ended | the meeting ended on the server; the user was removed or refused (for example removed by a moderator, a duplicate session, inactivity, or a full meeting); or a guest was denied. detail carries the end or eject code, for example user_requested_eject_reason |
error | the join failed or the session hit an unrecoverable error; detail carries the error message or reason code |
unsupported | the server version or media bridge is not supported by this client (it needs BigBlueButton 4.0.x) |
cancelled | the meeting container went away before the meeting UI reported anything (Android, iOS and Flutter only) |
Types: BbbLeaveReason (Android LEFT, ENDED, … and Flutter left, ended, …), BBBLeaveReason (iOS), and LeaveInfo.reason (React Native). How to react to each one is in the 🔗 Integration guide.
⚛️ React Native props
<BigBlueButtonMeeting/> takes the join options as props, plus:
| Prop | Type | Default | Description |
|---|---|---|---|
onJoined | () => void | — | the user is in the meeting |
onLeave | (info: LeaveInfo) => void | — | the meeting is over: unmount the component here |
onError | (message: string) => void | — | reserved: accepted, but not called in 0.1.0; failures reach onLeave with reason: 'error' |
leaveSignal | (listener) => unsubscribe | — | host-initiated leave: the component subscribes a listener; call it to leave |
openLogoutUrl | boolean | true | whether the ended screen may open the meeting's logout URL in the browser; apps that embed the meeting usually pass false |
gestureRoot | boolean | true | pass false when your app already renders a GestureHandlerRootView above the component |
afterLeave | React node | nothing | rendered in place of the meeting once the session is over |
⚠️ Flutter errors
BbbMeetingSdk.join throws a PlatformException instead of opening a meeting:
| Code | When |
|---|---|
already_in_meeting | a meeting is already open |
invalid_arguments | no join URL was given |
no_activity (Android) / no_view_controller (iOS) | there is nothing to present the meeting from |
join_failed | Android only: the SDK cannot start the meeting |
BbbMeetingSdk.initialize throws no_application on Android when there is no application context yet.