📡 Webhooks
Cada vez que se abre un incidente o se le agrega una actualización, Talo envía un POST con JSON a la URL de cada suscripción de webhook confirmada.
A diferencia de los webhooks de pagos, el payload es completo: incluye el
incidente con todo su historial de actualizaciones. No necesitás hacer un
GET adicional.
Para crear la suscripción, ingresá tu URL en status.talo.com.ar o usá POST /health/status-page/subscriptions.
Eventos
| Evento | Cuándo se envía |
|---|---|
subscription.confirmed | Una sola vez, al crear la suscripción. Sirve para validar tu endpoint |
incident.created | Se abre un incidente nuevo |
incident.updated | Se agrega una actualización a un incidente, incluida la resolución (resolved) |
Payloads
Suscripción confirmada
{
"event": "subscription.confirmed",
// Link privado para cancelar la suscripción → guardalo, no se vuelve a enviar
"unsubscribe_url": "https://status.talo.com.ar/subscriptions/unsubscribe?id=sub_...&token=...",
"page": {
"url": "https://status.talo.com.ar",
"generated_at": "2026-07-31T15:00:00.000Z"
}
}Incidente creado o actualizado
{
// "incident.created" o "incident.updated"
"event": "incident.updated",
"page": {
"url": "https://status.talo.com.ar",
"generated_at": "2026-07-31T16:10:00.000Z" // Momento del envío
},
"incident": {
"id": "inc_1753974245000_ab12cd34",
"title": "Demoras en acreditaciones",
"status": "resolved",
"impact": "major",
"affected_component_ids": ["banking-provider-webhooks"],
"affected_components": [
{ "id": "banking-provider-webhooks", "name": "Acreditaciones" }
],
// Historial completo: la última actualización es la novedad que disparó el evento
"updates": [
{
"id": "6a3f0b9e-2c41-4d1a-9f0e-0c6c1f8e2b11",
"status": "investigating",
"message": "Estamos investigando demoras en las acreditaciones.",
"creation_timestamp": "2026-07-31T15:04:05.000Z"
},
{
"id": "c9e1a7f3-5b2d-4e60-8d4a-7f3b2c1e0d33",
"status": "resolved",
"message": "Las acreditaciones volvieron a la normalidad.",
"creation_timestamp": "2026-07-31T16:10:00.000Z"
}
],
"started_timestamp": "2026-07-31T15:04:05.000Z",
"resolved_timestamp": "2026-07-31T16:10:00.000Z" // Sólo cuando está resuelto
}
}Campos del payload
| Campo | Tipo | Descripción |
|---|---|---|
event | string | Tipo de evento |
page.url | string | URL de la página de estado |
page.generated_at | string | Momento del envío (ISO 8601) |
incident.id | string | Identificador del incidente |
incident.title | string | Título |
incident.status | string | investigating, identified, monitoring o resolved |
incident.impact | string | minor, major o critical |
incident.affected_component_ids | string[] | id de los componentes afectados |
incident.affected_components | object[] | id y name de los componentes afectados |
incident.updates | object[] | Historial de actualizaciones, de la más antigua a la más reciente |
incident.started_timestamp | string | Inicio del incidente (ISO 8601) |
incident.resolved_timestamp | string | Fin del incidente (ISO 8601). Sólo presente cuando status es resolved |
Los valores de
statuseimpactse describen en la introducción.
Entrega
| Regla | Detalle |
|---|---|
| Protocolo | Sólo URLs https://, sin usuario ni contraseña en la URL |
| Destino | El host debe resolver únicamente a direcciones IP públicas. No se aceptan IPs privadas ni reservadas |
| Headers | Content-Type: application/json |
| Timeout | 5 segundos |
| Respuesta esperada | Cualquier 2xx. Otro código, incluidas las redirecciones 3xx, cuenta como entrega fallida |
| Reintentos | No hay. Cada evento se envía una sola vez (mejor esfuerzo) |
Si tu endpoint falla durante el POST de prueba, la suscripción igual queda
creada y confirmada, pero vas a perder el unsubscribe_url. Verificá que tu
endpoint responda 2xx antes de suscribirte.
Manejo recomendado
- Responder rápido
200 OK— el timeout es de 5 segundos. - Usá
incident.idpara agrupar eventos y la última entrada deincident.updatespara mostrar la novedad. - Filtrá por
incident.affected_component_idssi sólo te interesan algunos componentes (ej.talo-api,talo-checkout). - Como no hay reintentos, si necesitás el estado completo consultá
GET /admin/status-page/public.
Ejemplo de handler
app.post("/webhooks/talo-status", (req, res) => {
const event = req.body
if (event.event === "subscription.confirmed") {
// Guardá event.unsubscribe_url en un lugar seguro
} else {
const latest = event.incident.updates.at(-1)
// Notificá a tu equipo con event.incident.title y latest.message
}
res.sendStatus(200)
})Seguridad
- Los webhooks de estado no incluyen firma. Usá una URL difícil de adivinar (por ejemplo, con un secreto en el path) y tratá el contenido como información pública.
- Para validar un evento, compará el
incident.idconGET /admin/status-page/public.
Last updated on