Skip to main content
Every Terminal49 webhook delivery is a JSON:API document with a webhook_notification primary resource and related records in included. Use this page as the payload reference. Use Payload Examples when you need complete sample JSON.

One notification per container

Container-scoped events fire once per container, not once per shipment or once per vessel move. If ten containers on the same vessel are discharged, you receive ten separate container.transport.vessel_discharged notifications β€” one for each container. Each payload references a single container through its reference_object and (when included) the container resource in included. Use data.id on the notification as the idempotency key when deduplicating retries, and the container id or number to route each notification to the right record on your side.

Notification envelope

Top-level fields

Reference object types

Included resources

Webhook payloads may include: Other resource types β€” such as vessel, rail_terminal, and metro_area β€” can appear for specific events. The webhook endpoint that received the delivery is referenced through the webhook relationship on the notification, not serialized in included. Do not require every resource to be present. Carrier, terminal, and event data can arrive at different times.

Events with a minimal included array

A few events ship with only the reference object in included (or with an empty included array). The shipment and container records are not embedded in the payload:
  • container.transport.available
  • container.transport.not_available
  • container.transport.estimated.vessel_departed
  • container.transport.estimated.vessel_arrived
  • container.transport.estimated.arrived_at_inland_destination
  • container.pickup_appointment.changed
To resolve the container number or bill of lading number for these events, follow the reference_object relationship and fetch the related transport event, container, or shipment through the API β€” for example, Get a container using the container ID from the transport event’s relationships, or Get a shipment using the shipment ID.

Extracting common fields from included

For events that do include the related records, the fields most integrations pull are consistent across events:
ETA fields (pod_eta_at, pod_original_eta_at, destination_eta_at) and identifiers like bill_of_lading_number live on the shipment, not the container. If you only see container fields in a payload, look for the object with type: "shipment" in included. For a full mapping, see Which object holds which field?.

Container update changesets

For container.updated events, the event resource includes a changeset object. Each key is a changed field. The value is a two-item array: [previous_value, current_value].
Common changed fields include:
  • fees_at_pod_terminal
  • holds_at_pod_terminal
  • pickup_lfd
  • pickup_lfd_line
  • pickup_lfd_rail
  • pickup_appointment_at
  • available_for_pickup
  • pod_terminal
The event’s timestamp attribute tells you when Terminal49 picked up the changes from the terminal. For pod_terminal, the changeset values are terminal record IDs, not names:
Resolve the IDs through the terminal resources serialized in included.
The container_updated_event also has a terminal relationship that indicates where the data came from. Currently this is always the POD terminal; in the future it may be the final destination terminal or an off-dock location.