Obtener sus datos

Webhooks

Haga que Trackberry llame a su sistema cuando un envío cambie de estado o de ETA, terminen sus verificaciones de calidad o se abra una alerta.

5 min de lectura

Publicado

Objetivo

Enterarse de lo que ocurre con un envío, en lugar de consultar la API cada pocos minutos. Trackberry envía una solicitud HTTPS firmada a una URL que usted elige, con el envío tal como queda justo después del cambio.

Los webhooks los administran los administradores y propietarios, en todos los planes, en Configuración → Tokens de API → Webhooks. Una organización puede tener hasta cinco endpoints.

Agregar un endpoint

  1. Abra Configuración → Tokens de API y elija Administrar webhooks.
  2. Elija Agregar endpoint, escriba la URL, una descripción opcional y marque los eventos que desea. Se requiere al menos uno.
  3. Abra el endpoint y muestre su secreto de firma. Guárdelo en un lugar seguro: su servidor lo usa para comprobar que una solicitud realmente proviene de Trackberry.
  4. Elija Enviar evento de prueba y compruebe que su servidor lo recibió.

Eventos

Evento Se envía cuando previous_attributes
shipment.status_changed Un envío pasa a un nuevo estado. Si se guardan varios cambios juntos, recibe un solo evento, del primer estado al último status
shipment.eta_changed Cambia el campo eta del envío: la ETA que dan el transportista o los documentos. Los cambios en effective_eta y predicted_eta aún no envían un evento eta
shipment.checks_completed Termina una ejecución de las verificaciones de calidad, después de cualquier validación automática ninguno
alert.created Se abre una nueva alerta en un envío ninguno
webhook.test Usted elige Enviar evento de prueba; nunca se envía de otra forma ninguno

Las alertas son las que devuelve GET /api/v1/alerts. Un envío que aún espera aprobación, o uno que se identificó como de otra persona, no envía nada.

Cómo es una solicitud

El cuerpo es JSON, con la forma del sobre de Standard Webhooks:

json
{
  "id": "evt_9f2c4e1b7a6d4c0f8e3b5a1d2c7e6f90",
  "type": "shipment.status_changed",
  "created_at": "2026-10-12T09:30:00Z",
  "api_version": "2026-10-01",
  "data": {
    "object": { "object": "shipment", "id": "shp_...", "status": "in_transit" },
    "previous_attributes": { "status": "validated" }
  }
}
  • data.object es exactamente lo que devuelve GET /api/v1/shipments/:id (o lo que devuelve GET /api/v1/alerts para alert.created), en la versión de la API a la que está fijada su organización. api_version indica cuál.
  • shipment.checks_completed agrega data.checks: un summary con el número de verificaciones por estado y results, una lista de { check_type, key, status }.
  • id identifica el evento. Es el mismo para todos los endpoints, y el mismo en un reintento o un reenvío, así que úselo para ignorar duplicados.
  • Los eventos pueden llegar más de una vez y fuera de orden. Compare marcas de tiempo como updated_at antes de sobrescribir datos más recientes.

Cada solicitud lleva estos encabezados:

Encabezado Valor
webhook-id El id del evento
webhook-timestamp Hora Unix en segundos, de este intento
webhook-signature v1, seguido de una firma HMAC-SHA256 en base64
Content-Type application/json
User-Agent Trackberry-Webhooks/1.0

Verificar la firma

Verifique siempre antes de confiar en una solicitud. La firma es un HMAC-SHA256 de webhook-id.webhook-timestamp.cuerpo, con su secreto (decodificado de base64 y sin el prefijo whsec_). Las bibliotecas oficiales de Standard Webhooks lo hacen por usted y además rechazan marcas de tiempo antiguas.

Ruby, con la gema standardwebhooks:

ruby
require "standardwebhooks"

