ScreenApp API 文档 v2.0.0
ScreenApp 的 API 使您能够自动转录、总结和分析视频和音频内容。非常适合希望大规模处理客户通话、培训视频和会议录音的企业。
主要用例
- 自动转录和摘要:将任何视频或音频转换为可搜索的文本和简洁的摘要。 非常适合客户服务团队、教育机构和内容创作者。
- 知识管理:通过自动转录、摘要和人工智能驱动的洞察力,构建可搜索的视频内容存储库。 非常适合培训材料和公司知识库。
- 实时处理:录音处理完毕后,立即通过 Webhook 接收转录和摘要。 非常适合与 CRM 系统和客户服务平台集成。
- 嵌入式录制:使用我们的可嵌入录音机将专业级录音功能添加到您的应用程序,该录音机可以处理屏幕和音频捕获。
✨ 热门用例: 客户服务团队使用我们的 API 自动转录支持电话并生成摘要,然后通过 Webhook 同步到他们的 CRM。
计划要求和 API 访问
要使用 ScreenApp API,您需要:
- 有效的 Business 计划订阅
- 来自您的 ScreenApp 仪表板的 API 凭据
获取您的 API 凭据
- 登录您的 ScreenApp 帐户
- 导航到设置 → 集成
- 在这里,您将找到:
- API 令牌
- 团队 ID
请确保这些凭据的安全,切勿公开分享。
快速开始
想立即开始吗? 按照以下步骤将 ScreenApp 集成到您的网站中:
1. 安装插件
将此代码添加到您网站的 HTML 中:
<script>
// Plugin installation code here
</script>
2. 添加触发按钮
向您的页面添加按钮或触发元素:
<button onclick="loadScreenApp()">Start Recording</button>
3. 配置回调
自定义回调函数以处理录制完成:
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}`;
}
身份验证
所有 API 请求都需要身份验证。 ScreenApp 使用基于令牌的身份验证以及特定于团队的标识符。
您需要的凭据
- API 令牌:您的密钥 API 密钥
- 团队 ID:您的唯一团队标识符
身份验证示例
curl -X POST "https://api.screenapp.io/v2/files/upload" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "X-Team-ID: YOUR_TEAM_ID"
身份验证端点
GET /auth/google
重定向到 Google 进行身份验证
查询参数:
redirectUrl- 编码后的 URL,用于在成功身份验证后重定向用户referrerUrl- 编码后的引荐来源 URLintent- 用户的意图(例如,“注册”)
GET /auth/facebook
重定向到 Facebook 进行身份验证
查询参数:
redirectUrl- 编码后的 URL,用于在成功身份验证后重定向用户referrerUrl- 编码后的引荐来源 URLintent- 用户的意图(例如,“注册”)
核心概念
在深入研究特定端点之前,让我们了解 ScreenApp 中的关键概念:
- 录音:可以上传和处理的视频和音频捕获
- 团队:可以共享和管理录音的群组
- Webhook:用于录音事件和处理结果的实时通知
- 标签:可以附加到录音、团队或用户配置文件的元数据
API 参考
团队管理
POST /team/{teamId}/tag
将标签添加到团队
路径参数:
teamId- 团队的 ID
请求正文:
{
"key": "color",
"value": "red"
}
DELETE /team/{teamId}/tag
从团队中删除标签
路径参数:
teamId- 团队的 ID
请求正文:
{
"key": "color"
}
团队 Webhook 集成
POST /team/{teamId}/integrations/webhook
为团队注册一个新的 Webhook URL
路径参数:
teamId- 团队的 ID
请求正文:
{
"url": "https://example.com/webhook",
"name": "My Webhook"
}
响应:
200- Webhook 注册成功400- 无效的请求正文500- 内部服务器错误
DELETE /team/{teamId}/integrations/webhook
取消注册团队的 Webhook URL
路径参数:
teamId- 团队的 ID
查询参数:
url- 要取消注册的 Webhook URL
响应:
200- Webhook 注销成功400- 无效的请求404- Webhook URL 未找到500- 内部服务器错误
GET /team/{teamId}/integrations/zapier/sample/list
获取 Zapier 的示例数据作为数组
路径参数:
teamId- 团队的 ID
响应:
200- 示例数据检索成功404- 未找到示例文件
用户集成
POST /integrations/webhook
为用户注册一个新的 Webhook
请求正文:
{
"url": "https://example.com/webhook",
"name": "My Webhook"
}
响应:
200- Webhook 注册成功400- 无效的请求正文
DELETE /integrations/webhook
为用户注销 Webhook
查询参数:
url- 要注销的 Webhook URL
响应:
200- Webhook 注销成功400- 无效请求404- 未找到 Webhook URL
Webhook 事件
您的 Webhook 端点将收到以下格式的事件:
{
"event": "recording.completed",
"fileId": "file789",
"teamId": "team123",
"data": {
"url": "https://screenapp.io/recording/file789",
"duration": 300,
"status": "processed"
}
}
常见事件包括:
recording.startedrecording.completedrecording.processedrecording.failed
文件管理
POST /files/{fileId}/tag
将标签添加到文件
路径参数:
fileId- 文件的 ID
请求正文:
{
"key": "color",
"value": "red"
}
DELETE /files/{fileId}/tag
从文件中删除标签
路径参数:
fileId- 文件的 ID
请求正文:
{
"key": "color"
}
POST /files/{fileId}/ask/multimodal
使用多个 AI 模型询问有关文件的问题
路径参数:
fileId- 要分析的文件的 ID
请求正文:
{
"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]
}
}
}
响应:
200- 成功处理了问题403- 超过 AI 使用量限制500- 服务器错误
文件上传
POST /files/upload/{teamId}/{folderId}/url
生成文件上传的预签名 URL
路径参数:
teamId- 团队的 IDfolderId- 文件夹的 ID
请求正文:
{
"files": [
{
"contentType": "video/mp4",
"name": "meeting-recording.mp4"
}
]
}
响应:
200- 上传 URL 生成成功400- 无效的请求参数500- 服务器错误
POST /files/upload/{teamId}/{folderId}/finalize
完成上传的文件
路径参数:
teamId- 团队的 IDfolderId- 文件夹的 ID
请求正文:
{
"file": {
"fileId": "file123",
"contentType": "video/mp4",
"name": "Sales Call",
"description": "Weekly sales call with customer",
"recorderName": "John Doe",
"recorderEmail": "[email protected]"
}
}
响应:
200- 文件上传完成成功400- 无效的请求参数403- 超过上传限制500- 服务器错误
分段上传(适用于大文件)
PUT /files/upload/multipart/init/{teamId}/{folderId}
初始化大文件的分段上传
路径参数:
teamId- 团队的 IDfolderId- 文件夹的 ID
请求正文:
{
"contentType": "video/mp4"
}
响应:
200- 上传初始化成功400- 无效的请求参数500- 服务器错误
响应示例:
{
"success": true,
"data": {
"fileId": "file789",
"uploadId": "upload123"
}
}
PUT /files/upload/multipart/url/{teamId}/{folderId}/{fileId}/{uploadId}/{partNumber}
获取特定部分的上载 URL
路径参数:
teamId- 团队的 IDfolderId- 文件夹的 IDfileId- 正在上传的文件的 IDuploadId- 分段上传会话的 IDpartNumber- 部件编号 (1-10000)
请求正文:
{
"contentType": "video/mp4"
}
响应:
200- 上传 URL 生成成功400- 无效的请求参数500- 服务器错误
响应示例:
{
"success": true,
"data": {
"uploadUrl": "https://presigned-s3-url.com/part1"
}
}
PUT /files/upload/multipart/finalize/{teamId}/{folderId}/{fileId}/{uploadId}
完成分段上传
路径参数:
teamId- 团队的 IDfolderId- 文件夹的 IDfileId- 正在上传的文件的 IDuploadId- 分段上传会话的 ID
请求正文:
{
"file": {
"contentType": "video/mp4",
"recorderName": "John Doe",
"recorderEmail": "[email protected]",
"name": "My Recording",
"description": "A recorded video session",
"notes": [
{
"text": "Important point discussed",
"timestamp": 1234567890
}
]
}
}
响应:
200- 上传完成成功400- 无效的请求参数404- 未找到活动上传500- 服务器错误
PUT /files/upload/multipart/fallback/{teamId}/{folderId}/{fileId}/{partNumber}
通过后端上传文件部分(后备)
路径参数:
teamId- 团队的 IDfolderId- 文件夹的 IDfileId- 正在上传的文件的 IDpartNumber- 部件编号 (1-10000)
表单数据:
file- 要上传的文件部分contentType- 要上传的文件的 MIME 类型
响应:
200- 部分上传成功400- 无效的请求参数500- 服务器错误
帐户管理
POST /v2/account/tag
向已验证的用户添加标签
请求正文:
{
"key": "color",
"value": "red"
}
响应:
200- 标签添加成功400- 无效的请求参数
PUT /account/profile
更新经过身份验证的用户的个人资料
请求正文:
{
"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"
}
响应:
200- 个人资料更新成功400- 无效的请求参数
高级功能
AI 分析
使用 AI 分析您的录音以获取见解:
// 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 }]
}
}
})
});
批量操作
高效管理多个录音:
// 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);
}
错误处理
常见错误代码
400:无效的请求参数403:超过 AI 使用量限制或未经授权的访问404:未找到资源500:服务器错误
错误响应格式
错误响应通常遵循以下格式:
{
"success": false,
"message": "Detailed error message"
}
示例
设置团队 Webhook
Webhook 允许您在录音处理完毕后接收实时更新:
// 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'
);
上传和处理大型文件
对于大于 100MB 的文件,请使用分段上传流程:
// 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: '[email protected]'
}
})
}
);