Get Your API Key

API keys are provided by the Upclass team. Contact our sales team to get started with API access.

Contact sales@upclass.ai

Authentication

All API requests require authentication via the X-API-KEY header. Include your API key in every request.

Header
X-API-KEY: your_api_key_here

Base URL

All API endpoints are relative to the following base URL:

Production
https://meet.upclass.ai/api/v1/

Create Meeting

Create a new meeting room. Returns a unique meeting code and join URL. Set is_secured to true for meetings that require participant registration.

POST /api/v1/meetings/

Request Body

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.

Participant Object (for participants array)

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

Example Request

cURL
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"
      }
    ]
  }'

Example Response

201 Created
{
  "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"
    }
  ]
}

List Meetings

Retrieve a paginated list of all meetings for your account.

GET /api/v1/meetings/

Query Parameters

Parameter Type Default Description
status string - Filter by status: active, ended, expired
limit integer 50 Max results (1-100)
offset integer 0 Pagination offset

Example Request

cURL
curl -X GET "https://meet.upclass.ai/api/v1/meetings/?status=active&limit=10" \
  -H "X-API-KEY: your_api_key_here"

Example Response

200 OK
{
  "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
}

Get Meeting Details

Retrieve details of a specific meeting by its code. For secured meetings, the response includes the list of registered participants.

GET /api/v1/meetings/{meeting_code}/

Example Request

cURL
curl -X GET https://meet.upclass.ai/api/v1/meetings/ABCD-EFGH-IJKL/ \
  -H "X-API-KEY: your_api_key_here"

Example Response (Secured Meeting with Recording)

200 OK
{
  "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 Meeting

End an active meeting. This will disconnect all participants.

DELETE /api/v1/meetings/{meeting_code}/

Example Request

cURL
curl -X DELETE https://meet.upclass.ai/api/v1/meetings/ABCD-EFGH-IJKL/ \
  -H "X-API-KEY: your_api_key_here"

Example Response

200 OK
{
  "message": "Meeting ended successfully",
  "meeting_code": "ABCD-EFGH-IJKL",
  "ended_at": "2024-01-15T11:45:00Z"
}

Cancel Meeting

Cancel a meeting that has never been started. A meeting can only be cancelled if no participant has ever joined it.

POST /api/v1/meetings/{meeting_code}/cancel/
Note: A meeting can only be cancelled if it has never been started (no participant has ever joined). Once a participant joins, the meeting cannot be cancelled—use the End Meeting endpoint instead.

Example Request

cURL
curl -X POST https://meet.upclass.ai/api/v1/meetings/ABCD-EFGH-IJKL/cancel/ \
  -H "X-API-KEY: your_api_key_here"

Example Response

200 OK
{
  "message": "Meeting cancelled successfully",
  "meeting_code": "ABCD-EFGH-IJKL",
  "status": "expired"
}

Error Response (Meeting Already Started)

400 Bad Request
{
  "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

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.

How it works:
  1. Create a meeting with "is_secured": true
  2. Register participants via the API
  3. Share the participant code or direct URL with each attendee
  4. Attendees enter their code or click their unique URL to join
  5. Track each participant's time and sessions

Add Participant

Register a new participant for a secured meeting. Returns the participant's unique code and join URL.

POST /api/v1/meetings/{meeting_code}/participants/

Request Body

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)

Example Request

cURL
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"
  }'

Example Response

201 Created
{
  "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"
}
Note: This endpoint only works for meetings created with "is_secured": true.

List Participants

Get all registered participants for a meeting with their codes, URLs, and time tracking data.

GET /api/v1/meetings/{meeting_code}/participants/

Example Request

cURL
curl -X GET https://meet.upclass.ai/api/v1/meetings/ABCD-EFGH-IJKL/participants/ \
  -H "X-API-KEY: your_api_key_here"

Example Response

200 OK
{
  "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 Participant Details

Get detailed information about a specific participant by their external_user_id, including their session history.

GET /api/v1/meetings/{meeting_code}/participants/{external_user_id}/

Example Request

cURL
curl -X GET https://meet.upclass.ai/api/v1/meetings/ABCD-EFGH-IJKL/participants/user-123/ \
  -H "X-API-KEY: your_api_key_here"

Example Response

200 OK
{
  "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 Participant

Remove a registered participant from a secured meeting by their external_user_id. Their code and join URL will no longer work.

DELETE /api/v1/meetings/{meeting_code}/participants/{external_user_id}/

Example Request

cURL
curl -X DELETE https://meet.upclass.ai/api/v1/meetings/ABCD-EFGH-IJKL/participants/user-123/ \
  -H "X-API-KEY: your_api_key_here"

Example Response

200 OK
{
  "message": "Participant removed successfully",
  "display_name": "John Doe",
  "external_user_id": "user-123"
}

Cloud Recording

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.

How it works:
  1. Create a meeting with "record_on_cloud": true
  2. Recording starts automatically when the designated recorder joins
  3. Video is uploaded incrementally to prevent data loss
  4. Recording stops when all participants leave, and resumes with a new segment when someone rejoins
  5. Meetings can have multiple recording segments
  6. View all recordings in the customer portal meeting details page

Recording Behavior

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.

Recording Status Values

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

Example: Create Meeting with Recording

cURL
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
  }'
Notes:
  • Recordings are stored in WebM format with VP9 video codec
  • Each meeting can have multiple recording segments (when participants leave and rejoin)
  • All recordings are available for playback in the customer portal
  • Recording URLs are time-limited for security (24 hours)
  • Both cloud recording and local recording can run simultaneously
  • AI noise suppression is automatically applied to recorded audio

Participant Feedback

Collect feedback from participants after meetings end. When enabled, participants must provide feedback before they can join their next meeting.

How it works:
  1. Create a secured meeting with "feedback_required": true
  2. Register participants with unique external_user_id
  3. Meeting takes place and ends (or expires)
  4. When participant tries to join their next meeting, they see a feedback form
  5. They must rate (1-5 stars) and comment before proceeding
  6. If multiple past meetings need feedback, they provide feedback one by one
  7. View feedback in the customer portal meeting details page

Feedback Form Fields

Field Required Description
rating Yes 1-5 star rating
comments Yes Text feedback: "How was the session?"

Example: Create Meeting with Feedback

cURL
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
  }'
Requirements:
  • feedback_required only works with secured meetings (is_secured: true)
  • Participants must have a unique external_user_id for feedback tracking
  • Feedback is collected per external_user_id across meetings
  • Meeting must be ended or expired for feedback prompt to appear

Error Handling

The 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

Example Error Responses

401 Unauthorized
{
  "error": "Invalid API key",
  "detail": "The provided API key is not valid"
}
400 Bad Request
{
  "error": "Meeting is not secured",
  "detail": "Participant registration is only available for secured meetings. Enable is_secured when creating the meeting."
}
409 Conflict
{
  "error": "Participant already registered",
  "detail": "A participant with external_user_id \"user-123\" is already registered for this meeting"
}