- Webhooks de usuario frente a webhooks del espacio de trabajo
- Webhooks automatizados frente a webhooks manuales
- Pasos para configurar webhooks
- Verificación de solicitudes de webhook
- Esquema
-
Preguntas frecuentes
- ¿Por qué no recibo webhooks para algunas de mis reuniones?
- ¿Pueden los webhooks enviar informes generados a partir de cargas de archivos?
- ¿Puedo obtener acceso a todos los informes de mi equipo o espacio de trabajo mediante webhooks?
- ¿Los webhooks reintentan automáticamente los envíos cuando se produce un error?
- ¿Por qué mi webhook no incluye una firma?
- ¿Por qué mi webhook aparece como «detenido»?
- Artículos relacionados
Con los webhooks, Read puede enviar notas de reuniones y datos de informes a un punto de conexión personalizado para que otras herramientas o servicios reciban automáticamente las actualizaciones de las reuniones. Cuando un informe está disponible, Read envía una solicitud de webhook que contiene los datos de la reunión al punto de conexión configurado.
Hay dos tipos de webhooks:
- Webhooks de usuario envían los informes de reuniones de un solo usuario (la persona que creó el webhook). Cualquier usuario puede configurarlos para sus propias reuniones.
- Webhooks del espacio de trabajo envían los informes de reuniones de todos los usuarios del espacio de trabajo a un único punto de conexión. Los administradores y propietarios del espacio de trabajo los crean y gestionan.
Si es necesario, un usuario también puede activar manualmente un webhook desde el informe de una reunión individual.
Requisitos previos
- Los webhooks solo están disponibles en los planes Pro, Enterprise y Enterprise+.
- Los usuarios deben verificar su dirección de correo electrónico antes de crear webhooks.
- Hay un máximo de 20 webhooks por usuario y un máximo independiente de 20 webhooks del espacio de trabajo; una vez alcanzado el límite, es necesario eliminar webhooks antiguos para crear otros nuevos.
- Solo los administradores y propietarios del espacio de trabajo pueden crear o editar webhooks del espacio de trabajo.
Webhooks de usuario frente a webhooks del espacio de trabajo
| Webhooks de usuario | Webhooks del espacio de trabajo | |
|---|---|---|
| Quién puede crear o editar | Cualquier usuario | Solo los administradores y propietarios del espacio de trabajo |
| Dónde configurarlos | Integraciones → pestaña Tus integraciones → Webhooks | Integraciones → pestaña Espacio de trabajo → Webhooks |
| Informes enviados | Solo los informes del usuario que lo creó | Informes de todos los miembros del espacio de trabajo |
trigger opciones
|
meeting_end |
meeting_start, meeting_end
|
| Envío manual desde un informe | Disponible para el usuario que lo creó | Disponible para todos los miembros del espacio de trabajo |
| Esquema de la carga útil | Esquema estándar | El mismo esquema estándar |
| Límite | 20 por usuario | 20 por espacio de trabajo (límite independiente) |
Ambos tipos de webhooks comparten el mismo esquema de carga útil y el mismo proceso de verificación de firmas. Las principales diferencias son quién puede configurarlos y los informes que envían.
Los webhooks solo se activan para los informes a los que un miembro tenía acceso directo en el momento en que se creó el informe. No se activan para los informes que un miembro solo ve mediante Acceso a informes del equipo o Acceso global a informes (acceso indirecto).
Webhooks automatizados frente a webhooks manuales
Los webhooks automatizados se activan cuando el informe de la reunión se genera correctamente después de que termina una reunión. Debes tener al menos acceso de «Visor» al informe en el momento de la reunión; por lo tanto, no funcionan si el acceso se concedió después de la reunión. Por lo general, solo se activan una vez por informe, excepto que reintentan automáticamente varias veces con un retroceso exponencial cuando reciben un código de estado HTTP que no es 2xx del punto de conexión configurado. Después de 25 intentos, si sigue fallando, dejará de intentarlo y el webhook cambiará al estado «Detenido» (consulta «Motivos por los que mi webhook se detuvo» más abajo).
Los webhooks manuales se activan cuando un usuario los ejecuta desde la página de un informe. También funcionan si el acceso al informe se concedió después de la reunión, pero debe ser como mínimo de nivel «Editor». Siempre que tengas al menos un webhook configurado, puedes hacer clic en el botón de webhooks del menú de distribución y aparecerá una ventana emergente que te permitirá elegir a qué webhook quieres enviar el informe. Una vez enviado correctamente, verás un mensaje de confirmación.
Pasos para configurar webhooks
1. Ve a la página Integraciones
¿Estás configurando un webhook del espacio de trabajo? Los administradores y propietarios del espacio de trabajo los gestionan desde la pestaña Espacio de trabajo de la página Integraciones. Los pasos restantes (nombre, URL, clave de firma, prueba y activación) son idénticos.
2. En la sección Webhooks, haz clic en «Crear webhook»
Si estás creando un webhook del espacio de trabajo, también se te pedirá que reconozcas y confirmes que comprendes los riesgos antes de continuar.
3. Introduce un nombre y una URL para el webhook
No uses caracteres Unicode ni emojis UTF-8 en el nombre y asegúrate de proporcionar una URL HTTPS. La aplicación de esta URL debe estar configurada para recibir una carga útil JSON con nuestro esquema estándar.
Si estás creando un webhook del espacio de trabajo, también tendrás la opción de activarlo cuando comience una reunión y deberás seleccionar al menos una de las opciones de activación.
4. (Opcional) Copia tu clave de firma
Como práctica recomendada de seguridad, generamos una clave de firma única para cada webhook que crees. Puedes usar esta clave más adelante para verificar que las llamadas recibidas por tu punto de conexión personalizado proceden realmente de Read AI (más información abajo).
5. (Opcional) Prueba tu webhook
Recomendamos hacer una prueba en este momento para detectar los problemas con antelación. Puedes usar aquí la opción «Enviar solicitud de prueba» para activar una solicitud con datos ficticios o, si quieres probar con datos reales de una reunión, puedes ir a un informe antiguo y activar el webhook manualmente.
Si encuentras algún problema, asegúrate de que tu punto de conexión esté activo y configurado correctamente para devolver un código de estado HTTP 2xx cuando reciba una carga útil JSON con nuestro esquema estándar.
6. Organiza una reunión y observa el flujo de datos
Ten en cuenta que el estado seguirá apareciendo como «Pendiente» hasta que envíes tu primera carga útil real correspondiente a una reunión. Siempre que la URL que proporcionaste responda correctamente al webhook cuando se active, el estado se actualizará a «Activo».
Verificación de solicitudes de webhook
Para ayudar a garantizar que las solicitudes de webhook que recibes hayan sido enviadas realmente por Read AI, cada entrega de webhook incluye una firma criptográfica. Puedes usar la clave de firma proporcionada en la configuración de tu webhook para verificar que la solicitud se originó en Read AI y no se modificó durante el tránsito. Esta función solo está disponible para los nuevos webhooks creados después del 17 de marzo de 2026.
Cómo funciona
Cuando Read AI envía un webhook, calculamos una firma usando la clave de firma de tu webhook y el cuerpo sin procesar de la solicitud. La firma resultante se incluye en el encabezado de la solicitud X-Read-Signature.
En tu servidor, puedes calcular independientemente la misma firma usando la clave de firma. Si el valor calculado coincide con la firma incluida en la solicitud del webhook, la carga útil es auténtica.
Pasos para verificar un webhook
-
Obtén la clave de firma de tu webhook
En la configuración del webhook de Read AI, verás una clave de firma asociada a tu punto de conexión de webhook. Guarda esta clave de forma segura y úsala únicamente en tu servidor para verificar las solicitudes de webhook. -
Lee el cuerpo sin procesar de la solicitud
Captura la carga útil sin procesar exacta que se envió a tu punto de conexión. No la modifiques, reformatees ni analices antes de la verificación, ya que la firma se calcula usando el cuerpo original sin procesar. -
Extrae el encabezado de firma
Lee el valor del encabezadoX-Read-Signaturede la solicitud entrante. Este encabezado contiene la firma HMAC generada por Read AI. -
Calcula tu propia firma
Usando la clave de firma de tu webhook, calcula un hash HMAC SHA‑256 del cuerpo sin procesar de la solicitud. -
Compara las firmas
Compara la firma que calculaste con el valor del encabezadoX-Read-Signature. Si coinciden, Read AI envió la solicitud y la carga útil no ha sido manipulada.
Nota: Los webhooks también contienen una propiedad única request_id en el cuerpo que se puede usar para detectar e ignorar cargas útiles duplicadas, lo que ayuda a evitar ataques de repetición.
Código de ejemplo de verificación
Python
import base64
import hmac
import hashlib
# Replace with the body of the request
body = b'{...}'
# Replace with the value of the X-Read-Signature header received on each request
header_sig = "d2f733f07d3862f707e761be1b72c6533133977307abf272dabb66addfbec9a1"
# ⚠️ IMPORTANT: Store the signing key in a secure location, not in code. This is for illustrative purposes only.
signing_key = "GHx4YT/StkcArjYPypjFG48FbZvgzBuDBOz5pCecbro="
key_bytes = base64.b64decode(signing_key)
digest = hmac.new(key_bytes, body, hashlib.sha256).hexdigest()
if hmac.compare_digest(digest, header_sig.lower()):
print("✅ Signature verified. This request came from Read AI!")
else:
print("❌ Signature verification failed!")
JavaScript
const crypto = require('crypto');
// Replace with the body of the request
const body = '{...}';
// Replace with the value of the X-Read-Signature header received on each request
const headerSig = "d2f733f07d3862f707e761be1b72c6533133977307abf272dabb66addfbec9a1";
// ⚠️ IMPORTANT: Store the signing key in a secure location, not in code. This is for illustrative purposes only.
const signingKey = "GHx4YT/StkcArjYPypjFG48FbZvgzBuDBOz5pCecbro=";
const keyBytes = Buffer.from(signingKey, 'base64');
const digest = crypto.createHmac('sha256', keyBytes)
.update(body, 'utf8')
.digest('hex');
if (crypto.timingSafeEqual(Buffer.from(digest), Buffer.from(headerSig.toLowerCase()))) {
console.log("✅ Signature verified. This request came from Read AI!");
} else {
console.log("❌ Signature verification failed!");
}Go
package main
import (
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
"encoding/hex"
"fmt"
)
func main() {
// Replace with the body of the request
body := []byte("{...}")
// Replace with the value of the X-Read-Signature header received on each request
headerSig := "d2f733f07d3862f707e761be1b72c6533133977307abf272dabb66addfbec9a1"
// ⚠️ IMPORTANT: Store the signing key in a secure location, not in code. This is for illustrative purposes only.
signingKey := "GHx4YT/StkcArjYPypjFG48FbZvgzBuDBOz5pCecbro="
keyBytes, err := base64.StdEncoding.DecodeString(signingKey)
if err != nil {
panic(err)
}
h := hmac.New(sha256.New, keyBytes)
h.Write(body)
digest := hex.EncodeToString(h.Sum(nil))
if hmac.Equal([]byte(digest), []byte(headerSig)) {
fmt.Println("✅ Signature verified. This request came from Read AI!")
} else {
fmt.Println("❌ Signature verification failed!")
}
}
Ruby
require 'openssl'
require 'base64'
# Replace with the body of the request
body = '{...}'
# Replace with the value of the X-Read-Signature header received on each request
header_sig = "d2f733f07d3862f707e761be1b72c6533133977307abf272dabb66addfbec9a1"
# ⚠️ IMPORTANT: Store the signing key in a secure location, not in code. This is for illustrative purposes only.
signing_key = "GHx4YT/StkcArjYPypjFG48FbZvgzBuDBOz5pCecbro="
key_bytes = Base64.decode64(signing_key)
digest = OpenSSL::HMAC.hexdigest('SHA256', key_bytes, body)
if OpenSSL.secure_compare(digest, header_sig.downcase)
puts "✅ Signature verified. This request came from Read AI!"
else
puts "❌ Signature verification failed!"
end
Prácticas recomendadas
- Verifica siempre las firmas de los webhooks antes de procesar la carga útil.
- Rechaza las solicitudes con firmas
X-Read-Signatureausentes o no válidas. - Guarda la clave de firma de forma segura y nunca la expongas en código del lado del cliente.
- Usa una función de comparación segura frente a ataques de temporización al comparar firmas.
Esquema
Propiedades JSON
Cada vez que se activa un webhook, Read envía una solicitud HTTP POST con una carga útil JSON sin procesar en el cuerpo que contiene las siguientes propiedades de nivel superior:
-
session_id: Identificador único de la sesión de la reunión -
trigger: El evento que activó el webhook:meeting_endomeeting_start(solo webhooks del espacio de trabajo). Ten en cuenta que activar manualmente un webhook desde un informe siempre envíameeting_end. -
title: El título de la reunión -
start_time: La hora de inicio de la reunión en formato UTC -
end_time: La hora de finalización de la reunión en formato UTC -
participants: Una matriz de participantes de la reunión -
owner: El propietario de la reunión -
summary: El resumen general de la reunión -
action_items: Una matriz de acciones tratadas durante la reunión -
key_questions: Una matriz de preguntas clave planteadas durante la reunión -
topics: Una matriz de temas tratados en la reunión -
report_url: Una URL al informe de la reunión en la interfaz web de Read -
chapter_summaries: Resúmenes más detallados de la reunión, divididos en capítulos secuenciales junto con sus temas asociados. -
transcript: La transcripción completa de la reunión, incluidos los nombres de los participantes y las marcas de tiempo en hora Unix (milisegundos). -
platform_meeting_id: El ID único de esta reunión en, por ejemplo, Teams, Zoom o Meet -
platform: La plataforma desde la que se grabó la reunión (ten en cuenta que las grabaciones de la aplicación de escritorio o móvil de Read AI siempre indicarán esa aplicación como la plataforma) -
request_id: ID único generado para cada solicitud, que se puede usar para ignorar cargas útiles duplicadas y evitar ataques de repetición.
Cargas útiles de «inicio de la reunión»
Los webhooks del espacio de trabajo también pueden activarse al inicio de una reunión. Como todavía no existe ningún informe, una carga útil meeting_start contiene únicamente el siguiente subconjunto del esquema estándar:
session_id-
trigger("meeting_start") titlestart_timeownerplatformplatform_meeting_idrequest_id
Los demás campos (como end_time, summary, action_items, topics, chapter_summaries, transcript y report_url) no están presentes al inicio de la reunión. Las entregas meeting_start se firman con el mismo encabezado X-Read-Signature, por lo que debes verificarlas exactamente igual que una carga útil meeting_end.
Ejemplo de carga útil
Este es un ejemplo de carga útil, que debería ser muy similar a la carga útil enviada en una solicitud de prueba de webhook.
{
"session_id": "SESSIONID",
"trigger": "meeting_end",
"title": "Meeting Title",
"start_time": "2026-01-01T00:00:00Z",
"end_time": "2026-01-01T01:00:00Z",
"participants": [
{
"name": "Participant One",
"first_name": "Participant",
"last_name": "One",
"email": "participant_one@company.com"
},
{
"name": "Participant Two",
"first_name": "Participant",
"last_name": "Two",
"email": null
}
],
"owner": {
"name": "Participant One",
"first_name": "Participant",
"last_name": "One",
"email": "participant_one@company.com"
},
"summary": "Meeting summary goes here...",
"action_items": [
{
"text": "Action item one"
},
{
"text": "Action item two"
}
],
"key_questions": [
{
"text": "Key question one?"
},
{
"text": "Key question two?"
}
],
"topics": [
{
"text": "Topic one"
},
{
"text": "Topic two"
}
],
"report_url": "https://app.read.ai/analytics/meetings/SESSIONID",
"chapter_summaries": [
{
"title": "Chapter one",
"description": "First chapter description",
"topics": [
{
"text": "Topic one"
}
]
},
{
"title": "Chapter two",
"description": "Second chapter description",
"topics": [
{
"text": "Topic two"
}
]
}
],
"transcript": {
"speaker_blocks": [
{
"start_time": "1719514000000",
"end_time": "1719514001000",
"speaker": {
"name": "Speaker 1"
},
"words": "Good morning everyone!"
},
{
"start_time": "1719514002000",
"end_time": "1719514003000",
"speaker": {
"name": "Speaker 2"
},
"words": "Hi!"
}
],
"speakers": [
{
"name": "Speaker 1"
},
{
"name": "Speaker 2"
}
]
}
"platform_meeting_id": "abc-defg-hij",
"platform": "meet",
"request_id": "01KKVQZ19X57NMNFTS8YXJNZE4"
}
Preguntas frecuentes
¿Por qué no recibo webhooks para algunas de mis reuniones?
Los webhooks solo se activan automáticamente cuando se crea un informe por primera vez y únicamente para los informes a los que tenías acceso directo en ese momento. No se activan cuando los informes se comparten contigo posteriormente ni si obtuviste acceso únicamente mediante Acceso a informes del equipo o Acceso global a informes (que se consideran acceso indirecto).
¿Pueden los webhooks enviar informes generados a partir de cargas de archivos?
No. Los webhooks (tanto automáticos como manuales) están diseñados para los informes de reuniones estándar; los informes generados a partir de cargas de archivos no los activan.
¿Puedo obtener acceso a todos los informes de mi equipo o espacio de trabajo mediante webhooks?
Sí. Los webhooks del espacio de trabajo envían los informes de reuniones de todos los miembros del espacio de trabajo a un único punto de conexión. Solo los administradores y propietarios del espacio de trabajo pueden crearlos y editarlos desde la pestaña Espacio de trabajo de la página Integraciones.
¿Los webhooks reintentan automáticamente los envíos cuando se produce un error?
Sí. Read reintentará automáticamente una solicitud de webhook cuando reciba de tu punto de conexión cualquier código de estado HTTP superior a 299. Cada solicitud se reintentará hasta 5 veces, con un total de 6 intentos.
¿Por qué mi webhook no incluye una firma?
Las firmas se añadieron a los webhooks de Read en marzo de 2026, por lo que los webhooks generados antes de esa fecha no las incluyen. Para obtener firmas y verificar estos webhooks antiguos, tendrás que eliminarlos y volver a crearlos.
¿Por qué mi webhook aparece como «detenido»?
Si Read intenta enviar datos a un webhook y no lo consigue, después de 25 errores consecutivos nuestro sistema desactivará automáticamente el webhook y lo marcará como «detenido».
Como los webhooks solo están disponibles para usuarios de pago, si tu suscripción finalizó por cualquier motivo, tus webhooks también se detendrán.
Si esto te ocurre, es posible que debas eliminarlo y volver a crearlo para activarlo de nuevo.
Artículos relacionados
- Para obtener una solución sin código que te permita conectarte a otras plataformas mediante el mismo enfoque de activadores automáticos, consulta Primeros pasos con Zapier.
- Para obtener acceso bajo demanda a los datos de reuniones mediante otras plataformas o tus propias aplicaciones personalizadas, consulta el servidor MCP y la API REST.