2meet Docs
OpenAPI ↓

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

HeaderValue
X-2meet-TimestampUnix seconds
X-2meet-SignatureHMAC-SHA256 of payload below
X-2meet-Reseller-SlugOptional if slug is in hostname
payload = "{timestamp}\n{METHOD}\n{path}\n{body}"
signature = HMAC-SHA256(integration_secret, payload)

Endpoints

MethodPathDescription
POST/meetingsCreate — returns join URLs
POST/meetings/{id}/coverUpload optional session cover image
GET/meetingsList (paginated)
GET/meetings/{id}Detail
DELETE/meetings/{id}End meeting
POST/meetings/{id}/join-linksFresh 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

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.