For the complete documentation index, see llms.txt. This page is also available as Markdown.

Shipment

Sample payloads for every shipment webhook event.

Shipment webhooks come in three shapes. Which one you get depends on the event.

Events
Payload

shipment.updated, shipment.in-transit, shipment.delivered, shipment.cancelled, shipment.returned, shipment.awaiting-clearance, shipment.pending-cancellation

A lean tracking snapshot.

shipment.created

A fuller shipment object.

shipment.customs_event

A small customs-delay object.

Status events

These carry a tracking snapshot, not the whole shipment. Addresses and the parcel appear as ids, not embedded objects — call Get Shipment if you need the full record.

All seven status events share this shape; only status, sub_statuses, events and the delivery_* flags differ.

shipment.delivered

{
    "event": "shipment.delivered",
    "data": {
        "shipment_id": "SH-40208776515",
        "user": "USER-27450202164",
        "status": "delivered",
        "sub_statuses": [],
        "rate": "RT-64093387231",
        "carrier": "CA-85479996273",
        "tracking_number": "7412089553",
        "events": [
            {
                "status": "confirmed",
                "description": "Shipment arranged successfully by User.",
                "location": "Lagos, NG",
                "created_at": "2026-09-15T09:02:11.903Z"
            },
            {
                "status": "in-transit",
                "description": "Shipment picked up by carrier.",
                "location": "Lagos, NG",
                "created_at": "2026-09-15T14:38:40.512Z"
            },
            {
                "status": "delivered",
                "description": "Delivered - Signed for by: A. OBI",
                "location": "London, GB",
                "created_at": "2026-09-18T11:20:07.884Z"
            }
        ],
        "extras": {
            "tracking_number": "7412089553",
            "tracking_url": "https://track.terminal.africa/SH-40208776515",
            "carrier_tracking_url": "https://www.dhl.com/ng-en/home/tracking.html?tracking-id=7412089553",
            "shipping_label_url": "https://assets.terminal.africa/labels/SH-40208776515.pdf",
            "proof_of_delivery": {
                "url": "https://assets.terminal.africa/pod/SH-40208776515.pdf",
                "type": "signature",
                "signed_by": "A. OBI",
                "fetched_at": "2026-09-18T11:34:52.006Z"
            }
        },
        "metadata": {
            "order_id": "ORD-10023"
        },
        "address_to": "AD-00632494668",
        "address_from": "AD-00632494667",
        "parcel": "PC-09857312356",
        "pickup_date": "2026-09-15T14:00:00.000Z",
        "delivery_date": "2026-09-18T11:20:07.884Z",
        "delivery_arranged": true,
        "delivery_picked_up": true,
        "delivery_delivered": true,
        "created_at": "2026-09-15T09:02:11.903Z",
        "updated_at": "2026-09-18T11:20:07.884Z"
    }
}

shipment.in-transit

Fires once, the first time a shipment moves.

shipment.awaiting-clearance

The shipment is held at customs. awaiting-clearance also appears in sub_statuses while the main status stays in-transit.

shipment.returned

shipment.pending-cancellation

Cancellation has been requested but the carrier has not confirmed it.

shipment.cancelled

shipment.updated

Fires on any other change to an active shipment. Same shape; read events for what changed.

shipment.created

Carries a fuller shipment object than the status events — close to what Get Shipment returns.

These are always stripped out and will never appear:

  • extras.shipping_label and extras.aws_shipping_label_url (label bytes and internal storage keys)

  • metadata.shipment_payload, metadata.carrier_shipment, metadata.selected_rate (carrier blobs)

  • legs

shipment.customs_event

Fires when a customs delay is detected, and again when it is resolved. Read status to tell them apart — the event type is the same both times.

Detected

Resolved

Was this helpful?