Documentación de la API de ScreenApp v2.0.0
La API de ScreenApp le permite transcribir, resumir y analizar automáticamente contenido de video y audio. Perfecto para empresas que buscan procesar llamadas de clientes, videos de capacitación y grabaciones de reuniones a escala.
Casos de uso clave
- Transcripción y resumen automáticos: Convierta cualquier video o audio en texto con capacidad de búsqueda y resúmenes concisos. Ideal para equipos de atención al cliente, instituciones educativas y creadores de contenido.
- Gestión del conocimiento: Cree un repositorio de contenido de video con capacidad de búsqueda con transcripciones automáticas, resúmenes e información impulsada por IA. Perfecto para materiales de capacitación y bases de conocimiento de la empresa.
- Procesamiento en tiempo real: Reciba transcripciones y resúmenes a través de webhooks tan pronto como se procesen las grabaciones. Excelente para integrarse con sistemas CRM y plataformas de atención al cliente.
- Grabación integrada: Agregue capacidades de grabación de nivel profesional a su aplicación con nuestra grabadora integrada que maneja tanto la pantalla como la captura de audio.
✨ Caso de uso popular: Los equipos de atención al cliente utilizan nuestra API para transcribir automáticamente las llamadas de soporte y generar resúmenes, que luego se sincronizan con su CRM a través de webhooks.
Obtener credenciales de API en el panel →
Requisitos del plan y acceso a la API
Para usar la API de ScreenApp, necesitará:
- Una suscripción activa al plan Business
- Credenciales de API de su panel de ScreenApp
Cómo obtener sus credenciales de API
- Inicie sesión en su cuenta de ScreenApp
- Vaya a Configuración → Integración
- Aquí encontrará su:
- Token de API
- ID del equipo
Mantenga estas credenciales seguras y nunca las comparta públicamente.
Inicio rápido
¿Quiere comenzar de inmediato? Siga estos pasos para integrar ScreenApp en su sitio web:
1. Instalar el plugin
Agregue este código al HTML de su sitio web:
<script>
// Plugin installation code here
</script>
2. Agregar el botón de activación
Agregue un botón o elemento de activación a su página:
<button onclick="loadScreenApp()">Start Recording</button>
3. Configurar la devolución de llamada
Personalice la función de devolución de llamada para manejar la finalización de la grabación:
function callback({ id, url }) {
// Ejemplo: Enviar a su backend
fetch('/api/recordings', {
method: 'POST',
body: JSON.stringify({ recordingId: id, recordingUrl: url })
});
// Ejemplo: Actualizar la IU
document.getElementById('status').innerHTML =
`Grabación guardada! Véala en ${url}`;
}
Autenticación
Todas las solicitudes de API requieren autenticación. ScreenApp utiliza autenticación basada en tokens junto con identificadores específicos del equipo.
Credenciales que necesitará
- Token de API: Su clave API secreta
- ID del equipo: Su identificador único del equipo
Ejemplo de autenticación
curl -X POST "https://api.screenapp.io/v2/files/upload" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "X-Team-ID: YOUR_TEAM_ID"
Puntos finales de autenticación
GET /auth/google
Redirigir a Google para la autenticación
Parámetros de consulta:
redirectUrl
: URL codificada para redirigir al usuario después de la autenticación exitosareferrerUrl
: URL de referencia codificadaintent
: Intento para el usuario (por ejemplo, “registrarse”)
GET /auth/facebook
Redirigir a Facebook para la autenticación
Parámetros de consulta:
redirectUrl
: URL codificada para redirigir al usuario después de la autenticación exitosareferrerUrl
: URL de referencia codificadaintent
: Intento para el usuario (por ejemplo, “registrarse”)
Conceptos básicos
Antes de sumergirnos en puntos finales específicos, comprendamos los conceptos clave en ScreenApp:
- Grabaciones: Capturas de video y audio que se pueden cargar y procesar
- Equipos: Grupos que pueden compartir y administrar grabaciones
- Webhooks: Notificaciones en tiempo real para eventos de grabación y resultados de procesamiento
- Etiquetas: Metadatos que se pueden adjuntar a grabaciones, equipos o perfiles de usuario
Referencia de la API
Gestión de equipos
POST /team/{teamId}/tag
Agregar etiqueta al equipo
Parámetros de ruta:
teamId
: ID del equipo
Cuerpo de la solicitud:
{
"key": "color",
"value": "red"
}
DELETE /team/{teamId}/tag
Eliminar etiqueta del equipo
Parámetros de ruta:
teamId
: ID del equipo
Cuerpo de la solicitud:
{
"key": "color"
}
Integración de Webhook del equipo
POST /team/{teamId}/integrations/webhook
Registrar una nueva URL de webhook para el equipo
Parámetros de ruta:
teamId
: ID del equipo
Cuerpo de la solicitud:
{
"url": "https://example.com/webhook",
"name": "My Webhook"
}
Respuestas:
200
: Webhook registrado correctamente400
: Cuerpo de la solicitud no válido500
: Error interno del servidor
DELETE /team/{teamId}/integrations/webhook
Anular el registro de una URL de webhook para el equipo
Parámetros de ruta:
teamId
: ID del equipo
Parámetros de consulta:
url
: La URL del webhook para anular el registro
Respuestas:
200
: Webhook anulado el registro correctamente400
: Solicitud no válida404
: URL del webhook no encontrada500
: Error interno del servidor
GET /team/{teamId}/integrations/zapier/sample/list
Obtener datos de muestra para Zapier como una matriz
Parámetros de ruta:
teamId
: ID del equipo
Respuestas:
200
: Datos de muestra recuperados correctamente404
: Archivo de muestra no encontrado
Integraciones de usuario
POST /integrations/webhook
Registrar un nuevo webhook para el usuario
Cuerpo de la solicitud:
{
"url": "https://example.com/webhook",
"name": "My Webhook"
}
Respuestas:
200
: Webhook registrado correctamente400
: Cuerpo de la solicitud no válido
DELETE /integrations/webhook
Anular el registro de un webhook para el usuario
Parámetros de consulta:
url
: La URL del webhook para anular el registro
Respuestas:
200
: Webhook anulado el registro correctamente400
: Solicitud no válida404
: URL del webhook no encontrada
Eventos de Webhook
Su punto final de webhook recibirá eventos en este formato:
{
"event": "recording.completed",
"fileId": "file789",
"teamId": "team123",
"data": {
"url": "https://screenapp.io/recording/file789",
"duration": 300,
"status": "processed"
}
}
Los eventos comunes incluyen:
recording.started
recording.completed
recording.processed
recording.failed
Gestión de archivos
POST /files/{fileId}/tag
Agregar etiqueta al archivo
Parámetros de ruta:
fileId
: ID del archivo
Cuerpo de la solicitud:
{
"key": "color",
"value": "red"
}
DELETE /files/{fileId}/tag
Eliminar etiqueta del archivo
Parámetros de ruta:
fileId
: ID del archivo
Cuerpo de la solicitud:
{
"key": "color"
}
POST /files/{fileId}/ask/multimodal
Hacer una pregunta sobre un archivo utilizando múltiples modelos de IA
Parámetros de ruta:
fileId
: ID del archivo para analizar
Cuerpo de la solicitud:
{
"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]
}
}
}
Respuestas:
200
: Pregunta procesada correctamente403
: Límite de uso de IA excedido500
: Error del servidor
Subida de archivos
POST /files/upload/{teamId}/{folderId}/url
Generar URL previamente firmadas para la carga de archivos
Parámetros de ruta:
teamId
: ID del equipofolderId
: ID de la carpeta
Cuerpo de la solicitud:
{
"files": [
{
"contentType": "video/mp4",
"name": "meeting-recording.mp4"
}
]
}
Respuestas:
200
: URL de carga generadas correctamente400
: Parámetros de solicitud no válidos500
: Error del servidor
POST /files/upload/{teamId}/{folderId}/finalize
Finalizar archivos subidos
Parámetros de ruta:
teamId
: ID del equipofolderId
: ID de la carpeta
Cuerpo de la solicitud:
{
"file": {
"fileId": "file123",
"contentType": "video/mp4",
"name": "Sales Call",
"description": "Weekly sales call with customer",
"recorderName": "John Doe",
"recorderEmail": "john.doe@example.com"
}
}
Respuestas:
200
: Subida de archivos finalizada correctamente400
: Parámetros de solicitud no válidos403
: Límite de carga excedido500
: Error del servidor
Carga multiparte (para archivos grandes)
PUT /files/upload/multipart/init/{teamId}/{folderId}
Inicializar una carga multiparte para un archivo grande
Parámetros de ruta:
teamId
: ID del equipofolderId
: ID de la carpeta
Cuerpo de la solicitud:
{
"contentType": "video/mp4"
}
Respuestas:
200
: Carga inicializada correctamente400
: Parámetros de solicitud no válidos500
: Error del servidor
Ejemplo de respuesta:
{
"success": true,
"data": {
"fileId": "file789",
"uploadId": "upload123"
}
}
PUT /files/upload/multipart/url/{teamId}/{folderId}/{fileId}/{uploadId}/{partNumber}
Obtener la URL de carga para una parte específica
Parámetros de ruta:
teamId
: ID del equipofolderId
: ID de la carpetafileId
: ID del archivo que se está cargandouploadId
: ID de la sesión de carga multipartepartNumber
: Número de parte (1-10000)
Cuerpo de la solicitud:
{
"contentType": "video/mp4"
}
Respuestas:
200
: URL de carga generada correctamente400
: Parámetros de solicitud no válidos500
: Error del servidor
Ejemplo de respuesta:
{
"success": true,
"data": {
"uploadUrl": "https://presigned-s3-url.com/part1"
}
}
PUT /files/upload/multipart/finalize/{teamId}/{folderId}/{fileId}/{uploadId}
Finalizar una carga multiparte
Parámetros de ruta:
teamId
: ID del equipofolderId
: ID de la carpetafileId
: ID del archivo que se está cargandouploadId
: ID de la sesión de carga multiparte
Cuerpo de la solicitud:
{
"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
}
]
}
}
Respuestas:
200
: Carga finalizada correctamente400
: Parámetros de solicitud no válidos404
: Carga activa no encontrada500
: Error del servidor
PUT /files/upload/multipart/fallback/{teamId}/{folderId}/{fileId}/{partNumber}
Cargar parte del archivo a través del backend (fallback)
Parámetros de ruta:
teamId
: ID del equipofolderId
: ID de la carpetafileId
: ID del archivo que se está cargandopartNumber
: Número de parte (1-10000)
Datos del formulario:
file
: La parte del archivo para cargarcontentType
: Tipo MIME del archivo que se está cargando
Respuestas:
200
: Parte cargada correctamente400
: Parámetros de solicitud no válidos500
: Error del servidor
Gestión de cuenta
POST /v2/account/tag
Agregar una etiqueta al usuario autenticado
Cuerpo de la solicitud:
{
"key": "color",
"value": "red"
}
Respuestas:
200
: Etiqueta agregada correctamente400
: Parámetros de solicitud no válidos
PUT /account/profile
Actualizar el perfil del usuario autenticado
Cuerpo de la solicitud:
{
"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"
}
Respuestas:
200
: Perfil actualizado correctamente400
: Parámetros de solicitud no válidos
Características avanzadas
Análisis de IA
Utilice la IA para analizar sus grabaciones en busca de información:
// Solicitar análisis de IA de una grabación
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 }]
}
}
})
});
Operaciones por lotes
Administre eficientemente múltiples grabaciones:
// Etiquetar múltiples grabaciones
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);
}
Manejo de errores
Códigos de error comunes
400
: Parámetros de solicitud no válidos403
: Límite de uso de IA excedido o acceso no autorizado404
: Recurso no encontrado500
: Error del servidor
Formato de respuesta de error
Las respuestas de error suelen seguir este formato:
{
"success": false,
"message": "Detailed error message"
}
Ejemplos
Configuración de Webhooks de equipo
Los webhooks le permiten recibir actualizaciones en tiempo real cuando se procesan las grabaciones:
// Registrar un nuevo webhook para su equipo
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();
}
// Ejemplo de uso
const result = await registerTeamWebhook(
'team123',
'https://your-domain.com/webhooks/screenapp',
'Recording Updates'
);
Carga y procesamiento de un archivo grande
Para archivos de más de 100 MB, utilice el flujo de carga multiparte:
// 1. Inicializar la carga
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. Dividir el archivo en fragmentos y cargar cada parte
const CHUNK_SIZE = 5 * 1024 * 1024; // Fragmentos de 5MB
const totalParts = Math.ceil(file.size / CHUNK_SIZE);
for (let partNumber = 1; partNumber <= totalParts; partNumber++) {
// Obtener la URL de carga para esta parte
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();
// Crear el fragmento del archivo
const start = (partNumber - 1) * CHUNK_SIZE;
const end = Math.min(start + CHUNK_SIZE, file.size);
const chunk = file.slice(start, end);
// Cargar el fragmento directamente a S3
await fetch(uploadUrl, {
method: 'PUT',
body: chunk,
headers: {
'Content-Type': 'video/mp4'
}
});
}
// 3. Finalizar la carga
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'
}
})
}
);