How-to Guide

ScreenApp API and SDK Documentation

Written by
ScreenApp Team
Updated on
February 19, 2025
Contributors

ScreenApp API Documentation v2.0.0

ScreenApp's API enables you to automatically transcribe, summarize, and analyze video and audio content. Perfect for businesses looking to process customer calls, training videos, and meeting recordings at scale.

Key Use Cases

  • Automatic Transcription & Summarization: Convert any video or audio into searchable text and concise summaries. Ideal for customer service teams, educational institutions, and content creators.
  • Knowledge Management: Build a searchable repository of video content with automatic transcripts, summaries, and AI-powered insights. Perfect for training materials and company knowledge bases.
  • Real-time Processing: Receive transcripts and summaries via webhooks as soon as recordings are processed. Great for integrating with CRM systems and customer service platforms.
  • Embedded Recording: Add professional-grade recording capabilities to your application with our embeddable recorder that handles both screen and audio capture.
✨ Popular Use Case: Customer service teams use our API to automatically transcribe support calls and generate summaries, which are then synced to their CRM through webhooks.
Get API Credentials in Dashboard →

Plan Requirements & API Access

To use the ScreenApp API, you'll need:

  1. An active Business plan subscription
  2. API credentials from your ScreenApp dashboard

Getting Your API Credentials

1. Log into your ScreenApp account
2. Navigate to Settings → Integration
3. Here you'll find your:

  • API Token
  • Team ID

Keep these credentials secure and never share them publicly.

Quick Start

Want to get started right away? Follow these steps to integrate ScreenApp into your website:

1. Install the Plugin

Add this code to your website's HTML:

<script
  charset="UTF-8" 
  type="text/javascript"
  src="https://screenapp.io/app/plugin.js">
</script>

<script>
  function callback({ id, url }) {
    // When the recording ends, you'll get:
    // - id: unique identifier for the recording
    // - url: direct access URL for the recording
  }

  function loadScreenApp() {
    const screenApp = new window.ScreenApp('YOUR_PLUGIN_TOKEN', callback);
    screenApp.mount("#screenapp-plugin");
  }
</script>

<div id="screenapp-plugin"></div>

2. Add the Trigger Button

Add a button or trigger element to your page:

<button onclick="loadScreenApp()">Start Recording</button>

3. Configure the Callback

Customize the callback function to handle recording completion:

function callback({ id, url }) {
  // Example: Send to your backend
  fetch('/api/recordings', {
    method: 'POST',
    body: JSON.stringify({ recordingId: id, recordingUrl: url })
  });
  
  // Example: Update UI
  document.getElementById('status').innerHTML = 
    `Recording saved! View it at ${url}`;
}

Authentication

All API requests require authentication. ScreenApp uses token-based authentication along with team-specific identifiers.

Credentials You'll Need

  • API Token: Your secret API key
  • Team ID: Your unique team identifier

Authentication Example

curl -X POST "https://api.screenapp.io/v2/files/upload" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "X-Team-ID: YOUR_TEAM_ID"

Authentication Endpoints

GET /auth/google

Redirect to Google for authentication

Query Parameters:

  • redirectUrl - Encoded URL to redirect the user after successful authentication
  • referrerUrl - Encoded Referrer URL
  • intent - Intent for the user (e.g., "signup")

GET /auth/facebook

Redirect to Facebook for authentication

Query Parameters:

  • redirectUrl - Encoded URL to redirect the user after successful authentication
  • referrerUrl - Encoded Referrer URL
  • intent - Intent for the user (e.g., "signup")

Core Concepts

Before diving into specific endpoints, let's understand the key concepts in ScreenApp:

  1. Recordings: Video and audio captures that can be uploaded and processed
  2. Teams: Groups that can share and manage recordings
  3. Webhooks: Real-time notifications for recording events and processing results
  4. Tags: Metadata that can be attached to recordings, teams, or user profiles

API Reference

Team Management

POST /team/{teamId}/tag

Add tag to team

Path Parameters:

  • teamId - ID of the team

Request Body:

{
  "key": "color",
  "value": "red"
}

DELETE /team/{teamId}/tag

Remove tag from team

Path Parameters:

  • teamId - ID of the team

Request Body:

{
  "key": "color"
}

Team Webhook Integration

POST /team/{teamId}/integrations/webhook

Register a new webhook URL for the team

Path Parameters:

  • teamId - ID of the team

Request Body:

{
  "url": "https://example.com/webhook",
  "name": "My Webhook"
}

Responses:

  • 200 - Webhook registered successfully
  • 400 - Invalid request body
  • 500 - Internal server error

DELETE /team/{teamId}/integrations/webhook

Unregister a webhook URL for the team

Path Parameters:

  • teamId - ID of the team

Query Parameters:

  • url - The webhook URL to unregister

Responses:

  • 200 - Webhook unregistered successfully
  • 400 - Invalid request
  • 404 - Webhook URL not found
  • 500 - Internal server error

GET /team/{teamId}/integrations/zapier/sample/list

Get sample data for Zapier as an array

Path Parameters:

  • teamId - ID of the team

