Quickstart
Put a student into a live class from your own product: create a key, provision two users, schedule a meeting, mint a join link and open it. About 15 minutes.
1. Create an API key
In Settings → API keys (organization owners and admins), create a key named after your integration with the scopes users:write and meetings:write. Copy it — it is shown once — and store it as a server-side secret:
export VMEET_API_KEY="vmk_live_…" # never ship this to browsers or mobile apps2. Provision a teacher and a student
Create users with your own ids as externalId. The call is an upsert: sending the same externalId again updates the user instead of creating a duplicate. E-mail is optional — students without one can still join through join links.
curl -X POST https://gurukullive.example.com/api/v1/public/users \
-H "Authorization: Bearer $VMEET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"externalId":"teacher-42","fullName":"Meera Shah","email":"meera@school.example","role":"TEACHER"}'curl -X POST https://gurukullive.example.com/api/v1/public/users \
-H "Authorization: Bearer $VMEET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"externalId":"student-1001","fullName":"Aarav Patel","role":"STUDENT"}'Both return { data: { id, externalId, … } }. You can keep using your externalId everywhere a user id is expected.
3. Schedule a meeting
Create the room with the teacher as host. Send an Idempotency-Key so a network retry never creates two meetings.
curl -X POST https://gurukullive.example.com/api/v1/public/meetings \
-H "Authorization: Bearer $VMEET_API_KEY" \
-H "Idempotency-Key: algebra-10a-2026-10-14" \
-H "Content-Type: application/json" \
-d '{"externalId":"algebra-10a-2026-10-14","title":"Algebra · Grade 10 A","type":"MEETING","hostUserId":"teacher-42","scheduledStart":"2026-10-14T09:30:00Z","durationMinutes":45,"settings":{"waitingRoom":false,"muteOnEntry":true,"recordAutomatically":true},"access":{"mode":"ORG_MEMBERS"}}'For academic classes, pass type: "CLASS" and a classId instead — then access.mode: "ENROLLED" lets in exactly the students enrolled in that class.
4. Mint a join link when the student clicks “Join”
Do this just in time, per user, from your backend. Links are single-use and expire after 5 minutes by default.
curl -X POST https://gurukullive.example.com/api/v1/public/meetings/MEETING_ID/join-links \
-H "Authorization: Bearer $VMEET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"externalUserId":"student-1001","role":"PARTICIPANT","redirectUrl":"https://lms.example.com/classes/algebra"}'{
"data": {
"url": "https://gurukullive.example.com/j/vjt_9Qm…",
"embedUrl": "https://gurukullive.example.com/embed/meeting/algebra-10a-k3f9q2?jt=vjt_9Qm…",
"token": "vjt_9Qm…",
"expiresAt": "2026-10-14T09:35:00.000Z",
"role": "PARTICIPANT",
"singleUse": true,
"userId": "cm2u…"
}
}5. Send the student into the class
Pick one:
- Redirect the browser (or open a Custom Tab in your Android app) to
url. After the class the student lands on yourredirectUrl. - Embed the room in your page with
embedUrland the SDK:
<div id="classroom" style="height: 640px"></div>
<script src="https://gurukullive.example.com/sdk/vmeet-embed.js"></script>
<script>
// embedUrl comes from YOUR backend (step 4) — never call the API from the browser
const call = VMeet.createFrame('#classroom', { url: EMBED_URL, theme: 'light' });
call.on('joined', (e) => console.log('In class as', e.participant.name));
call.on('meeting-ended', () => location.assign('/classes'));
</script>Embedding from another origin also needs that origin allowed to frame GurukulLive — see allowed origins.
6. Get notified
Add a webhook endpoint in Settings → Webhooks and subscribe to meeting.started, participant.joined, participant.left and recording.ready. Every delivery is signed — the webhooks guide has verification code for Node.js, PHP and Python.
Next steps
- Join links in depth — roles, expiry, waiting rooms, native apps.
- Embedding guide — SDK events and commands, mobile WebViews, the recording player.
- API reference — users, classes, enrollments, recordings, attendance, usage.