Integrate video meetings into your application with our simple REST API. Create, manage, and monitor meetings programmatically.
API keys are provided by the Upclass team. Contact our sales team to get started with API access.
Contact sales@upclass.ai
All API requests require authentication via the X-API-KEY header.
Include your API key in every request.
X-API-KEY: your_api_key_here
All API endpoints are relative to the following base URL:
https://meet.upclass.ai/api/v1/
Create a new meeting room. Returns a unique meeting code and join URL.
Set is_secured to true for meetings that require participant registration.
/api/v1/meetings/
| Parameter | Type | Required | Description |
|---|---|---|---|
topic |
string | No | Meeting topic or title |
start_date_time |
string | No | ISO 8601 datetime with timezone for scheduled start time (e.g., 2024-12-20T10:00:00Z for UTC or 2024-12-20T15:30:00+05:30 for IST). If no timezone is provided, UTC is assumed. |
expires_at |
string | No | ISO 8601 datetime when meeting expires |
is_secured |
boolean | No | Enable participant registration. Default: false |
record_on_cloud |
boolean | No | Enable automatic cloud recording. Default: false |
feedback_required |
boolean | No | Require participant feedback after meeting ends. Only works with is_secured: true. Default: false |
participants |
array | No | Array of participants to register at creation. Only works with is_secured: true. See participant object below. |
| Parameter | Type | Required | Description |
|---|---|---|---|
display_name |
string | Yes | Name shown in the meeting (max 100 chars) |
external_user_id |
string | Yes | Your system's user ID. Must be unique per meeting. |
email |
string | No | Participant's email address |
role |
string | No | host or attendee. Default: attendee |
curl -X POST https://meet.upclass.ai/api/v1/meetings/ \
-H "Content-Type: application/json" \
-H "X-API-KEY: your_api_key_here" \
-d '{
"topic": "Sales Demo Meeting",
"start_date_time": "2024-12-20T10:00:00Z",
"is_secured": true,
"record_on_cloud": true,
"feedback_required": true,
"participants": [
{
"display_name": "John Doe",
"external_user_id": "user-123",
"email": "john@example.com",
"role": "host"
},
{
"display_name": "Jane Smith",
"external_user_id": "user-456",
"email": "jane@example.com",
"role": "attendee"
}
]
}'
{
"meeting_code": "ABCD-EFGH-IJKL",
"join_url": "https://meet.upclass.ai/ABCD-EFGH-IJKL/",
"topic": "Sales Demo Meeting",
"is_secured": true,
"record_on_cloud": true,
"feedback_required": true,
"created_at": "2024-01-15T10:30:00Z",
"start_date_time": "2024-12-20T10:00:00Z",
"expires_at": null,
"customer": "your-company",
"credits_balance": 150.0,
"billing_info": {
"note": "Billing starts after 10 minutes of participant time. 1 credit = 1 hour.",
"min_billable_minutes": 10
},
"participants": [
{
"id": 1,
"display_name": "John Doe",
"external_user_id": "user-123",
"email": "john@example.com",
"role": "host",
"participant_code": "ABC123",
"join_url": "https://meet.upclass.ai/ABCD-EFGH-IJKL/?token=xK9m2...",
"created_at": "2024-01-15T10:30:00Z"
},
{
"id": 2,
"display_name": "Jane Smith",
"external_user_id": "user-456",
"email": "jane@example.com",
"role": "attendee",
"participant_code": "XYZ789",
"join_url": "https://meet.upclass.ai/ABCD-EFGH-IJKL/?token=pL3n8...",
"created_at": "2024-01-15T10:30:00Z"
}
]
}
Retrieve a paginated list of all meetings for your account.
/api/v1/meetings/
| Parameter | Type | Default | Description |
|---|---|---|---|
status |
string | - | Filter by status: active, ended, expired |
limit |
integer | 50 | Max results (1-100) |
offset |
integer | 0 | Pagination offset |
curl -X GET "https://meet.upclass.ai/api/v1/meetings/?status=active&limit=10" \
-H "X-API-KEY: your_api_key_here"
{
"meetings": [
{
"meeting_code": "ABCD-EFGH-IJKL",
"join_url": "https://meet.upclass.ai/ABCD-EFGH-IJKL/",
"topic": "Sales Demo Meeting",
"status": "active",
"is_secured": true,
"record_on_cloud": true,
"feedback_required": true,
"recording_status": "completed",
"created_at": "2024-01-15T10:30:00Z",
"start_date_time": "2024-12-20T10:00:00Z",
"expires_at": "2024-12-31T23:59:59Z"
}
],
"count": 25,
"limit": 10,
"offset": 0
}
Retrieve details of a specific meeting by its code. For secured meetings, the response includes the list of registered participants.
/api/v1/meetings/{meeting_code}/
curl -X GET https://meet.upclass.ai/api/v1/meetings/ABCD-EFGH-IJKL/ \
-H "X-API-KEY: your_api_key_here"
{
"meeting_code": "ABCD-EFGH-IJKL",
"join_url": "https://meet.upclass.ai/ABCD-EFGH-IJKL/",
"topic": "Sales Demo Meeting",
"status": "active",
"is_secured": true,
"record_on_cloud": true,
"feedback_required": true,
"recording_status": "completed",
"created_at": "2024-01-15T10:30:00Z",
"start_date_time": "2024-12-20T10:00:00Z",
"expires_at": null,
"ended_at": null,
"participant_count": 2,
"recording": {
"status": "completed",
"duration_seconds": 3600,
"size_bytes": 125829120,
"has_recording": true
},
"registered_participant_count": 3,
"registered_participants": [
{
"id": 1,
"external_user_id": "user-123",
"display_name": "John Doe",
"email": "john@example.com",
"role": "host",
"participant_code": "ABC123",
"join_url": "https://meet.upclass.ai/ABCD-EFGH-IJKL/?token=...",
"total_time_minutes": 45,
"session_count": 2,
"created_at": "2024-01-15T10:35:00Z"
}
]
}
End an active meeting. This will disconnect all participants.
/api/v1/meetings/{meeting_code}/
curl -X DELETE https://meet.upclass.ai/api/v1/meetings/ABCD-EFGH-IJKL/ \
-H "X-API-KEY: your_api_key_here"
{
"message": "Meeting ended successfully",
"meeting_code": "ABCD-EFGH-IJKL",
"ended_at": "2024-01-15T11:45:00Z"
}
Cancel a meeting that has never been started. A meeting can only be cancelled if no participant has ever joined it.
/api/v1/meetings/{meeting_code}/cancel/
curl -X POST https://meet.upclass.ai/api/v1/meetings/ABCD-EFGH-IJKL/cancel/ \
-H "X-API-KEY: your_api_key_here"
{
"message": "Meeting cancelled successfully",
"meeting_code": "ABCD-EFGH-IJKL",
"status": "expired"
}
{
"error": "Cannot cancel meeting",
"detail": "This meeting has already been started by a participant and cannot be cancelled.",
"started_at": "2024-01-15T10:35:00Z"
}
Secured meetings require participant registration before users can join.
Each registered participant receives a unique 6-character code (e.g., ABC123)
and a direct join URL with an embedded token.
"is_secured": trueRegister a new participant for a secured meeting. Returns the participant's unique code and join URL.
/api/v1/meetings/{meeting_code}/participants/
| Parameter | Type | Required | Description |
|---|---|---|---|
display_name |
string | Yes | Name shown in the meeting (max 100 chars) |
external_user_id |
string | Yes | Your system's user ID for tracking across integrations. Must be unique per meeting. Used for feedback tracking. |
email |
string | No | Participant's email address |
role |
string | No | host or attendee (default: attendee) |
curl -X POST https://meet.upclass.ai/api/v1/meetings/ABCD-EFGH-IJKL/participants/ \
-H "Content-Type: application/json" \
-H "X-API-KEY: your_api_key_here" \
-d '{
"display_name": "John Doe",
"external_user_id": "user-123",
"email": "john@example.com",
"role": "host"
}'
{
"id": 1,
"display_name": "John Doe",
"external_user_id": "user-123",
"email": "john@example.com",
"role": "host",
"participant_code": "ABC123",
"join_url": "https://meet.upclass.ai/ABCD-EFGH-IJKL/?token=xK9m2...",
"created_at": "2024-01-15T10:35:00Z"
}
"is_secured": true.
Get all registered participants for a meeting with their codes, URLs, and time tracking data.
/api/v1/meetings/{meeting_code}/participants/
curl -X GET https://meet.upclass.ai/api/v1/meetings/ABCD-EFGH-IJKL/participants/ \
-H "X-API-KEY: your_api_key_here"
{
"meeting_code": "ABCD-EFGH-IJKL",
"is_secured": true,
"participants": [
{
"id": 1,
"external_user_id": "user-123",
"display_name": "John Doe",
"email": "john@example.com",
"role": "host",
"participant_code": "ABC123",
"join_url": "https://meet.upclass.ai/ABCD-EFGH-IJKL/?token=xK9m2...",
"total_time_minutes": 45,
"session_count": 2,
"created_at": "2024-01-15T10:35:00Z"
},
{
"id": 2,
"external_user_id": "user-456",
"display_name": "Jane Smith",
"email": "jane@example.com",
"role": "attendee",
"participant_code": "XYZ789",
"join_url": "https://meet.upclass.ai/ABCD-EFGH-IJKL/?token=pL3n8...",
"total_time_minutes": 30,
"session_count": 1,
"created_at": "2024-01-15T10:40:00Z"
}
],
"count": 2
}
Get detailed information about a specific participant by their external_user_id, including their session history.
/api/v1/meetings/{meeting_code}/participants/{external_user_id}/
curl -X GET https://meet.upclass.ai/api/v1/meetings/ABCD-EFGH-IJKL/participants/user-123/ \
-H "X-API-KEY: your_api_key_here"
{
"id": 1,
"display_name": "John Doe",
"external_user_id": "user-123",
"email": "john@example.com",
"role": "host",
"participant_code": "ABC123",
"join_url": "https://meet.upclass.ai/ABCD-EFGH-IJKL/?token=xK9m2...",
"total_time_minutes": 45,
"session_count": 2,
"created_at": "2024-01-15T10:35:00Z",
"sessions": [
{
"id": 101,
"session_id": "abc123def456",
"joined_at": "2024-01-15T11:00:00Z",
"left_at": "2024-01-15T11:30:00Z",
"total_minutes": 30,
"is_connected": false
},
{
"id": 102,
"session_id": "xyz789uvw012",
"joined_at": "2024-01-15T14:00:00Z",
"left_at": "2024-01-15T14:15:00Z",
"total_minutes": 15,
"is_connected": false
}
]
}
Remove a registered participant from a secured meeting by their external_user_id. Their code and join URL will no longer work.
/api/v1/meetings/{meeting_code}/participants/{external_user_id}/
curl -X DELETE https://meet.upclass.ai/api/v1/meetings/ABCD-EFGH-IJKL/participants/user-123/ \
-H "X-API-KEY: your_api_key_here"
{
"message": "Participant removed successfully",
"display_name": "John Doe",
"external_user_id": "user-123"
}
Cloud recording automatically captures meeting video and audio to cloud storage. When enabled, recording starts automatically when the first participant joins and continues until all participants leave or the meeting ends.
"record_on_cloud": true| Meeting Type | Who Records | Behavior |
|---|---|---|
| Unsecured Meeting | First participant to join | The first person to join becomes the recorder. If they leave and rejoin, they continue recording. If a different person is first to join next time, that person becomes the recorder. |
| Secured Meeting | Host only | Only hosts can record. The first host to join becomes the designated recorder and continues recording even if they disconnect and rejoin. |
| Status | Description |
|---|---|
pending |
Recording enabled but not started yet |
recording |
Recording in progress |
processing |
Recording finished, being processed |
completed |
Recording available for playback |
failed |
Recording failed due to an error |
curl -X POST https://meet.upclass.ai/api/v1/meetings/ \
-H "Content-Type: application/json" \
-H "X-API-KEY: your_api_key_here" \
-d '{
"topic": "Recorded Interview",
"record_on_cloud": true
}'
Collect feedback from participants after meetings end. When enabled, participants must provide feedback before they can join their next meeting.
"feedback_required": trueexternal_user_id| Field | Required | Description |
|---|---|---|
rating |
Yes | 1-5 star rating |
comments |
Yes | Text feedback: "How was the session?" |
curl -X POST https://meet.upclass.ai/api/v1/meetings/ \
-H "Content-Type: application/json" \
-H "X-API-KEY: your_api_key_here" \
-d '{
"topic": "Interview Session",
"is_secured": true,
"feedback_required": true
}'
feedback_required only works with secured meetings (is_secured: true)external_user_id for feedback trackingexternal_user_id across meetingsThe API uses standard HTTP status codes. Error responses include a descriptive message.
| Status Code | Meaning |
|---|---|
200 |
Success |
201 |
Created - Resource successfully created |
400 |
Bad Request - Invalid parameters or meeting not secured |
401 |
Unauthorized - Invalid or missing API key |
402 |
Payment Required - Insufficient credits balance |
403 |
Forbidden - API key inactive or invalid participant token |
404 |
Not Found - Meeting or participant does not exist |
409 |
Conflict - Participant already registered (duplicate external_user_id) |
500 |
Server Error - Something went wrong |
{
"error": "Invalid API key",
"detail": "The provided API key is not valid"
}
{
"error": "Meeting is not secured",
"detail": "Participant registration is only available for secured meetings. Enable is_secured when creating the meeting."
}
{
"error": "Participant already registered",
"detail": "A participant with external_user_id \"user-123\" is already registered for this meeting"
}