Inspector Toolbelt Help Center
Referencia

Eventos de Webhook

Cada evento de webhook, cuándo se dispara y el payload exacto que envía.

Para usuarios avanzados

Esta página es una referencia técnica para desarrolladores que integran con los webhooks de ITB. Si solo quieres configurar un endpoint de webhook, empieza con la guía de Webhooks.

El sobre del evento

Cada entrega de webhook es un POST HTTP con un cuerpo JSON. Todos los eventos comparten el mismo sobre de nivel superior:

CampoTipoDescripción
idstringID único del evento, con el prefijo evt_ (32 caracteres hexadecimales). Úsalo como clave de idempotencia — el mismo evento puede entregarse más de una vez
typestringEl nombre del evento, p. ej. order.approved
apiVersionstringVersión del payload basada en fecha. Actualmente 2026-07-01
createdAtstringCuándo ocurrió el evento (ISO 8601)
account.uidstringEl ID de la cuenta (propietario) a la que pertenece el evento
account.companyNamestringEl nombre de tu empresa, si está configurado
dataobjectInstantánea del recurso sobre el que trata el evento (ver las secciones por evento abajo)
changesobjectSolo en algunos eventos — instantáneas previous y current de los campos que cambiaron
{
  "id": "evt_9f2c4b7a1d3e5f60718293a4b5c6d7e8",   // idempotency key
  "type": "order.approved",                        // event name
  "apiVersion": "2026-07-01",
  "createdAt": "2026-07-28T14:30:00.000Z",
  "account": {
    "uid": "abc123",
    "companyName": "Acme Home Services"
  },
  "data": { /* resource snapshot — see below */ },
  "changes": {                                     // only on *.approved, *.completed,
    "previous": { "status": "new" },               // *.status_changed, *.rescheduled
    "current": { "status": "approved" }
  }
}

Cada entrega también lleva el nombre del evento en el encabezado de solicitud webhook-event, junto con los encabezados de firma (webhook-id, webhook-timestamp, webhook-signature) descritos en la guía de Webhooks.

Índice de eventos

EventoSe dispara cuandoCampo changes
order.createdSe crea una nueva Order — desde el panel, la aplicación móvil o la página de programación en línea
order.approvedEl estado de una Order pasa a Approved (incluida una creada ya como aprobada)status
order.completedEl estado de una Order pasa a Completestatus
order.rescheduledLa fecha/hora de la cita cambia en una Order ApprovedappointmentDateTime
order.status_changedSe dispara junto con order.approved y order.completed, y también cuando una Order Approved vuelve a un estado anteriorstatus
invoice.paidUna Order se marca como pagada (su indicador paid pasa a true por primera vez)
report.publishedUna Order se vuelve por primera vez tanto pagada como con acuerdo firmado — el momento en que se libera su Report

Los valores de estado en los payloads son los valores almacenados sin procesar (draft, new, read, approved, complete, archived) — consulta Estados de Órdenes.

Los nombres de campo nunca cambian por industria

Los nombres de campo del payload son idénticos en todas las industrias. Por ejemplo, la Inspection Type siempre se envía en un campo llamado inspectionType, sea como sea que tu industria lo llame en pantalla.

Eventos de orden — payload de data

order.created, order.approved, order.completed, order.rescheduled y order.status_changed envían todos la misma instantánea de Order en data:

{
  "id": "req_abc123",                              // order ID
  "status": "approved",                            // see Order Statuses reference
  "appointmentDateTime": "2026-08-01T13:00:00.000Z",
  "inspectionType": "Buyer Inspection",            // your service category name
  "streetAddress": "123 Main St",
  "city": "Springfield",
  "region": "IL",
  "postalCode": "62701",
  "country": "US",
  "timezone": "America/Chicago",
  "contactName": "Jane Buyer",
  "contactEmail": "jane@example.com",
  "contactPhone": "(555) 123-4567",
  "contactType": "client",
  "totalPrice": 450,
  "totalTime": 120,                                // duration in minutes
  "paid": false,
  "agreementSigned": true,
  "assignedInspectors": ["uid1", "uid2"],          // assigned team member IDs
  "requestDateTime": "2026-07-20T09:15:00.000Z",   // when the order was created
  "approvedDateTime": "2026-07-21T10:00:00.000Z",
  "completedDateTime": "2026-08-01T16:30:00.000Z"
}

Los campos de fecha son cadenas ISO 8601. Cualquier campo sin valor se omite del payload en lugar de enviarse como null.

changes por evento de orden

  • order.approvedchanges.previous.status / changes.current.status (current siempre es "approved")
  • order.completedchanges.previous.status / changes.current.status (current siempre es "complete")
  • order.status_changedchanges.previous.status / changes.current.status
  • order.rescheduledchanges.previous.appointmentDateTime / changes.current.appointmentDateTime (cadenas ISO 8601)
  • order.created — sin campo changes

La aprobación dispara dos eventos

Aprobar una Order despacha tanto order.approved como order.status_changed; completarla despacha tanto order.completed como order.status_changed. Suscríbete a uno u otro a menos que quieras ambas entregas.

invoice.paid — payload de data

Se dispara la primera vez que el indicador paid de una Order se vuelve true. El payload de data es la misma instantánea de Order mostrada arriba — no un objeto de factura. No hay campos específicos de factura (sin número de factura, monto pagado o método de pago); usa totalPrice y el indicador paid: true, o consulta los detalles de la factura desde la API. No se envía ningún campo changes.

report.published — payload de data

Se dispara cuando una Order se vuelve por primera vez tanto pagada como con acuerdo firmado — el momento en que su Report publicado se libera al cliente. El payload de data es la instantánea de Order mostrada arriba, más un campo adicional:

{
  "orderId": "req_abc123",   // same as data.id — the order this report belongs to
  "id": "req_abc123",
  "status": "complete"
  // …all other order snapshot fields
}

No se envía ningún campo changes. El payload no incluye URLs de informe.

Eventos a los que puedes suscribirte pero que aún no se disparan

El editor de endpoints también lista order.updated, invoice.created, contact.created y contact.updated. Estos nombres de evento están reservados y se pueden seleccionar, pero ninguna actividad de cuenta actual los produce — los endpoints suscritos solo a estos eventos no recibirán entregas. Si se emiten en el futuro usarán el sobre estándar; sus campos data todavía no están definidos.

Eventos de prueba — webhook.test

Hacer clic en Probar en un endpoint envía un evento webhook.test:

{
  "id": "evt_test_5f0e…",        // prefixed evt_test_
  "type": "webhook.test",
  "apiVersion": "2026-07-01",
  "createdAt": "2026-07-28T14:30:00.000Z",
  "account": { "uid": "abc123" },
  "data": {
    "message": "This is a test webhook event.",
    "timestamp": "2026-07-28T14:30:00.000Z"
  }
}

Los eventos de prueba no están firmados — llevan un encabezado X-Webhook-Test: true en lugar de los encabezados de firma. Tu receptor debería aceptarlos sin verificación de firma (o reconocer el encabezado y omitir la verificación solo para las pruebas).

Responder a las entregas

  • Responde con cualquier estado 2xx dentro de 10 segundos para confirmar una entrega.
  • Las respuestas 5xx y los tiempos de espera se tratan como temporales — la entrega se reintenta.
  • Otras respuestas 4xx se tratan como permanentes — esa entrega no se reintenta.
  • Responder 410 Gone le dice a ITB que deje de enviar: el endpoint se deshabilita de inmediato.

Los límites de endpoint, la deshabilitación automática tras fallos repetidos, el historial de entregas y la verificación de firma se explican en la guía de Webhooks.

Relacionado

On this page