Read AI ofrece una API REST pública, ideal para desarrolladores que buscan crear aplicaciones que accedan mediante programación a los datos de sus reuniones de Read AI. Actualmente está disponible como versión beta abierta.
⚠️ Antes de comenzar, asegúrate de haber revisado los requisitos previos.
Autenticación
Todos los endpoints requieren autenticación mediante un token Bearer usando el encabezado Authorization. Consulta Claves de API y autenticación para obtener instrucciones sobre cómo obtener tu token de acceso.
Formato del encabezado
Authorization: Bearer YOUR_ACCESS_TOKENEjemplo
curl https://api.read.ai/v1/meetings \
-H "Authorization: Bearer sk_test_123" \
-H "Accept: application/json"Para los JWT (utilizados en OAuth2/Ory), Bearer tendría este formato:
"Authorization: Bearer ory_at_..."Estados de las reuniones
Las reuniones en la API de Read AI pueden encontrarse en distintos estados:
-
Reunión activa: una reunión que está en curso. Se identifica porque
end_time_msno está presente o esnull. -
Reunión finalizada: una reunión completada. Se identifica porque
end_time_mstiene un valor. -
Reunión con función en vivo habilitada: una reunión con captura de datos en tiempo real habilitada. Se identifica mediante
live_enabled: true.
Endpoints
La URL base de todos los endpoints es https://api.read.ai/.
1. Enumerar reuniones
Método: GET /v1/meetings
Descripción: Devuelve una lista paginada de reuniones en orden cronológico inverso (las más recientes primero), con la opción de filtrar por hora de inicio. Este endpoint devuelve tanto las reuniones activas como las finalizadas, incluido su estado de función en vivo. Ten en cuenta que las reuniones activas tendrán datos limitados o ningún dato para los campos expandibles, ya que estos se generan después de que finaliza una reunión.
Parámetros de consulta
| Nombre | Tipo | Descripción |
| limit | int | Número de resultados que se devolverán. Predeterminado: 10; máximo: 10. |
| start_time_ms.gt | int | Devuelve las reuniones cuyo start_time_ms sea mayor que este valor. |
| start_time_ms.gte | int | Devuelve las reuniones cuyo start_time_ms sea mayor o igual que este valor. |
| start_time_ms.lt | int | Devuelve las reuniones cuyo start_time_ms sea menor que este valor. |
| start_time_ms.lte | int | Devuelve las reuniones cuyo start_time_ms sea menor o igual que este valor. |
| cursor | str | Cursor para la paginación; usa el ID del último objeto de la página anterior. |
| expand[] | array | Campos que se expandirán (consulta la sección Campos expandibles). |
Solicitud de ejemplo
curl "https://api.read.ai/v1/meetings?limit=5&start_time_ms.gte=1733700000000" \
-H "Authorization: Bearer sk_test_123" \
-H "Accept: application/json"Respuesta de ejemplo
{
"object": "list",
"url": "/v1/meetings",
"has_more": false,
"data": [
{
"id": "01HFYH0A6JM4R7MZ2E6X5T9BNP",
"start_time_ms": 1733800000000,
"end_time_ms": 1733803600000,
"scheduled_start_time_ms": 1733799800000,
"scheduled_end_time_ms": 1733803400000,
"participants": [
{
"name": "Alice Example",
"email": "alice@example.com",
"invited": true,
"attended": true
}
],
"owner": {
"name": "Alice Example",
"email": "alice@example.com"
},
"title": "Weekly status sync",
"report_url": "https://app.read.ai/analytics/meetings/01HFYH0A6JM4R7MZ2E6X5T9BNP",
"platform": "zoom",
"platform_id": "987654321",
"folders": ["Weekly Sync"],
"live_enabled": false
}
]
}
2. Recuperar una reunión
Método: GET /v1/meetings/{id}
Descripción: Recupera una reunión específica mediante su ID único. Para las reuniones activas con la función en vivo habilitada, usa el endpoint /v1/meetings/{id}/live.
Parámetros de ruta
| Nombre | Tipo | Descripción |
| id | string | ULID de la reunión |
Parámetros de consulta
| Nombre | Tipo | Descripción |
| expand[] | array | Campos que se expandirán en la respuesta |
Solicitud de ejemplo
curl "https://api.read.ai/v1/meetings/01HFYH0A6JM4R7MZ2E6X5T9BNP?expand[]=summary&expand[]=metrics" \
-H "Authorization: Bearer sk_test_123" \
-H "Accept: application/json"Respuesta de ejemplo
{
"id": "01HFYH0A6JM4R7MZ2E6X5T9BNP",
"start_time_ms": 1733800000000,
"end_time_ms": 1733803600000,
"scheduled_start_time_ms": 1733799800000,
"scheduled_end_time_ms": 1733803400000,
"participants": [
{
"name": "Alice Example",
"email": "alice@example.com",
"invited": true,
"attended": true
}
],
"owner": {
"name": "Alice Example",
"email": "alice@example.com"
},
"title": "Weekly status sync",
"report_url": "https://app.read.ai/analytics/meetings/01HFYH0A6JM4R7MZ2E6X5T9BNP",
"platform": "zoom",
"platform_id": "987654321",
"folders": ["Weekly Sync"],
"live_enabled": false,
"summary": "We reviewed project timelines and assigned new action items.",
"metrics": {
"read_score": 0.9,
"sentiment": 0.3,
"engagement": 0.75
}
}
3. Recuperar una reunión en vivo
Método: GET /v1/meetings/{id}/live
Descripción: Recupera los datos en vivo de una reunión en curso mediante su ID único. Este endpoint permite obtener la transcripción en tiempo real y los resúmenes de capítulos a medida que avanza la reunión, con la opción de filtrar por hora de inicio.
Nota importante: De forma predeterminada, no todas las reuniones tienen datos en vivo; solo están disponibles si tienes el panel en vivo abierto durante la reunión. Añadiremos una configuración de cuenta para habilitar los datos en vivo en todas las reuniones como parte del lanzamiento de la versión GA completa.
Parámetros de ruta
| Nombre | Tipo | Descripción |
| id | string | ULID de la reunión |
Parámetros de consulta
| Nombre | Tipo | Descripción |
| Nombre | Tipo | Descripción |
| start_time_ms.gt | int | Devuelve datos en vivo cuando start_time_ms es mayor que este valor |
| start_time_ms.gte | int | Devuelve datos en vivo cuando start_time_ms es mayor o igual que este valor |
| expand[] | array | Campos que se expandirán en la respuesta (solo transcript y chapter_summaries están disponibles para las reuniones en vivo) |
Solicitud de ejemplo
curl "https://api.read.ai/v1/meetings/01HFYH0A6JM4R7MZ2E6X5T9BNP/live?expand[]=transcript&start_time_ms.gte=1733800000000" \
-H "Authorization: Bearer sk_test_123" \
-H "Accept: application/json"Respuesta de ejemplo
{
"id": "01HFYH0A6JM4R7MZ2E6X5T9BNP",
"start_time_ms": 1733800000000,
"end_time_ms": null,
"scheduled_start_time_ms": 1733799800000,
"scheduled_end_time_ms": 1733803400000,
"participants": [
{
"name": "Alice Example",
"email": "alice@example.com",
"invited": true,
"attended": true
}
],
"owner": {
"name": "Alice Example",
"email": "alice@example.com"
},
"title": "Weekly status sync",
"report_url": "https://app.read.ai/analytics/meetings/01HFYH0A6JM4R7MZ2E6X5T9BNP",
"platform": "zoom",
"platform_id": "987654321",
"folders": ["Weekly Sync"],
"live_enabled": true,
"transcript": {
"speakers": [
{
"name": "Alice Example"
}
],
"turns": [
{
"speaker": {
"name": "Alice Example"
},
"text": "Let's start with the project updates.",
"start_time_ms": 1733800000000,
"end_time_ms": 1733800005000
}
],
"text": "[Alice Example]: Let's start with the project updates."
}
}
Campos expandibles
La API admite el parámetro expand[] para obtener campos enriquecidos adicionales que no se incluyen de forma predeterminada. Ten en cuenta que el uso de campos expandidos aumentará los tiempos de respuesta, ya que la API recupera y procesa datos adicionales. Expandir varios campos o usar expansiones en solicitudes de listas grandes puede generar tiempos de procesamiento considerablemente más lentos.
Campos disponibles
summarychapter_summariesaction_itemskey_questionstopicstranscriptmetricsrecording_download
Solicitud de ejemplo
curl "https://api.read.ai/v1/meetings?expand[]=metrics&expand[]=transcript" \
-H "Authorization: Bearer sk_test_123" \
-H "Accept: application/json"
Paginación
La API utiliza una paginación basada en cursores para navegar por grandes conjuntos de resultados.
Parámetros
| Parámetro | Descripción |
| limit | Número máximo de objetos que se devolverán. Predeterminado: 10; máximo: 10. |
| cursor | Cursor que apunta a la página siguiente. Usa el ID del último objeto de la respuesta anterior. |
Campos de respuesta
| Campo | Tipo | Descripción |
| object | str | Normalmente, "list". |
| url | str | URL de la solicitud. |
| has_more | bool | Indica si existen páginas adicionales. |
| data | array | Lista de objetos de reunión devueltos. |
Ejemplo de uso
El parámetro cursor debe establecerse en el ID de la última reunión devuelta en el array data de la página anterior.
Paso 1: solicitud de la primera página
Método: GET /v1/meetings
Respuesta de ejemplo:
{
"object": "list",
"url": "/v1/meetings",
"has_more": true,
"data": [
{
"id": "01KG7BZV04HJGVBM4KJCWV9P4N",
"title": "Team Standup",
...
},
{
"id": "01KG76TMYXDRZ0D86Z3MNXP566",
"title": "Client Call",
...
},
...
{
"id": "01KG4JRNA0EEFAJTM0S3PMDARK", // ← Last meeting id in this page
"title": "Sprint Planning",
...
}
]
}
Paso 2: solicitud de la segunda página
Toma el id del último objeto del array data (01KG4JRNA0EEFAJTM0S3PMDARK) y úsalo como cursor:
Método: GET /v1/meetings?cursor=01KG4JRNA0EEFAJTM0S3PMDARK
Esto devolverá la página siguiente de resultados, comenzando después de esa reunión.
Paso 3: continúa hasta finalizar
Continúa repitiendo el proceso con el nuevo ID final hasta que has_more sea false.
Códigos de error
Las respuestas de error comunes siguen los códigos de estado HTTP estándar.
| Código de estado | Significado | Descripción |
| 200 | Correcto | La solicitud se realizó correctamente. |
| 400 | Solicitud incorrecta | Los parámetros de tu solicitud tienen un formato incorrecto o no son válidos. |
| 401 | No autorizado | La autenticación falló o falta el token. |
| 403 | Prohibido | No tienes permiso para acceder a este recurso. |
| 404 | No encontrado | El recurso solicitado no existe. |
| 422 | Entidad no procesable | Uno o más parámetros no superaron la validación. |
| 429 | Demasiadas solicitudes | Se superó el límite de solicitudes (máximo de 100 solicitudes por minuto por usuario); vuelve a intentarlo más tarde. |
| 500 | Error del servidor | Se produjo un error en el servidor. |