def receive(request)
  payload = request.body.read   # el cuerpo sin procesar, no el JSON ya interpretado
  headers = request.headers.to_h.slice("webhook-id", "webhook-timestamp", "webhook-signature")
  event = StandardWebhooks::Webhook.new(ENV.fetch("TRACKBERRY_WEBHOOK_SECRET")).verify(payload, headers)
  # event es el JSON interpretado; lanza StandardWebhooks::WebhookVerificationError si no es válido
end

Node, con el paquete standardwebhooks:

js
import { Webhook } from "standardwebhooks"

app.post("/webhooks/trackberry", express.raw({ type: "application/json" }), (req, res) => {
  try {
    const event = new Webhook(process.env.TRACKBERRY_WEBHOOK_SECRET).verify(req.body, req.headers)
    // procese event.type
    res.sendStatus(204)
  } catch (err) {
    res.sendStatus(400)
  }
})

Use el cuerpo sin procesar. Un cuerpo que se interpretó y se volvió a serializar ya no coincide con la firma.

Entrega y reintentos

Responda con cualquier código 2xx en menos de 10 segundos (dejamos de esperar a los 15 segundos en total). Cualquier otra cosa cuenta como fallo: otro código, un tiempo de espera agotado, un error de conexión y una redirección (nunca seguimos redirecciones, así que indique la URL final). Trackberry lee y conserva solo los primeros 2 KB de su respuesta y los muestra en la página del endpoint.

Una entrega fallida se reintenta hasta 8 veces en total: de inmediato y luego después de 1 minuto, 5 minutos, 30 minutos, 2 horas, 5 horas, 10 horas y 10 horas, aproximadamente un día en total. Cada intento queda registrado en la página del endpoint durante 30 días, y Reenviar envía el mismo evento de nuevo con una marca de tiempo nueva.

Si las entregas a un endpoint siguen fallando durante más de 3 días, Trackberry lo desactiva, descarta las entregas que seguían en espera y envía un correo a los administradores de su organización. La cuenta solo avanza mientras sigan llegando fallos: un éxito, o un día sin ninguna entrega fallida, la reinicia. Cuando corrija su servidor, abra el endpoint y elija Reactivar endpoint.

Enviar evento de prueba envía el evento una sola vez y nunca lo reintenta. Una prueba fallida no cuenta para desactivar el endpoint. Una entrega que se perdió de nuestro lado, por ejemplo durante un despliegue, se recupera y se envía de nuevo en menos de una hora.

Seguridad y red

  • Los endpoints deben usar HTTPS y ser accesibles desde internet público. Rechazamos las URL cuyo host se resuelve a una dirección privada, de loopback, de enlace local, compartida o reservada, IPv6 incluido, tanto al guardar el endpoint como antes de cada entrega. También rechazamos trackberry.com y sus subdominios.
  • Nos conectamos a la dirección que verificamos, así que un cambio de DNS entre la verificación y la conexión no puede enviar una solicitud a otro lugar.
  • No publicamos direcciones IP de origen fijas, así que no dependa de una lista de IP permitidas. La firma es lo que le indica que una solicitud es nuestra.
  • Para reemplazar un secreto filtrado, elija Renovar secreto. El anterior deja de funcionar de inmediato (no hay periodo de solapamiento), así que actualice su servidor al mismo tiempo.

Solución de problemas

Qué ve Qué hacer
“debe apuntar a una dirección pública” al guardar El host se resuelve a una dirección privada o interna. Use una URL pública, por ejemplo mediante un túnel durante las pruebas
Las entregas muestran que no se siguen redirecciones Su servidor responde con un 3xx. Use la URL final
Las entregas muestran un tiempo de espera agotado Responda primero y haga el trabajo después. Tiene 10 segundos
La firma nunca se verifica Compruebe que pasa el cuerpo sin procesar y el secreto del endpoint correcto, y que el reloj de su servidor es correcto
El endpoint aparece desactivado Falló durante más de 3 días. Corrija el servidor y luego reactívelo
Etiquetas: webhooks api integración automatización