Responses:

  • 200 - Sample data retrieved successfully
  • 404 - Sample file not found

User Integrations

POST /integrations/webhook

Register a new webhook for the user

Request Body:

{
  "url": "https://example.com/webhook",
  "name": "My Webhook"
}

Responses:

  • 200 - Webhook registered successfully
  • 400 - Invalid request body

DELETE /integrations/webhook

Unregister a webhook for the user

Query Parameters:

  • url - The webhook URL to unregister

Responses:

  • 200 - Webhook unregistered successfully
  • 400 - Invalid request
  • 404 - Webhook URL not found

Webhook Events

Your webhook endpoint will receive events in this format:

{
  "event": "recording.completed",
  "fileId": "file789",
  "teamId": "team123",
  "data": {
    "url": "https://screenapp.io/recording/file789",
    "duration": 300,
    "status": "processed"
  }
}

Common events include:

  • recording.started
  • recording.completed
  • recording.processed
  • recording.failed

File Management

POST /files/{fileId}/tag

Add tag to file

Path Parameters:

  • fileId - ID of the file

Request Body:

{
  "key": "color",
  "value": "red"
}

DELETE /files/{fileId}/tag

Remove tag from file

Path Parameters:

  • fileId - ID of the file

Request Body:

{
  "key": "color"
}

POST /files/{fileId}/ask/multimodal

Ask a question about a file using multiple AI models

Path Parameters:

  • fileId - ID of the file to analyze

Request Body:

{
  "promptText": "What are the key points discussed?",
  "mediaAnalysisOptions": {
    "transcript": {
      "segments": [
        {
          "start": 0,
          "end": 120
        }
      ]
    },
    "video": {
      "segments": [
        {
          "start": 0,
          "end": 120
        }
      ]
    },
    "screenshots": {
      "timestamps": [
        30, 60, 90
      ]
    }
  }
}

Responses:

  • 200 - Successfully processed the question
  • 403 - AI usage limit exceeded
  • 500 - Server error

File Upload

POST /files/upload/{teamId}/{folderId}/url

Generate pre-signed URLs for file uploads

Path Parameters:

  • teamId - ID of the team
  • folderId - ID of the folder

Request Body:

{
  "files": [
    {
      "contentType": "video/mp4",
      "name": "meeting-recording.mp4"
    }
  ]
}

Responses:

  • 200 - Upload URLs generated successfully
  • 400 - Invalid request parameters
  • 500 - Server error

POST /files/upload/{teamId}/{folderId}/finalize

Finalize uploaded files

Path Parameters:

  • teamId - ID of the team
  • folderId - ID of the folder

Request Body:

{
  "file": {
    "fileId": "file123",
    "contentType": "video/mp4",
    "name": "Sales Call",
    "description": "Weekly sales call with customer",
    "recorderName": "John Doe",
    "recorderEmail": "john.doe@example.com"
  }
}

Responses:

  • 200 - File upload finalized successfully
  • 400 - Invalid request parameters
  • 403 - Upload limit exceeded
  • 500 - Server error

Multipart Upload (for large files)

PUT /files/upload/multipart/init/{teamId}/{folderId}

Initialize a multipart upload for a large file

Path Parameters:

  • teamId - ID of the team
  • folderId - ID of the folder

Request Body:

{
  "contentType": "video/mp4"
}

Responses:

  • 200 - Upload initialized successfully
  • 400 - Invalid request parameters
  • 500 - Server error

Response Example:

{
  "success": true,
  "data": {
    "fileId": "file789",
    "uploadId": "upload123"
  }
}

PUT /files/upload/multipart/url/{teamId}/{folderId}/{fileId}/{uploadId}/{partNumber}

Get upload URL for a specific part

Path Parameters:

  • teamId - ID of the team
  • folderId - ID of the folder
  • fileId - ID of the file being uploaded
  • uploadId - ID of the multipart upload session
  • partNumber - Part number (1-10000)

Request Body:

{
  "contentType": "video/mp4"
}

Responses:

  • 200 - Upload URL generated successfully
  • 400 - Invalid request parameters
  • 500 - Server error

Response Example:

{
  "success": true,
  "data": {
    "uploadUrl": "https://presigned-s3-url.com/part1"
  }
}

PUT /files/upload/multipart/finalize/{teamId}/{folderId}/{fileId}/{uploadId}

Finalize a multipart upload

Path Parameters:

  • teamId - ID of the team
  • folderId - ID of the folder
  • fileId - ID of the file being uploaded
  • uploadId - ID of the multipart upload session

Request Body:

{
  "file": {
    "contentType": "video/mp4",
    "recorderName": "John Doe",
    "recorderEmail": "john@example.com",
    "name": "My Recording",
    "description": "A recorded video session",
    "notes": [
      {
        "text": "Important point discussed",
        "timestamp": 1234567890
      }
    ]
  }
}

Responses:

  • 200 - Upload finalized successfully
  • 400 - Invalid request parameters
  • 404 - Active upload not found
  • 500 - Server error

PUT /files/upload/multipart/fallback/{teamId}/{folderId}/{fileId}/{partNumber}

