Jitsi Meet Integration for Video Conferencing on Website
Jitsi Meet is the only full-featured video conferencing solution with open source that can be deployed on your own server without licensing fees. This distinguishes it from Zoom SDK, Daily.co, and Twilio: no per-minute billing, data doesn't leave your infrastructure. For corporate systems, medical platforms, educational LMS—a crucial point.
Two Usage Options
Jitsi as iframe—fastest path. Embedded via Jitsi External API and <iframe>. Public server meet.jit.si requires no setup—used for prototypes and non-critical tasks.
Self-hosted Jitsi—full control. Server deployed on Ubuntu 22.04, data stays in your infrastructure, custom UI available.
Self-hosted: Minimum Requirements
- 1 vCPU, 2 GB RAM—up to 10 participants
- 4 vCPU, 8 GB RAM—up to 50 participants (via Jitsi Videobridge)
- Open ports: 443/TCP, 10000/UDP (media)
- Domain with SSL certificate (Let's Encrypt works)
Installation via official repository:
curl https://download.jitsi.org/jitsi-key.gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/jitsi-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/jitsi-keyring.gpg] https://download.jitsi.org stable/" | sudo tee /etc/apt/sources.list.d/jitsi-stable.list
sudo apt-get update
sudo apt-get install jitsi-meet
The installer requests a domain and configures Nginx + Let's Encrypt automatically.
Embedding via Jitsi External API
<script src="https://your-jitsi.domain.com/external_api.js"></script>
const domain = 'your-jitsi.domain.com';
const options = {
roomName: 'meeting-' + roomId,
width: '100%',
height: 600,
parentNode: document.getElementById('jitsi-container'),
userInfo: {
displayName: currentUser.name,
email: currentUser.email,
},
configOverwrite: {
startWithAudioMuted: true,
startWithVideoMuted: false,
disableDeepLinking: true,
prejoinPageEnabled: false, // remove preview screen
},
interfaceConfigOverwrite: {
TOOLBAR_BUTTONS: ['microphone', 'camera', 'desktop', 'chat', 'hangup'],
SHOW_JITSI_WATERMARK: false,
SHOW_BRAND_WATERMARK: false,
},
};
const api = new JitsiMeetExternalAPI(domain, options);
// Events
api.addEventListener('videoConferenceJoined', ({ roomName }) => {
console.log('Joined:', roomName);
markMeetingStarted(roomName);
});
api.addEventListener('videoConferenceLeft', () => {
api.dispose();
redirectToPostMeeting();
});
api.addEventListener('participantJoined', ({ id, displayName }) => {
logParticipant(id, displayName, 'joined');
});
JWT Room Authentication
By default, Jitsi is open—anyone knowing the room name can enter. For private conferences, enable JWT authentication:
# /etc/prosody/conf.avail/your-jitsi.domain.com.cfg.lua
VirtualHost "your-jitsi.domain.com"
authentication = "token"
app_id = "myapp"
app_secret = "your-secret-key"
allow_empty_token = false
JWT is generated on your backend:
use Firebase\JWT\JWT;
class JitsiTokenService
{
private const APP_ID = 'myapp';
private const SECRET = 'your-secret-key';
public function generate(User $user, string $roomName, bool $isModerator = false): string
{
$payload = [
'iss' => self::APP_ID,
'sub' => 'your-jitsi.domain.com',
'aud' => self::APP_ID,
'room' => $roomName,
'exp' => time() + 3600,
'context' => [
'user' => [
'id' => (string) $user->id,
'name' => $user->name,
'email' => $user->email,
'moderator' => $isModerator,
],
],
];
return JWT::encode($payload, self::SECRET, 'HS256');
}
}
The token is passed in External API options:
const options = {
roomName: roomName,
jwt: '{{ $jitsiToken }}',
// ...
};
Room Management via API
Jitsi doesn't have a REST API for room management out of the box, but Prosody (XMPP server inside Jitsi) provides an HTTP API for statistics:
GET https://your-jitsi.domain.com/colibri/stats
To track active conferences and participants in your system, use External API events on the client and webhook notifications.
Timeline
- Self-hosted installation on server + SSL: 0.5 day
- iframe embedding + basic events: 1 day
- JWT room authentication: 1 day
- Integration with website business logic (room creation, participant recording): 2–3 days







