> ## Documentation Index
> Fetch the complete documentation index at: https://terminal49-mintlify-seo-audit-2026-10-05.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Webhook event catalog

> Browse every Terminal49 webhook event by category — tracking request status changes, transport milestones, container updates, ETA changes, and more.

Terminal49 sends webhook notifications for over 30 events across the container lifecycle. Each event represents a specific change to a tracking request, shipment, or container.

Subscribe to individual events when [creating a webhook](/api-docs/in-depth-guides/webhooks), or subscribe to all events and filter in your handler.

Use [List Webhook Events](/api-docs/api-reference/webhooks/list-webhook-events) to fetch the event categories available to your account. Some events depend on account features.

## Tracking request events

These events fire when a tracking request changes status.

| Event | Description |
| - | - |
| `tracking_request.succeeded` | Shipment created and linked to the tracking request. Your tracking is active. |
| `tracking_request.failed` | The tracking request failed. The carrier could not find the shipment. |
| `tracking_request.awaiting_manifest` | The carrier has not yet manifested this shipment. Terminal49 will retry automatically. |
| `tracking_request.tracking_stopped` | Terminal49 is no longer updating this tracking request (shipment delivered or manually stopped). |

## Transport milestone events

These events map to physical milestones in a container's journey. They fire in roughly chronological order as a container moves from origin to destination.

### Origin

| Event | Description |
| - | - |
| `container.transport.empty_out` | Empty container picked up at port of lading. |
| `container.transport.full_in` | Full container returned to port of lading. |
| `container.transport.vessel_loaded` | Container loaded onto the vessel at port of lading. |
| `container.transport.vessel_departed` | Vessel departed the port of lading. |

### Transshipment

| Event | Description |
| - | - |
| `container.transport.transshipment_arrived` | Container arrived at a transshipment port. |
| `container.transport.transshipment_discharged` | Container discharged at the transshipment port. |
| `container.transport.transshipment_loaded` | Container loaded onto a new vessel at the transshipment port. |
| `container.transport.transshipment_departed` | Vessel departed the transshipment port. |

### Feeder vessel

| Event | Description |
| - | - |
| `container.transport.feeder_arrived` | Container arrived on a feeder vessel or barge. |
| `container.transport.feeder_discharged` | Container discharged from the feeder vessel or barge. |
| `container.transport.feeder_loaded` | Container loaded onto a feeder vessel or barge. |
| `container.transport.feeder_departed` | Feeder vessel or barge departed. |

### Destination

| Event | Description |
| - | - |
| `container.transport.vessel_arrived` | Vessel arrived at the port of discharge. |
| `container.transport.vessel_berthed` | Vessel berthed at the port of discharge. |
| `container.transport.vessel_discharged` | Container discharged from the vessel at the port of discharge. |
| `container.transport.available` | Container is available for pickup at the destination. |
| `container.transport.not_available` | Container is no longer available for pickup at the destination. |
| `container.transport.full_out` | Container picked up (gated out) at the port of discharge. |
| `container.transport.delivered` | Container was manually marked as delivered. |
| `container.transport.empty_in` | Empty container returned at the destination. |

### Rail (inland moves)

| Event | Description |
| - | - |
| `container.transport.rail_loaded` | Container loaded onto a rail car. |
| `container.transport.rail_departed` | Rail car departed. |
| `container.transport.rail_arrived` | Rail car arrived. |
| `container.transport.rail_unloaded` | Container unloaded from the rail car. |
| `container.transport.arrived_at_inland_destination` | Container arrived at the final inland destination. Fires only for shipments with an inland rail leg. See the [Rail integration guide](/api-docs/in-depth-guides/rail-integration-guide). |

## Estimated events

These events fire when an estimated departure or arrival time changes.

| Event | Description |
| - | - |
| `container.transport.estimated.vessel_departed` | ETA changed for vessel departure at the port of lading. |
| `shipment.estimated.arrival` | ETA changed for the port of discharge (shipment level). |
| `container.transport.estimated.vessel_arrived` | ETA changed for vessel arrival at the port of discharge (container level). |
| `container.transport.estimated.arrived_at_inland_destination` | ETA changed for the inland destination. Fires only for shipments with an inland rail leg. See the [Rail integration guide](/api-docs/in-depth-guides/rail-integration-guide). |