Upload file part via backend (fallback)

Path Parameters:

  • teamId - ID of the team
  • folderId - ID of the folder
  • fileId - ID of the file being uploaded
  • partNumber - Part number (1-10000)

Form Data:

  • file - The file part to upload
  • contentType - MIME type of the file being uploaded

Responses:

  • 200 - Part uploaded successfully
  • 400 - Invalid request parameters
  • 500 - Server error

Account Management

POST /v2/account/tag

Add a tag to the authenticated user

Request Body:

{
  "key": "color",
  "value": "red"
}

Responses:

  • 200 - Tag added successfully
  • 400 - Invalid request parameters

PUT /account/profile

Update the authenticated user's profile

Request Body:

{
  "firstName": "John",
  "lastName": "Doe",
  "name": "John Doe",
  "gender": "male",
  "userType": "user",
  "company": "Acme Inc",
  "role": "Developer",
  "goals": "Learn new technologies",
  "phoneNumber": "+1234567890",
  "location": "San Francisco, CA",
  "website": "https://example.com",
  "picture": "https://example.com/avatar.jpg",
  "provider": "local",
  "providerId": "12345",
  "primaryField": "development"
}

Responses:

  • 200 - Profile updated successfully
  • 400 - Invalid request parameters

Advanced Features

AI Analysis

Use AI to analyze your recordings for insights:

// Request AI analysis of a recording
const analysis = await fetch(`/v2/files/${fileId}/ask/multimodal`, {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    promptText: "What are the key discussion points?",
    mediaAnalysisOptions: {
      transcript: {
        segments: [{ start: 0, end: 300 }]
      },
      video: {
        segments: [{ start: 0, end: 300 }]
      }
    }
  })
});

Batch Operations

Efficiently manage multiple recordings:

// Tag multiple recordings
async function batchTag(fileIds, tag) {
  const promises = fileIds.map(fileId => 
    fetch(`/v2/files/${fileId}/tag`, {
      method: 'POST',
      headers: {
        'Authorization': 'Bearer YOUR_API_TOKEN',
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(tag)
    })
  );
  
  await Promise.all(promises);
}

Error Handling

Common Error Codes

  • 400: Invalid request parameters
  • 403: AI usage limit exceeded or unauthorized access
  • 404: Resource not found
  • 500: Server error

Error Response Format

Error responses typically follow this format:

{
  "success": false,
  "message": "Detailed error message"
}

Implementation Examples

Setting Up Team Webhooks

Webhooks allow you to receive real-time updates when recordings are processed:

// Register a new webhook for your team
async function registerTeamWebhook(teamId, webhookUrl, webhookName) {
  const response = await fetch(`/v2/team/${teamId}/integrations/webhook`, {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer YOUR_API_TOKEN',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      url: webhookUrl,
      name: webhookName
    })
  });
  
  return await response.json();
}

// Example usage
const result = await registerTeamWebhook(
  'team123',
  'https://your-domain.com/webhooks/screenapp',
  'Recording Updates'
);

Uploading and Processing a Large File

For files larger than 100MB, use the multipart upload flow:

// 1. Initialize upload
const initResponse = await fetch(`/v2/files/upload/multipart/init/${teamId}/${folderId}`, {
  method: 'PUT',
  headers: {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    contentType: 'video/mp4'
  })
});

const { data: { fileId, uploadId } } = await initResponse.json();

// 2. Split file into chunks and upload each part
const CHUNK_SIZE = 5 * 1024 * 1024; // 5MB chunks
const totalParts = Math.ceil(file.size / CHUNK_SIZE);

for (let partNumber = 1; partNumber <= totalParts; partNumber++) {
  // Get upload URL for this part
  const urlResponse = await fetch(
    `/v2/files/upload/multipart/url/${teamId}/${folderId}/${fileId}/${uploadId}/${partNumber}`,
    {
      method: 'PUT',
      headers: {
        'Authorization': 'Bearer YOUR_API_TOKEN',
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        contentType: 'video/mp4'
      })
    }
  );
  
  const { data: { uploadUrl } } = await urlResponse.json();
  
  // Create the chunk from the file
  const start = (partNumber - 1) * CHUNK_SIZE;
  const end = Math.min(start + CHUNK_SIZE, file.size);
  const chunk = file.slice(start, end);
  
  // Upload the chunk directly to S3
  await fetch(uploadUrl, {
    method: 'PUT',
    body: chunk,
    headers: {
      'Content-Type': 'video/mp4'
    }
  });
}

// 3. Finalize the upload
const finalizeResponse = await fetch(
  `/v2/files/upload/multipart/finalize/${teamId}/${folderId}/${fileId}/${uploadId}`,
  {
    method: 'PUT',
    headers: {
      'Authorization': 'Bearer YOUR_API_TOKEN',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      file: {
        contentType: 'video/mp4',
        name: 'Customer Meeting Recording',
        description: 'Quarterly review with client',
        recorderName: 'Jane Smith',
        recorderEmail: 'jane@example.com'
      }
    })
  }
);
Get API Credentials in Dashboard →