Centro de ayudaGitHub

Webhooks

Recibe notificaciones en tiempo real cuando ocurren eventos en tu cuenta de Atoship. Los webhooks te permiten crear integraciones que reaccionan automáticamente a los eventos de envío.

¿Qué son los webhooks?

Los webhooks son llamadas HTTP que notifican a tu aplicación cuando ocurren eventos en tu cuenta de Atoship. En lugar de consultar nuestra API una y otra vez para ver novedades, los webhooks envían los datos a tu servidor en tiempo real.

Actualizaciones en tiempo real

Recibe una notificación al instante cuando ocurre un evento

Menos llamadas a la API

No necesitas consultar continuamente para ver novedades

Flujos de trabajo automatizados

Activa acciones a partir de los eventos de envío

Guía rápida

1. Crea un endpoint de webhook

curl -X POST https://atoship.com/api/v1/webhooks \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Order Notifications",
    "url": "https://example.com/webhooks/atoship",
    "event_types": ["label.purchased", "tracking.delivered"],
    "retry_attempts": 3,
    "timeout": 30
  }'

2. Respuesta

En la respuesta recibirás un secreto de webhook. Guárdalo de forma segura: lo necesitarás para verificar las firmas de los webhooks.

{
  "id": "whk_abc123def456",
  "name": "Order Notifications",
  "url": "https://example.com/webhooks/atoship",
  "secret": "whsec_a1b2c3d4e5f6...",
  "_warning": "Save this secret securely!"
}
Tipos de eventos

Suscríbete a eventos específicos o usa all para recibir todos los eventos.Ver el detalle de los payloads de eventos →

Eventos de etiquetas

label.createdSe ha creado una nueva etiqueta de envío
label.purchasedSe ha comprado una etiqueta de envío y está lista para usarse
label.voidedUna etiqueta de envío se ha anulado/cancelado
label.refundedSe ha procesado el reembolso de una etiqueta de envío

Eventos de seguimiento

tracking.createdSe ha iniciado el seguimiento de un envío
tracking.updatedSe ha actualizado el estado del seguimiento
tracking.deliveredEl paquete ha sido entregado
tracking.exceptionSe ha producido una incidencia de seguimiento (retraso, devolución, etc.)

Eventos de lotes

batch.createdSe ha creado una nueva operación por lotes
batch.completedUna operación por lotes se ha completado correctamente
batch.failedUna operación por lotes ha fallado

Eventos de formulario SCAN

scan_form.createdSe ha creado un nuevo formulario SCAN
scan_form.updatedSe ha actualizado el estado de un formulario SCAN

Eventos de pago

payment.createdSe ha iniciado un pago/cargo
payment.completedUn pago se ha completado correctamente
payment.failedUn pago ha fallado

Eventos de devolución

return.createdSe ha creado una etiqueta de devolución/RMA
return.receivedSe ha recibido una devolución en el almacén
return.completedUna devolución se ha procesado por completo

Eventos de seguro

insurance.purchasedSe ha contratado un seguro para un envío
insurance.cancelledSe ha cancelado un seguro

Eventos de reclamación

claim.createdSe ha presentado una reclamación de seguro
claim.approvedSe ha aprobado una reclamación de seguro
claim.rejectedSe ha rechazado una reclamación de seguro
Formato del payload del webhook

Todos los payloads de webhook siguen un formato uniforme con el tipo de evento, la marca de tiempo y los datos correspondientes.

{
  "id": "evt_abc123def456",
  "object": "Event",
  "type": "tracking.delivered",
  "created_at": "2025-01-12T14:30:00.000Z",
  "data": {
    "object": {
      "id": "lbl_xyz789",
      "tracking_number": "9400111899223033005436",
      "carrier": "USPS",
      "status": "delivered",
      "status_detail": "Package delivered to recipient",
      "delivered_at": "2025-01-12T14:28:00.000Z",
      "location": {
        "city": "Los Angeles",
        "state": "CA",
        "zip": "90001"
      }
    },
    "previous_attributes": {
      "status": "out_for_delivery"
    }
  }
}

Campos del payload

  • id - Identificador único del evento
  • type - Tipo de evento (p. ej., tracking.delivered)
  • created_at - Cuándo ocurrió el evento
  • data.object - El recurso afectado
  • data.previous_attributes - Campos modificados (si aplica)

Encabezados HTTP

  • X-Atoship-Signature - Firma HMAC
  • X-Atoship-Event - Tipo de evento
  • X-Atoship-Delivery - ID del intento de entrega
  • Content-Type - application/json
Verificar las firmas de los webhooks

Buena práctica de seguridad

Verifica siempre las firmas de los webhooks para asegurarte de que las solicitudes provienen de Atoship y no han sido manipuladas. Nunca proceses webhooks sin verificar la firma en producción.

Cada webhook incluye un encabezado X-Atoship-Signatureque contiene una firma HMAC-SHA256 del payload generada con tu secreto de webhook.

import crypto from 'crypto';

function verifyWebhookSignature(
  payload: string,
  signature: string,
  secret: string
): boolean {
  const expectedSignature = crypto
    .createHmac('sha256', secret)
    .update(payload)
    .digest('hex');

  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expectedSignature)
  );
}

// Usage in your webhook handler
app.post('/webhooks/atoship', (req, res) => {
  const signature = req.headers['x-atoship-signature'];
  const payload = JSON.stringify(req.body);

  if (!verifyWebhookSignature(payload, signature, WEBHOOK_SECRET)) {
    return res.status(401).send('Invalid signature');
  }

  // Process the webhook...
  const event = req.body;
  console.log('Received event:', event.type);

  res.status(200).send('OK');
});
Política de reintentos

Si tu endpoint devuelve un código de estado distinto de 2xx o se agota el tiempo de espera, reintentaremos la entrega del webhook.

Calendario de reintentos

  • • Intento 1: Inmediato
  • • Intento 2: Después de 1 minuto
  • • Intento 3: Después de 5 minutos
  • • Intento 4: Después de 30 minutos
  • • Intento 5: Después de 2 horas

Criterios de éxito

  • • Estado HTTP 200-299
  • • Respuesta dentro del tiempo de espera (30 s por defecto)
  • • Conexión establecida

Opciones configurables

  • retry_attempts - Número de reintentos (0-10, 3 por defecto)
  • timeout - Tiempo de espera de la solicitud en segundos (5-60, 30 por defecto)
Buenas prácticas

  • Devuelve 200 de inmediato y procesa de forma asíncrona
  • Verifica siempre las firmas de los webhooks
  • Gestiona los eventos duplicados de forma idempotente
  • Usa únicamente endpoints HTTPS
  • Registra los payloads de los webhooks para depurar

No

  • No realices procesamiento pesado antes de responder
  • No ignores la verificación de la firma
  • No des por hecho que los eventos llegan en orden
  • No uses endpoints HTTP (no seguros)
  • No expongas tu secreto de webhook
Solución de problemas

Referencia de la API
GET
/v1/webhooks

Lista todos los endpoints de webhook

POST
/v1/webhooks

Crea un nuevo endpoint de webhook

GET
/v1/webhooks/:id

Obtén un endpoint de webhook

PATCH
/v1/webhooks/:id

Actualiza un endpoint de webhook

DELETE
/v1/webhooks/:id

Elimina un endpoint de webhook

POST
/v1/webhooks/:id/test

Envía un webhook de prueba para verificar tu endpoint

atoship © 2026