Skip to Content
Estado del servicioWebhooks de estado

📡 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

EventoCuándo se envía
subscription.confirmedUna sola vez, al crear la suscripción. Sirve para validar tu endpoint
incident.createdSe abre un incidente nuevo
incident.updatedSe 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

CampoTipoDescripción
eventstringTipo de evento
page.urlstringURL de la página de estado
page.generated_atstringMomento del envío (ISO 8601)
incident.idstringIdentificador del incidente
incident.titlestringTítulo
incident.statusstringinvestigating, identified, monitoring o resolved
incident.impactstringminor, major o critical
incident.affected_component_idsstring[]id de los componentes afectados
incident.affected_componentsobject[]id y name de los componentes afectados
incident.updatesobject[]Historial de actualizaciones, de la más antigua a la más reciente
incident.started_timestampstringInicio del incidente (ISO 8601)
incident.resolved_timestampstringFin del incidente (ISO 8601). Sólo presente cuando status es resolved

Los valores de status e impact se describen en la introducción.


Entrega

ReglaDetalle
ProtocoloSólo URLs https://, sin usuario ni contraseña en la URL
DestinoEl host debe resolver únicamente a direcciones IP públicas. No se aceptan IPs privadas ni reservadas
HeadersContent-Type: application/json
Timeout5 segundos
Respuesta esperadaCualquier 2xx. Otro código, incluidas las redirecciones 3xx, cuenta como entrega fallida
ReintentosNo 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

  1. Responder rápido 200 OK — el timeout es de 5 segundos.
  2. Usá incident.id para agrupar eventos y la última entrada de incident.updates para mostrar la novedad.
  3. Filtrá por incident.affected_component_ids si sólo te interesan algunos componentes (ej. talo-api, talo-checkout).
  4. 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.id con GET /admin/status-page/public.
Last updated on