Webhooks

Versión de la API 2026-11-01 · Actualizada el 16 de octubre de 2026 · English

Con los webhooks, Zenzey avisa a tus sistemas cuando pasa algo en tu institución: un acta nueva, una tarea marcada como hecha, la bolsa de horas que aprieta. Cada evento es un POST por HTTPS con un cuerpo JSON, firmado para que puedas comprobar que viene de nosotros. Disponible en el plan Organización.

Inicio rápido

  1. En platform.zenzey.app › Integraciones › Webhooks, crea un webhook con la URL de tu destino y los eventos que quieres. Solo los coordinadores pueden crearlos.
  2. Copia el secreto de firma (whsec_…). Se muestra una sola vez; si lo pierdes, rótalo.
  3. Verifica la firma de cada petición (abajo) y rechaza las que no coincidan.
  4. Contesta con cualquier 2xx antes de 10 segundos. Lo lento, después de contestar.
  5. Pulsa Enviar prueba y revisa el resultado en el registro de entregas.

La petición

POST /zenzey HTTP/1.1
content-type: application/json
user-agent: Zenzey-Webhooks/1 (+https://zenzey.app/developers/webhooks)
webhook-id: evt_7c0e1b3f0a8c4a4f9b6f2d4c8e1a9b20
webhook-timestamp: 1793740445
webhook-signature: v1,K5oZfzN95Z9UVu1EsfQmfVNQhnkZ2pj9o9NDN/H/pI4=
zenzey-event-type: task.completed
zenzey-delivery-id: 3f2a9c1e-5b7d-4e0a-9c8b-1d2e3f4a5b6c
zenzey-attempt: 1
CabeceraQué es
webhook-idEl id del evento. Es el mismo en cada reintento y en cada reenvío manual: úsalo para descartar duplicados.
webhook-timestampSegundos unix de este intento.
webhook-signatureUna o dos firmas v1,<base64>, separadas por un espacio.
zenzey-event-typeEl tipo de evento, para enrutar antes de leer el cuerpo.
zenzey-delivery-idEsta entrega (un evento, un destino). Cítala cuando nos escribas.
zenzey-attempt1 en el primer intento; después 2, 3…

Todos los cuerpos tienen el mismo sobre:

{
  "id": "evt_7c0e1b3f0a8c4a4f9b6f2d4c8e1a9b20",
  "type": "webhook.ping",
  "api_version": "2026-11-01",
  "created_at": "2026-11-03T21:14:05.000Z",
  "organization": {
    "id": "6f1c2a7e-3b4d-4e8f-9a01-2b3c4d5e6f70",
    "name": "Escuela Vértice"
  },
  "data": {
    "message": "Test webhook from Zenzey",
    "endpoint": {
      "id": "b1c2d3e4-f5a6-4b7c-8d9e-0f1a2b3c4d5e",
      "host": "hooks.example.com"
    }
  }
}

created_at es cuándo pasó el evento, no cuándo se entregó. organization es tu institución. data depende del tipo.

Eventos

TipoCuándoContenido
session.recordedTerminó de subir el audio de una sesión.—
session.failedUna sesión no se pudo transcribir o redactar.—
session.deletedSe borró una sesión de una banda de la institución.—
session.recap_readyEl acta de una sesión quedó escrita por primera vez.sí
session.recap_regeneratedEl acta de una sesión se volvió a escribir. Reemplaza todo lo que guardaste de ella.sí
task.createdAlguien agregó una tarea o un pendiente a un acta.sí
task.updatedCambió el texto, el responsable o el tipo de una tarea. Las ediciones de 30 segundos se agrupan.sí
task.completedAlguien marcó una tarea como hecha.sí
task.reopenedUna tarea hecha volvió a quedar pendiente.sí
task.deletedSe quitó una tarea del acta, o se reclasificó como otra cosa.sí
usage.threshold_reachedLa bolsa de horas del mes pasó el 80 %, el 100 % o el 110 %. Una vez por mes y umbral.—
webhook.pingEl botón «Enviar prueba» del portal. No se puede suscribir.—

Solo salen eventos de sesiones grabadas en una banda de la institución. Cada evento, tal como llega:

session.recorded
{
  "id": "evt_7c0e1b3f0a8c4a4f9b6f2d4c8e1a9b20",
  "type": "session.recorded",
  "api_version": "2026-11-01",
  "created_at": "2026-11-03T21:14:05.000Z",
  "organization": {
    "id": "6f1c2a7e-3b4d-4e8f-9a01-2b3c4d5e6f70",
    "name": "Escuela Vértice"
  },
  "data": {
    "session": {
      "id": "0b6c1d2e-7f8a-4b9c-8d0e-1f2a3b4c5d6e",
      "title": "Ensayo del martes",
      "kind": "rehearsal",
      "recorded_at": "2026-11-03T19:30:00.000Z",
      "duration_seconds": 5412,
      "language": "es",
      "band": {
        "id": "9a8b7c6d-5e4f-4a3b-9c2d-1e0f9a8b7c6d",
        "name": "Lumbre"
      },
      "portal_url": "https://platform.zenzey.app/sessions/0b6c1d2e-7f8a-4b9c-8d0e-1f2a3b4c5d6e"
    }
  }
}
session.failed
{
  "id": "evt_7c0e1b3f0a8c4a4f9b6f2d4c8e1a9b20",
  "type": "session.failed",
  "api_version": "2026-11-01",
  "created_at": "2026-11-03T21:14:05.000Z",
  "organization": {
    "id": "6f1c2a7e-3b4d-4e8f-9a01-2b3c4d5e6f70",
    "name": "Escuela Vértice"
  },
  "data": {
    "session": {
      "id": "0b6c1d2e-7f8a-4b9c-8d0e-1f2a3b4c5d6e",
      "title": "Ensayo del martes",
      "kind": "rehearsal",
      "recorded_at": "2026-11-03T19:30:00.000Z",
      "duration_seconds": 5412,
      "language": "es",
      "band": {
        "id": "9a8b7c6d-5e4f-4a3b-9c2d-1e0f9a8b7c6d",
        "name": "Lumbre"
      },
      "portal_url": "https://platform.zenzey.app/sessions/0b6c1d2e-7f8a-4b9c-8d0e-1f2a3b4c5d6e"
    },
    "stage": "transcription",
    "failed_at": "2026-11-03T21:14:05.000Z"
  }
}
session.deleted
{
  "id": "evt_7c0e1b3f0a8c4a4f9b6f2d4c8e1a9b20",
  "type": "session.deleted",
  "api_version": "2026-11-01",
  "created_at": "2026-11-03T21:14:05.000Z",
  "organization": {
    "id": "6f1c2a7e-3b4d-4e8f-9a01-2b3c4d5e6f70",
    "name": "Escuela Vértice"
  },
  "data": {
    "session": {
      "id": "0b6c1d2e-7f8a-4b9c-8d0e-1f2a3b4c5d6e",
      "recorded_at": "2026-11-03T19:30:00.000Z",
      "band": {
        "id": "9a8b7c6d-5e4f-4a3b-9c2d-1e0f9a8b7c6d",
        "name": "Lumbre"
      }
    },
    "deleted_at": "2026-11-03T21:14:05.000Z"
  }
}
session.recap_ready
{
  "id": "evt_7c0e1b3f0a8c4a4f9b6f2d4c8e1a9b20",
  "type": "session.recap_ready",
  "api_version": "2026-11-01",
  "created_at": "2026-11-03T21:14:05.000Z",
  "organization": {
    "id": "6f1c2a7e-3b4d-4e8f-9a01-2b3c4d5e6f70",
    "name": "Escuela Vértice"
  },
  "data": {
    "session": {
      "id": "0b6c1d2e-7f8a-4b9c-8d0e-1f2a3b4c5d6e",
      "title": "Ensayo del martes",
      "kind": "rehearsal",
      "recorded_at": "2026-11-03T19:30:00.000Z",
      "duration_seconds": 5412,
      "language": "es",
      "band": {
        "id": "9a8b7c6d-5e4f-4a3b-9c2d-1e0f9a8b7c6d",
        "name": "Lumbre"
      },
      "portal_url": "https://platform.zenzey.app/sessions/0b6c1d2e-7f8a-4b9c-8d0e-1f2a3b4c5d6e",
      "public_url": "https://zenzey.app/a/k3v9x2"
    },
    "recap": {
      "version": "2026-11-03T21:14:03.000Z",
      "summary": "Ensayaron dos canciones; el puente de «Luz de paso» quedó a medio tiempo.",
      "songs": [
        {
          "id": "c1",
          "name": "Luz de paso",
          "key": "F#m",
          "takes": 3
        },
        {
          "id": "c2",
          "name": "Puente de sal",
          "key": "D",
          "takes": 2
        }
      ],
      "items": [
        {
          "id": "i1",
          "kind": "decision",
          "text": "El puente de «Luz de paso» va a medio tiempo.",
          "assignee": null,
          "done": false,
          "song_id": "c1",
          "origin": "ai"
        },
        {
          "id": "i2",
          "kind": "task",
          "text": "Pasar la letra corregida del segundo verso.",
          "assignee": "Rocío",
          "done": false,
          "song_id": "c2",
          "origin": "ai"
        },
        {
          "id": "i3",
          "kind": "open_issue",
          "text": "Definir el final de «Puente de sal».",
          "assignee": null,
          "done": false,
          "song_id": "c2",
          "origin": "ai"
        }
      ]
    }
  }
}
session.recap_regenerated
{
  "id": "evt_7c0e1b3f0a8c4a4f9b6f2d4c8e1a9b20",
  "type": "session.recap_regenerated",
  "api_version": "2026-11-01",
  "created_at": "2026-11-03T21:14:05.000Z",
  "organization": {
    "id": "6f1c2a7e-3b4d-4e8f-9a01-2b3c4d5e6f70",
    "name": "Escuela Vértice"
  },
  "data": {
    "session": {
      "id": "0b6c1d2e-7f8a-4b9c-8d0e-1f2a3b4c5d6e",
      "title": "Ensayo del martes",
      "kind": "rehearsal",
      "recorded_at": "2026-11-03T19:30:00.000Z",
      "duration_seconds": 5412,
      "language": "es",
      "band": {
        "id": "9a8b7c6d-5e4f-4a3b-9c2d-1e0f9a8b7c6d",
        "name": "Lumbre"
      },
      "portal_url": "https://platform.zenzey.app/sessions/0b6c1d2e-7f8a-4b9c-8d0e-1f2a3b4c5d6e",
      "public_url": "https://zenzey.app/a/k3v9x2"
    },
    "recap": {
      "version": "2026-11-03T21:14:03.000Z",
      "summary": "Ensayaron dos canciones; el puente de «Luz de paso» quedó a medio tiempo.",
      "songs": [
        {
          "id": "c1",
          "name": "Luz de paso",
          "key": "F#m",
          "takes": 3
        },
        {
          "id": "c2",
          "name": "Puente de sal",
          "key": "D",
          "takes": 2
        }
      ],
      "items": [
        {
          "id": "i1",
          "kind": "decision",
          "text": "El puente de «Luz de paso» va a medio tiempo.",
          "assignee": null,
          "done": false,
          "song_id": "c1",
          "origin": "ai"
        },
        {
          "id": "i2",
          "kind": "task",
          "text": "Pasar la letra corregida del segundo verso.",
          "assignee": "Rocío",
          "done": false,
          "song_id": "c2",
          "origin": "ai"
        },
        {
          "id": "i3",
          "kind": "open_issue",
          "text": "Definir el final de «Puente de sal».",
          "assignee": null,
          "done": false,
          "song_id": "c2",
          "origin": "ai"
        }
      ]
    }
  }
}
task.created
{
  "id": "evt_7c0e1b3f0a8c4a4f9b6f2d4c8e1a9b20",
  "type": "task.created",
  "api_version": "2026-11-01",
  "created_at": "2026-11-03T21:14:05.000Z",
  "organization": {
    "id": "6f1c2a7e-3b4d-4e8f-9a01-2b3c4d5e6f70",
    "name": "Escuela Vértice"
  },
  "data": {
    "session": {
      "id": "0b6c1d2e-7f8a-4b9c-8d0e-1f2a3b4c5d6e",
      "title": "Ensayo del martes",
      "kind": "rehearsal",
      "recorded_at": "2026-11-03T19:30:00.000Z",
      "duration_seconds": 5412,
      "language": "es",
      "band": {
        "id": "9a8b7c6d-5e4f-4a3b-9c2d-1e0f9a8b7c6d",
        "name": "Lumbre"
      },
      "portal_url": "https://platform.zenzey.app/sessions/0b6c1d2e-7f8a-4b9c-8d0e-1f2a3b4c5d6e",
      "public_url": "https://zenzey.app/a/k3v9x2"
    },
    "recap_version": "2026-11-03T21:14:03.000Z",
    "task": {
      "id": "i2",
      "kind": "task",
      "text": "Pasar la letra corregida del segundo verso.",
      "assignee": "Rocío",
      "done": false,
      "song": {
        "id": "c2",
        "name": "Puente de sal"
      },
      "origin": "ai"
    }
  }
}
task.updated
{
  "id": "evt_7c0e1b3f0a8c4a4f9b6f2d4c8e1a9b20",
  "type": "task.updated",
  "api_version": "2026-11-01",
  "created_at": "2026-11-03T21:14:05.000Z",
  "organization": {
    "id": "6f1c2a7e-3b4d-4e8f-9a01-2b3c4d5e6f70",
    "name": "Escuela Vértice"
  },
  "data": {
    "session": {
      "id": "0b6c1d2e-7f8a-4b9c-8d0e-1f2a3b4c5d6e",
      "title": "Ensayo del martes",
      "kind": "rehearsal",
      "recorded_at": "2026-11-03T19:30:00.000Z",
      "duration_seconds": 5412,
      "language": "es",
      "band": {
        "id": "9a8b7c6d-5e4f-4a3b-9c2d-1e0f9a8b7c6d",
        "name": "Lumbre"
      },
      "portal_url": "https://platform.zenzey.app/sessions/0b6c1d2e-7f8a-4b9c-8d0e-1f2a3b4c5d6e",
      "public_url": "https://zenzey.app/a/k3v9x2"
    },
    "recap_version": "2026-11-03T21:14:03.000Z",
    "task": {
      "id": "i2",
      "kind": "task",
      "text": "Pasar la letra corregida del segundo verso.",
      "assignee": "Matías",
      "done": false,
      "song": {
        "id": "c2",
        "name": "Puente de sal"
      },
      "origin": "ai"
    },
    "previous": {
      "assignee": "Rocío"
    }
  }
}
task.completed
{
  "id": "evt_7c0e1b3f0a8c4a4f9b6f2d4c8e1a9b20",
  "type": "task.completed",
  "api_version": "2026-11-01",
  "created_at": "2026-11-03T21:14:05.000Z",
  "organization": {
    "id": "6f1c2a7e-3b4d-4e8f-9a01-2b3c4d5e6f70",
    "name": "Escuela Vértice"
  },
  "data": {
    "session": {
      "id": "0b6c1d2e-7f8a-4b9c-8d0e-1f2a3b4c5d6e",
      "title": "Ensayo del martes",
      "kind": "rehearsal",
      "recorded_at": "2026-11-03T19:30:00.000Z",
      "duration_seconds": 5412,
      "language": "es",
      "band": {
        "id": "9a8b7c6d-5e4f-4a3b-9c2d-1e0f9a8b7c6d",
        "name": "Lumbre"
      },
      "portal_url": "https://platform.zenzey.app/sessions/0b6c1d2e-7f8a-4b9c-8d0e-1f2a3b4c5d6e",
      "public_url": "https://zenzey.app/a/k3v9x2"
    },
    "recap_version": "2026-11-03T21:14:03.000Z",
    "task": {
      "id": "i2",
      "kind": "task",
      "text": "Pasar la letra corregida del segundo verso.",
      "assignee": "Rocío",
      "done": true,
      "song": {
        "id": "c2",
        "name": "Puente de sal"
      },
      "origin": "ai"
    }
  }
}
task.reopened
{
  "id": "evt_7c0e1b3f0a8c4a4f9b6f2d4c8e1a9b20",
  "type": "task.reopened",
  "api_version": "2026-11-01",
  "created_at": "2026-11-03T21:14:05.000Z",
  "organization": {
    "id": "6f1c2a7e-3b4d-4e8f-9a01-2b3c4d5e6f70",
    "name": "Escuela Vértice"
  },
  "data": {
    "session": {
      "id": "0b6c1d2e-7f8a-4b9c-8d0e-1f2a3b4c5d6e",
      "title": "Ensayo del martes",
      "kind": "rehearsal",
      "recorded_at": "2026-11-03T19:30:00.000Z",
      "duration_seconds": 5412,
      "language": "es",
      "band": {
        "id": "9a8b7c6d-5e4f-4a3b-9c2d-1e0f9a8b7c6d",
        "name": "Lumbre"
      },
      "portal_url": "https://platform.zenzey.app/sessions/0b6c1d2e-7f8a-4b9c-8d0e-1f2a3b4c5d6e",
      "public_url": "https://zenzey.app/a/k3v9x2"
    },
    "recap_version": "2026-11-03T21:14:03.000Z",
    "task": {
      "id": "i2",
      "kind": "task",
      "text": "Pasar la letra corregida del segundo verso.",
      "assignee": "Rocío",
      "done": false,
      "song": {
        "id": "c2",
        "name": "Puente de sal"
      },
      "origin": "ai"
    }
  }
}
task.deleted
{
  "id": "evt_7c0e1b3f0a8c4a4f9b6f2d4c8e1a9b20",
  "type": "task.deleted",
  "api_version": "2026-11-01",
  "created_at": "2026-11-03T21:14:05.000Z",
  "organization": {
    "id": "6f1c2a7e-3b4d-4e8f-9a01-2b3c4d5e6f70",
    "name": "Escuela Vértice"
  },
  "data": {
    "session": {
      "id": "0b6c1d2e-7f8a-4b9c-8d0e-1f2a3b4c5d6e",
      "title": "Ensayo del martes",
      "kind": "rehearsal",
      "recorded_at": "2026-11-03T19:30:00.000Z",
      "duration_seconds": 5412,
      "language": "es",
      "band": {
        "id": "9a8b7c6d-5e4f-4a3b-9c2d-1e0f9a8b7c6d",
        "name": "Lumbre"
      },
      "portal_url": "https://platform.zenzey.app/sessions/0b6c1d2e-7f8a-4b9c-8d0e-1f2a3b4c5d6e",
      "public_url": "https://zenzey.app/a/k3v9x2"
    },
    "recap_version": "2026-11-03T21:14:03.000Z",
    "reason": "removed",
    "task": {
      "id": "i2",
      "kind": "task",
      "text": "Pasar la letra corregida del segundo verso.",
      "assignee": "Rocío",
      "done": false,
      "song": {
        "id": "c2",
        "name": "Puente de sal"
      },
      "origin": "ai"
    }
  }
}
usage.threshold_reached
{
  "id": "evt_7c0e1b3f0a8c4a4f9b6f2d4c8e1a9b20",
  "type": "usage.threshold_reached",
  "api_version": "2026-11-01",
  "created_at": "2026-11-03T21:14:05.000Z",
  "organization": {
    "id": "6f1c2a7e-3b4d-4e8f-9a01-2b3c4d5e6f70",
    "name": "Escuela Vértice"
  },
  "data": {
    "period": "2026-11",
    "state": "80_percent",
    "hours_used": 80.5,
    "hours_included": 100,
    "hours_limit": 110
  }
}
webhook.ping
{
  "id": "evt_7c0e1b3f0a8c4a4f9b6f2d4c8e1a9b20",
  "type": "webhook.ping",
  "api_version": "2026-11-01",
  "created_at": "2026-11-03T21:14:05.000Z",
  "organization": {
    "id": "6f1c2a7e-3b4d-4e8f-9a01-2b3c4d5e6f70",
    "name": "Escuela Vértice"
  },
  "data": {
    "message": "Test webhook from Zenzey",
    "endpoint": {
      "id": "b1c2d3e4-f5a6-4b7c-8d9e-0f1a2b3c4d5e",
      "host": "hooks.example.com"
    }
  }
}

En recap.items, kind es decision, task, open_issue (pendiente) o idea. Los ítems con origin: "ai" pueden cambiar de id cuando el acta se vuelve a escribir; los de origin: "person" conservan el suyo. Después de un session.recap_regenerated, reemplaza todos los ítems de esa sesión.

El contenido de las sesiones y la privacidad

Los eventos marcados con contenido llevan lo que el portal muestra cuando alguien abre una sesión: el resumen, las canciones, y el texto de las decisiones y las tareas, que puede nombrar a personas (muchas veces, alumnos). Por eso:

  • Un webhook solo recibe contenido si un coordinador lo autorizó expresamente para ese dominio. Si la URL cambia de dominio, el contenido deja de salir hasta que alguien lo vuelva a autorizar.
  • Cada entrega con contenido queda en el registro de accesos de la institución —el mismo que dice quién abrió qué sesión—, como mucho una vez por webhook, sesión y día.
  • Nunca sale: la transcripción, el audio, las citas textuales, quién grabó una sesión, ids de cuentas o correos, la lista de integrantes de una banda, ni ningún conteo de actividad por persona.
  • Cuando se borra una sesión llega session.deleted: borra lo que hayas guardado de ella. La institución responde por lo que sus sistemas hagan con el contenido que reciben.

Verificar las firmas

Zenzey sigue Standard Webhooks: la firma es un HMAC-SHA256 de ${webhook-id}.${webhook-timestamp}.${cuerpo}, con los bytes de tu secreto como llave (el base64 que va después de whsec_), en base64. Se calcula sobre el cuerpo crudo, antes de interpretarlo. Las bibliotecas oficiales standardwebhooks para Node, Python, Go, Ruby, PHP y otros sirven tal cual. Sin dependencias, en Node:

import { createHmac, timingSafeEqual } from 'node:crypto';

/** true if the request was signed by Zenzey with this secret. */
export function verifyZenzeyWebhook(secret, headers, rawBody) {
  const id = headers['webhook-id'];
  const timestamp = headers['webhook-timestamp'];
  const signatures = headers['webhook-signature'];
  if (!id || !timestamp || !signatures) return false;
  // Reject old or future timestamps (replay protection).
  if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false;

  const key = Buffer.from(secret.replace(/^whsec_/, ''), 'base64');
  const expected = createHmac('sha256', key).update(`${id}.${timestamp}.${rawBody}`).digest();

  // During a secret rotation there are two signatures, separated by a space.
  return signatures.split(' ').some((part) => {
    const [version, value] = part.split(',');
    if (version !== 'v1' || !value) return false;
    const received = Buffer.from(value, 'base64');
    return received.length === expected.length && timingSafeEqual(received, expected);
  });
}

Con Express:

import express from 'express';
import { verifyZenzeyWebhook } from './verify.js';

const app = express();

// The signature covers the RAW body: read it as text, parse it after verifying.
app.post('/zenzey', express.text({ type: 'application/json' }), (req, res) => {
  if (!verifyZenzeyWebhook(process.env.ZENZEY_WEBHOOK_SECRET, req.headers, req.body)) {
    return res.status(401).end();
  }
  const event = JSON.parse(req.body);
  res.status(204).end();           // answer first (within 10 seconds)…
  queueForProcessing(event);       // …and do the work afterwards.
});

En Python:

import base64, hashlib, hmac, time

def verify_zenzey_webhook(secret: str, headers: dict, raw_body: bytes) -> bool:
    msg_id = headers.get("webhook-id")
    timestamp = headers.get("webhook-timestamp")
    signatures = headers.get("webhook-signature", "")
    if not msg_id or not timestamp or abs(time.time() - int(timestamp)) > 300:
        return False
    key = base64.b64decode(secret.removeprefix("whsec_"))
    signed = f"{msg_id}.{timestamp}.".encode() + raw_body
    expected = base64.b64encode(hmac.new(key, signed, hashlib.sha256).digest()).decode()
    return any(
        part.startswith("v1,") and hmac.compare_digest(part[3:], expected)
        for part in signatures.split(" ")
    )

Rotar el secreto. Desde la página del webhook se puede rotar dejando el anterior válido 24 horas (mientras tanto las entregas llevan las dos firmas, para cambiarlo sin perder nada) o revocarlo al instante si se filtró.

Reintentos y fallos

  • Una entrega es buena cuando tu destino contesta 2xx antes de 10 segundos. Las redirecciones no se siguen.
  • Si no, se reintenta después de 1 min, 5 min, 30 min, 2 h, 6 h, 12 h, 24 h y 24 h, aproximadamente: 9 intentos en casi tres días. Una cabecera Retry-After se respeta hasta seis horas.
  • Contesta 410 Gone para decirnos que el destino ya no existe: el webhook se desactiva en el acto y los coordinadores reciben un correo.
  • Un webhook que pasa cinco días fallando sin una sola entrega buena se desactiva solo, y los coordinadores reciben un correo.
  • Cualquier entrega se puede reenviar a mano desde el registro durante 30 días.

La entrega es al menos una vez: el mismo evento puede llegar dos veces, siempre con el mismo webhook-id. No hay orden garantizado: dos eventos de la misma sesión pueden llegar al revés. Los eventos con contenido llevan el estado completo (y recap.version / recap_version), así que gana el más nuevo.

Requisitos del destino y límites

  • HTTPS en el puerto 443, con un nombre de dominio que resuelva a direcciones públicas. Se rechazan las redes privadas, las direcciones IP y los dominios de Zenzey.
  • Hasta 10 webhooks por institución, cada uno con una lista explícita de eventos.
  • Los cuerpos pesan como mucho 256 KB; un acta muy larga se recorta y lleva "truncated": true.
  • Una prueba cada 10 segundos por webhook.
  • No publicamos una lista de direcciones IP: verifica la firma, que prueba el origen mejor que una IP.

Versiones

Cada evento lleva su api_version (hoy 2026-11-01). Pueden aparecer campos y tipos de evento nuevos sin cambiar de versión, así que ignora lo que no conozcas. Un cambio que pueda romper a un receptor llega con versión nueva y con aviso previo.

Cambios

  • 2026-11-01 — Primera versión: sesiones, actas, tareas y la bolsa de horas.

¿Dudas o algo que falte? info@dustkey.com.

Privacidad · Términos · © Zenzey