bigbluebutton/bigbluebutton-api-php
Official PHP 8.2+ client for the BigBlueButton API. Wraps meeting creation, joining, recording management, and server administration in a developer-friendly interface, installable via Composer for quick integration into PHP applications.
Architecture fit. This is a framework-agnostic PHP SDK, not a Laravel package — there is no service provider, facade, config file, migration, or publishable asset. Architecturally it belongs in your integration/adapters layer as a thin, synchronous client over the BigBlueButton REST API. The important consequence for a TPM: BBB is the system of record for live meeting state, and this library deliberately holds none. There are no Eloquent-ready models, no persistence, no queue, no event bus. Any "meeting" table in your application is a local projection for entitlements, scheduling, and audit — never a source of truth. Design reviews should treat the SDK as replaceable infrastructure behind your own interface, so the product never depends on BigBlueButton\* types outside one adapter namespace.
Integration feasibility. Low friction. composer require bigbluebutton/bigbluebutton-api-php, PHP 8.2+, and — since 3.0 — zero required package dependencies (curl transport by default, PSR-18/PSR-17 optional via BigBlueButton::createWithHttpClient()). The surface is a handful of operations: create, join (URL generation), end, getMeetings/getMeetingInfo, getRecordings/publish/delete, getSessions, insertDocument, sendChatMessage, learningDashboard, getJoinUrl, hooks. The 3.0 release claims drop-in backward compatibility with 2.x and 3.x servers, with removed members kept as deprecated stubs — favourable for an incremental rollout.
Technical risk. The risk is not the client; it is the counterpart. Three buckets:
webVoice, copyright, defaultLayout, Feature::LAYOUTS). Parameter drift between your SDK version and the server version is a quiet-failure class: calls succeed, behaviour doesn't change. Pin both sides and record the supported matrix.Also verify the release metadata: "last release 2026-08-19" should be reconciled against live Packagist tags during due diligence, along with the license posture.
Licensing. LGPL-3.0 is a real gate, not a formality. SaaS use is generally fine; distributing the application (on-prem appliance, white-label binary, Docker image shipped to customers) triggers LGPL obligations around the library and the ability to relink/replace it. Route this to legal before committing to an on-prem SKU.
Key questions.
Stack fit. Wrap, don't sprinkle. Three artefacts:
config/bigbluebutton.php reading BBB_SERVER_BASE_URL and BBB_SECRET from env/secret manager.new BigBlueButton($baseUrl, $secret) — note 3.0 fixed an argument-order bug here; pre-3.0 code that relied on the constructor is worth auditing).MeetingService / RecordingService in your domain layer exposing your own DTOs and exceptions (MeetingProvisioned, MeetingEnded, RecordingReady), with BigBlueButton\* types confined to one namespace.HTTP transport. Decide deliberately. The default curl transport is dependency-free and fine, but it bypasses Laravel's HTTP middleware, retries, and telemetry. If you want framework-native observability, inject Guzzle (guzzlehttp/guzzle + GuzzleHttp\Psr7\HttpFactory) or Symfony's Psr18Client with createWithHttpClient(). Note that Laravel's own Http facade is not PSR-18, so it cannot be dropped in directly. Set explicit timeouts (10s suggested in the docs) — a slow BBB server must not pin your PHP workers.
Migration path. There is nothing to migrate if this is greenfield. If you already have hand-rolled curl calls (a very common state of the art for BBB integrations), define the interface first, implement it with this SDK, and delete the old code behind a feature flag. Behavioural diffs to watch: response parsing (messageKey vs message), multipart caption uploads (broken pre-3.0), and cookie/JSESSIONID capture (also broken pre-3.0). If you're on 2.x, upgrade to 3.0 before building features — 3.0 is where those fixes live.
Compatibility gates.
^3.0 and treat major bumps as scheduled work with a changelog diff.Sequencing.
meetingID, messageKey, latency, checksum failures).getJoinMeetingURL() redirect, end on completion. Handle duplicateWarning as success.hooks/create endpoint plus your own route), validate and process meeting-ended and recording-ready. This is where async product features live.getSessions, learningDashboard, sendChatMessage, insertDocument, client-settings overrides — only after v1 is stable.Maintenance. Low for the client, but non-zero: quarterly dependency review, changelog diff on each minor, and a re-test against the target BBB server version. Budget a small recurring allowance rather than a one-off integration task. Track deprecated parameters actively — they will silently stop doing anything after a server upgrade, which is the worst failure mode to debug from a bug report.
Support. No commercial support for this package; the community forum and GitHub issues are the channel. Your first-line support burden is dominated by the BBB server and by user-side AV/permissions problems, not by PHP errors. Staff accordingly: an L1 runbook covering "meeting won't start", "audio/video not working", "recording not available yet" is worth more than SDK documentation.
Scaling. The client is stateless and cheap. Two useful properties: join URLs are constructed locally from the shared secret (checksum), so the highest-volume user action — clicking "Join" — involves no network round trip and no BBB load; and meeting creation is a single fast POST. Real scaling lives on the BBB side: per-server concurrent-user ceilings, TURN capacity, Redis, and recording transcode throughput. Model recording storage as an unbounded cost line and put retention in the product spec, not the backlog.
Failure modes.
| Mode | Symptom | Mitigation |
|---|---|---|
| Secret rotated / checksum mismatch | All calls fail with a checksum error | Health check on deploy; config cache clear; alert on checksum errors |
| BBB unreachable / timeout | Worker exhaustion, 500s on schedule | Short timeouts, circuit breaker, async creation via queue |
| Duplicate create on retry | duplicateWarning |
Treat as success; same meetingID is the idempotency key |
| Orphaned meetings | Idle rooms, wasted capacity | Set meetingExpireIfNoUserJoinedInSeconds / endWhenNoModerator at create time |
| Webhook loss or delay | Stale meeting/recording state | Idempotent handler keyed on meetingID/recordID + periodic reconciliation poll |
| Recording lag | "Where's my recording?" tickets | Publish only on recording-ready; expose a "processing" state in the UI |
| Version drift | Feature toggles silently no-op | Pin versions, matrix test in CI, log the server's apiVersion |
Ramp-up. A competent Laravel developer is productive with the SDK in under a day — the docs are a proper mdBook with HTTP-client, cookie, hooks, and recordings sections, and the API mirrors the BBB server docs. Full feature ownership (recordings, webhooks, retention, tenanting) is 1–2 weeks for one engineer. BBB server operations is weeks, and should be a separate owner. Legal review of LGPL: days. Product/UX for consent, waiting rooms, and recording notices: parallel track, and the most likely source of launch delay.
How can I help you explore Laravel packages today?