Guía práctica

Documentación de la API y el SDK de ScreenApp

La API de ScreenApps le permite transcribir, resumir y analizar automáticamente contenido de vídeo y audio

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á:

  1. Una suscripción activa al plan Business
  2. Credenciales de API de su panel de ScreenApp

Cómo obtener sus credenciales de API

  1. Inicie sesión en su cuenta de ScreenApp
  2. Vaya a Configuración → Integración
  3. 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 exitosa
  • referrerUrl: URL de referencia codificada
  • intent: 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 exitosa
  • referrerUrl: URL de referencia codificada
  • intent: Intento para el usuario (por ejemplo, “registrarse”)

Conceptos básicos

Antes de sumergirnos en puntos finales específicos, comprendamos los conceptos clave en ScreenApp:

  1. Grabaciones: Capturas de video y audio que se pueden cargar y procesar
  2. Equipos: Grupos que pueden compartir y administrar grabaciones
  3. Webhooks: Notificaciones en tiempo real para eventos de grabación y resultados de procesamiento
  4. 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 correctamente
  • 400: Cuerpo de la solicitud no válido
  • 500: 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 correctamente
  • 400: Solicitud no válida
  • 404: URL del webhook no encontrada
  • 500: 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 correctamente
  • 404: 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 correctamente
  • 400: 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 correctamente
  • 400: Solicitud no válida
  • 404: 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 correctamente
  • 403: Límite de uso de IA excedido
  • 500: 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 equipo
  • folderId: ID de la carpeta

Cuerpo de la solicitud:

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

Respuestas:

  • 200: URL de carga generadas correctamente
  • 400: Parámetros de solicitud no válidos
  • 500: Error del servidor

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

Finalizar archivos subidos

Parámetros de ruta:

  • teamId: ID del equipo
  • folderId: 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": "[email protected]"
  }
}

Respuestas:

  • 200: Subida de archivos finalizada correctamente
  • 400: Parámetros de solicitud no válidos
  • 403: Límite de carga excedido
  • 500: 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 equipo
  • folderId: ID de la carpeta

Cuerpo de la solicitud:

{
  "contentType": "video/mp4"
}

Respuestas:

  • 200: Carga inicializada correctamente
  • 400: Parámetros de solicitud no válidos
  • 500: 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 equipo
  • folderId: ID de la carpeta
  • fileId: ID del archivo que se está cargando
  • uploadId: ID de la sesión de carga multiparte
  • partNumber: Número de parte (1-10000)

Cuerpo de la solicitud:

{
  "contentType": "video/mp4"
}

Respuestas:

  • 200: URL de carga generada correctamente
  • 400: Parámetros de solicitud no válidos
  • 500: 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 equipo
  • folderId: ID de la carpeta
  • fileId: ID del archivo que se está cargando
  • uploadId: ID de la sesión de carga multiparte

Cuerpo de la solicitud:

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

Respuestas:

  • 200: Carga finalizada correctamente
  • 400: Parámetros de solicitud no válidos
  • 404: Carga activa no encontrada
  • 500: 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 equipo
  • folderId: ID de la carpeta
  • fileId: ID del archivo que se está cargando
  • partNumber: Número de parte (1-10000)

Datos del formulario:

  • file: La parte del archivo para cargar
  • contentType: Tipo MIME del archivo que se está cargando

Respuestas:

  • 200: Parte cargada correctamente
  • 400: Parámetros de solicitud no válidos
  • 500: 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 correctamente
  • 400: 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 correctamente
  • 400: 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álidos
  • 403: Límite de uso de IA excedido o acceso no autorizado
  • 404: Recurso no encontrado
  • 500: 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: '[email protected]'
      }
    })
  }
);

Obtener credenciales de API en el panel →