JSON API (LMS v1)
HMAC-signed REST for custom backends. Moodle plugins should use the LMS wire API instead.
Base URL
https://{slug}.2meet.ir/lms/v1/
Authentication
| Header | Value |
|---|---|
X-2meet-Timestamp | Unix seconds |
X-2meet-Signature | HMAC-SHA256 of payload below |
X-2meet-Reseller-Slug | Optional if slug is in hostname |
payload = "{timestamp}\n{METHOD}\n{path}\n{body}"
signature = HMAC-SHA256(integration_secret, payload)
Endpoints
| Method | Path | Description |
|---|---|---|
| POST | /meetings | Create — returns join URLs |
| POST | /meetings/{id}/cover | Upload optional session cover image |
| GET | /meetings | List (paginated) |
| GET | /meetings/{id} | Detail |
| DELETE | /meetings/{id} | End meeting |
| POST | /meetings/{id}/join-links | Fresh join URLs with optional per-user identity |
Join identity (per user)
Create returns generic join URLs. Before sending a user into the room, call POST /meetings/{id}/join-links with their identity (same idea as BBB fullName / avatarURL / userID / logoutURL). The avatar appears in the live room; logout_url returns them to your LMS after leave/end.
POST /meetings/{meeting_id}/join-links
{
"display_name": "Alice Teacher",
"avatar_url": "https://lms.example/avatars/alice.jpg",
"user_id": "42",
"role": "moderator",
"logout_url": "https://lms.example/mod/bigbluebuttonbn/view.php?id=9"
}
role is moderator or attendee. If omitted while identity fields are set, identity applies to the moderator URL (legacy). Response still includes both moderator_join_url and attendee_join_url. Create may also set a meeting-default logout_url.
Create body (example)
JSON only — no cover required:
{
"name": "Weekly standup",
"external_id": "crm-12345",
"max_participants": 80,
"session_mode": "interactive"
}
Session cover (optional)
An optional static image on the video stage when the host camera is off or the session has not started. This is not live file-share — it is a placeholder configured at create time or uploaded later.
Option A — multipart on create
POST /meetings
Content-Type: multipart/form-data
meeting = {"name":"Class 101","session_mode":"lecture"}
cover = (binary PNG/JPG/WEBP, max 5 MB) ← optional field
Option B — upload after create
POST /meetings/{meeting_id}/cover
Content-Type: multipart/form-data
cover = (binary image)
Response: {"has_cover": true}
Display in the room
- Session state / join payload includes
has_cover: truewhen set - Image URL (public):
GET /api/v1/portal/sessions/{sessionId}/cover - Omit cover entirely — the room works normally with avatar / waiting state
Tenant API (organizer integrations)
Same upload model on POST /api/v1/tenant/sessions (optional multipart session + cover) or POST /api/v1/tenant/sessions/{sessionId}/cover with X-API-Key.
OpenAPI
Download lms-v1.openapi.yaml — import into Postman or codegen tools.