Navigate to API Keys
While logged into your account navigate to settings -> API Keys
2. Create your API Key
Name and create your API Key
1. POST (Schedule a Video Call)
Schedules a new call and automatically sends a confirmation SMS to the customer
with their unique join link. Returns both an agent join link (for your team) and a customer join link (already SMS'd to the customer).
You can either attach the call to an existing project (pass projectId) or create a new project on the fly (pass customerName).
βCreate new project + schedule call
POST https://app.qubesheets.com/api/external/video-calls
-H "Authorization: Bearer YOUR_API_KEY"
-H "Content-Type: application/json"
-d '{
"customerName": "Jane Doe",
"customerPhone": "5551234567",
"customerEmail": "jane@example.com",
"scheduledFor": "2026-06-15T20:00:00.000Z",
"timezone": "America/New_York"
}'
Schedule call on existing project
POST https://app.qubesheets.com/api/external/video-calls
-H "Authorization: Bearer YOUR_API_KEY"
-H "Content-Type: application/json"
-d '{
"projectId": "507f1f77bcf86cd799439011",
"customerPhone": "5551234567",
"scheduledFor": "2026-06-15T20:00:00.000Z"
}'
Success Response (201)
{
"success": true,
"message": "Video call scheduled successfully",
"videoCall": {
"id": "65f1b2c3d4e5f6a7b8c9d0e1",
"projectId": "65f1b2c3d4e5f6a7b8c9d0e2",
"roomId": "65f1b2c3d4e5f6a7b8c9d0e2-1717000000000-a1b2c3d4",
"scheduledFor": "2026-06-15T20:00:00.000Z",
"timezone": "America/New_York",
"status": "scheduled",
"customerName": "Jane Doe",
"customerPhone": "+15551234567",
"customerEmail": "jane@example.com",
"agentJoinLink": "https://app.qubesheets.com/join/video-call/65f1b2c3d4e5f6a7b8c9d0e1?t=...",
"customerJoinLink": "https://app.qubesheets.com/join/video-call/65f1b2c3d4e5f6a7b8c9d0e1?t=...",
"createdAt": "2026-05-01T12:00:00.000Z"
},
"confirmationSms": {
"attempted": true,
"delivered": true
}
}
π‘ Tip: The customerJoinLink is automatically sent to the customer via SMS. Use the agentJoinLink in your team's calendar invite, CRM, or other.
β
β2. GET (List Video Calls)
β
GET "https://app.qubesheets.com/api/external/video-calls?upcoming=true&limit=20"
-H "Authorization: Bearer qbs_keyId_secret"
Success Response (200)
{
"success": true,
"videoCalls": [
{
"id": "65f1b2c3d4e5f6a7b8c9d0e1",
"projectId": "65f1b2c3d4e5f6a7b8c9d0e2",
"roomId": "65f1b2c3d4e5f6a7b8c9d0e2-1717000000000-a1b2c3d4",
"scheduledFor": "2026-06-15T20:00:00.000Z",
"timezone": "America/New_York",
"status": "scheduled",
"customerName": "Jane Doe",
"customerPhone": "+15551234567",
"customerEmail": "jane@example.com",
"agentJoinLink": "https://app.qubesheets.com/join/video-call/...",
"customerJoinLink": "https://app.qubesheets.com/join/video-call/...",
"createdAt": "2026-05-01T12:00:00.000Z",
"updatedAt": "2026-05-01T12:00:00.000Z"
}
],
"pagination": {
"total": 1,
"limit": 20,
"skip": 0,
"returned": 1
}
}
β3. GET (Single Video Call)
β
GET https://app.qubesheets.com/api/external/video-calls/65f1b2c3d4e5f6a7b8c9d0e1
-H "Authorization: Bearer qbs_keyId_secret"
Success Response (200)
{
"success": true,
"videoCall": {
"id": "65f1b2c3d4e5f6a7b8c9d0e1",
"projectId": "65f1b2c3d4e5f6a7b8c9d0e2",
"roomId": "65f1b2c3d4e5f6a7b8c9d0e2-1717000000000-a1b2c3d4",
"scheduledFor": "2026-06-15T20:00:00.000Z",
"timezone": "America/New_York",
"status": "scheduled",
"customerName": "Jane Doe",
"customerPhone": "+15551234567",
"customerEmail": "jane@example.com",
"agentJoinLink": "https://app.qubesheets.com/join/video-call/...",
"customerJoinLink": "https://app.qubesheets.com/join/video-call/...",
"remindersSent": [
{ "type": "confirmation", "sentAt": "2026-05-01T12:00:01.000Z", "method": "sms" }
],
"createdAt": "2026-05-01T12:00:00.000Z",
"updatedAt": "2026-05-01T12:00:00.000Z"
}
}4. PATCH (Reschedule a Video Call)
β
PATCH https://app.qubesheets.com/api/external/video-calls/{callId}
Updates the scheduled time and automatically sends a reschedule SMS to the customer with their (still valid) join link. Only calls with status scheduled can be rescheduled.
β
PATCH https://app.qubesheets.com/api/external/video-calls/65f1b2c3d4e5f6a7b8c9d0e1
-H "Authorization: Bearer qbs_keyId_secret"
-H "Content-Type: application/json"
-d '{
"scheduledFor": "2026-06-16T21:00:00.000Z",
"timezone": "America/New_York"
}'
Success Response (200)
{
"success": true,
"message": "Video call rescheduled successfully",
"videoCall": {
"id": "65f1b2c3d4e5f6a7b8c9d0e1",
"projectId": "65f1b2c3d4e5f6a7b8c9d0e2",
"scheduledFor": "2026-06-16T21:00:00.000Z",
"timezone": "America/New_York",
"status": "scheduled",
"agentJoinLink": "https://app.qubesheets.com/join/video-call/...",
"customerJoinLink": "https://app.qubesheets.com/join/video-call/..."
},
"rescheduleSms": {
"attempted": true,
"delivered": true
}
}
β5. DELETE (Cancel a Video Call)
β
DELETE https://app.qubesheets.com/api/external/video-calls/{callId}
Cancels a scheduled call. Optionally sends a cancellation SMS to the customer. Only calls with status scheduled can be cancelled.
Request Body (optional)
DELETE https://app.qubesheets.com/api/external/video-calls/65f1b2c3d4e5f6a7b8c9d0e1
-H "Authorization: Bearer qbs_keyId_secret"
-H "Content-Type: application/json"
-d '{ "sendSms": true }'
Success Response (200)
{
"success": true,
"message": "Video call cancelled",
"videoCall": {
"id": "65f1b2c3d4e5f6a7b8c9d0e1",
"status": "cancelled"
},
"cancellationSms": {
"attempted": true,
"delivered": true
}
}
β6. POST (Create project and send customer upload link)
β
POST https://app.qubesheets.com/api/external/projects
-H "Authorization: Bearer YOUR_API_KEY"
-H "Content-Type: application/json"
-d '{"customerName": "John Smith", "phone": "5551234567"}'
Notes:
- Timezones: Always pass an IANA timezone string (e.g. America/Chicago, Europe/London). The SMS confirmation displays the date/time in the timezone you specify.
- Phone format: Send 10-digit US numbers β they'll be normalized to +1XXXXXXXXXX automatically.
- Org-scoped: Each API key only sees calls within its own organization.
- Branding: Confirmation SMS messages use your company name from Settings β Branding and your custom SMS template from Settings (if configured).
- Join links: The customerJoinLink and agentJoinLink are signed tokens that work without a login. They're valid from immediately after creation through 24 hours after the scheduled time.
β
Error Responses
400 β Invalid Request
{
"error": "Invalid scheduledFor",
"message": "scheduledFor must be in the future"
}
401 β Invalid or Missing API Key
{
"error": "Invalid or missing API key",
"message": "Please provide a valid API key in the Authorization header: Bearer qbs_keyId_secret"
}
404 β Not Found
{
"error": "Video call not found",
"message": "No video call with that id was found for this organization"
}
500 β Internal Server Error
{
"error": "Internal server error",
"message": "Failed to schedule video call. Please try again later."
}