<Note>
  These are the only estimated event types. There are no estimated equivalents for feeder, rail, or transshipment events. If you need estimated timestamps for those milestones, use the deprecated [raw events endpoint](/api-docs/api-reference/containers/get-a-containers-raw-events), which flags estimates with an `attributes.estimated` boolean on any event type.
</Note>

## Container update events

These events fire when container attributes change.

| Event | Description |
| - | - |
| `container.created` | A new container was added to a shipment. Common for bookings where containers are assigned after sailing. |
| `container.updated` | Container attributes changed at the terminal — fees, holds, LFD, pickup appointment, availability, or POD terminal. The payload includes a `changeset` of the updated fields. |
| `container.pod_terminal_changed` | The port of discharge terminal assignment changed for the container. |
| `container.pickup_lfd.changed` | The coalesced `pickup_lfd` attribute changed. It follows a fixed source priority: `pickup_lfd_line`, then `pickup_lfd_terminal`, then `pickup_lfd_rail`. It does not pick the earliest date — see [LFD & Availability Alerts](/api-docs/webhooks/use-cases/lfd-alerts#how-pickup_lfd-is-chosen). |
| `container.pickup_lfd_line.changed` | The shipping line's Last Free Day (`import_deadlines.pickup_lfd_line`) changed. |
| `container.pickup_lfd_terminal.changed` | The terminal-reported Last Free Day (`import_deadlines.pickup_lfd_terminal`) at the destination terminal changed. |
| `container.pickup_lfd_rail.changed` | The rail-carrier-reported Last Free Day (`import_deadlines.pickup_lfd_rail`) at the inland rail destination changed. Rail Plan only — see [Entitlements](/api-docs/useful-info/entitlements). |
| `container.pickup_appointment.changed` | The pickup appointment changed. |

<Note>
  There are no field-specific events for holds, fees, or availability, such as `container.holds_at_pod_terminal.changed`. Changes to `holds_at_pod_terminal`, `fees_at_pod_terminal`, and `available_for_pickup` are delivered through `container.updated`. Read the `changeset` in the payload to detect which fields changed. See [Container Holds, Fees, and Release Readiness](/api-docs/in-depth-guides/holds-and-fees).
</Note>

## Changes that do not fire webhooks

Some updates you can make through the API do not have a corresponding webhook event. Poll the affected resource or reconcile in your handler when you need to react to them.

| Change | How to observe |
| - | - |
| Editing a tracking request's `ref_numbers` (reference numbers) through [Edit a tracking request](/api-docs/api-reference/tracking-requests/edit-a-tracking-request) | Fetch the tracking request with [Get a tracking request](/api-docs/api-reference/tracking-requests/get-a-single-tracking-request) or search with the `q` query parameter on [List tracking requests](/api-docs/api-reference/tracking-requests/list-tracking-requests). |
| Creating, updating, or deleting custom field values on tracking requests, shipments, or containers | Read them back with [List tracking request custom fields](/api-docs/api-reference/tracking-requests/list-tracking-request-custom-fields), [List shipment custom fields](/api-docs/api-reference/shipments/list-shipment-custom-fields), or [List container custom fields](/api-docs/api-reference/containers/list-container-custom-fields). |

Custom field values are also not embedded in webhook notification payloads. The `included` array carries the shipment, container, tracking request, and transport event records described in [Webhook Payloads](/api-docs/webhooks/payloads), but not their custom fields — fetch custom fields separately when you need them in your handler.

## Document processing events

These events fire when document extraction completes for accounts using document processing.

| Event | Description |
| - | - |
| `document.extracted` | Document classification and extraction completed successfully. |
| `document.extraction_failed` | Document extraction did not complete successfully. |

See [Document Processing Workflows](/api-docs/in-depth-guides/document-processing-workflows) for payload structure and related document resources.

## Payload structure

Every webhook notification follows the same structure: a `data` object containing the event metadata, and an `included` array with the related shipment, container, and event objects.

See [Webhook Payloads](/api-docs/webhooks/payloads) for the common envelope and included-resource patterns. See [Payload Examples](/api-docs/useful-info/webhook-events-examples) for complete JSON samples.

## Related

* [Setting up webhooks](/api-docs/in-depth-guides/webhooks) — create and configure webhook endpoints
* [Webhook Payloads](/api-docs/webhooks/payloads) — notification envelope and included resources
* [Best practices](/api-docs/webhooks/best-practices) — retry handling, idempotency, and reliability
* [Webhook API Reference](/api-docs/api-reference/webhooks/create-a-webhook) — programmatic webhook management


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.