Skip to content
GETAPI key

Container detail

GETapi.trackingmcp.com/v1/containers/{id}

The full record: status, route, vessel, milestone timeline and the basis for the ETA. This is the widest payload in the API and it carries more keys than the example below, including the per-field provenance envelope. The fields shown are the stable core.

Path parameters

idstringrequired

The container UUID returned by create, list or lookup. Not the container number.

Response schema

418 fields

Derived from the example response, nested as the JSON is.

api_versionstring

The response contract this build answers, as a date. Pin it in your client and nothing in the shape below moves under you.

okboolean

Whether the request succeeded.

dataobject

The payload. Everything an endpoint returns sits under this key.

idstring

Stable identifier for the record. On the tracking endpoints this is the container UUID, except on a portfolio summary row, where it is the container number.

org_idstring

Your organisation. Every keyed read is scoped to it, so this is always your own id: it exists so a record stays self-describing once exported.

container_numberstring

The container number, or null when the record was tracked by a bill of lading or booking that has not yet resolved to a box.

bl_numberstring | null

The bill of lading, or null when the record was not tracked by one.

booking_numberstring | null

The booking reference, or null when the record was not tracked by one.

carrier_codestring

Carrier SCAC.

carrier_namestring

Carrier name.

iso_codestring | null

ISO 6346 size and type code as the carrier filed it, for example 45G1. Null when the carrier stated none.

size_teunumber | null

Size in TEU: 1 for a 20ft box, 2 for a 40ft. Null when the size is unknown.

container_typestring | null

Plain-language equipment type, for example Reefer or Dry. Null when the carrier stated none.

statusstring

Current normalised status of the shipment. Ocean lifecycle order: discharged, available, delivered, returned_empty. Two values end a shipment, delivered and returned_empty, and returned_empty outranks delivered.

origin_unlocodestring

Origin port UN/LOCODE, or null when the carrier named no origin we could resolve.

destination_unlocodestring

Destination port UN/LOCODE, or null when unresolved.

origin_namestring

Origin port name, falling back to its UN/LOCODE.

destination_namestring

Destination port name, falling back to its UN/LOCODE.

etastring

Arrival time (ISO 8601). Null when the carrier publishes none and we cannot predict one.

eta_is_estimatedboolean

True when the ETA is still a forecast, false when it is the actual arrival, null when there is no ETA at all. Never read a date alone as a promise.

eta_confidence_pctnumber

How often this lane arrives on time, as a percentage. Null on a lane too thin to score.

discharge_datetimestring | null

When the box was discharged, which is when free time starts counting. Null when no discharge is on file yet.

free_daysnumber | null

Free days the terms allow at this port. Null when no terms and no published tariff apply.

last_free_daystring | null

The last day free of charge, computed from the discharge and the free days. Null when either is missing.

demurrage_at_riskboolean

True when the free-time clock on this box is a concern.

demurrage_accrued_usdnumber | null

Demurrage charged so far on this box, US dollars. Null when no rate applies, which is not the same as zero owed.

tagsobject[]

Your own labels on this box. Filter the list endpoint with them.

notesstring | null

Your own free-text note on this box. Null when you have written none.

added_atstring

When you started tracking this box (ISO 8601).

last_polled_atstring

When we last asked the carrier (ISO 8601).

poll_prioritystring

Which polling cadence this box sits in (pre_departure, transit, arrival, dwell). It decides how often we ask the carrier, and moves on its own as the shipment progresses.

archived_atstring | null

When tracking stopped, or null while the box is still active.

identifierstring

The container number, bill of lading or booking this record tracks.

identifier_typestring

What the identifier is. The keyed surface uses container_id, bill_of_lading or booking; the public tracker returns booking_number for the third.

current_vessel_imostring

IMO of the hull carrying the box now. Null before loading and after discharge.

current_voyage_idstring | null

Carrier voyage number for the current leg. Null when the carrier publishes none.

demurrage_daily_rate_usdnumber | null

Daily demurrage rate in force at the destination, US dollars. Null when neither your terms nor a published tariff cover the port.

demurrage_last_free_daystring | null

The last day before demurrage accrues, or null when no terms are on file.

last_poll_triggerstring | null

What caused the most recent carrier check: a schedule, your recheck call, or a webhook. Null when the box has only ever been polled by the scheduler.

tracker_latany | null

Latitude from a physical IoT tracker on the box, when you feed us one. Null on the great majority of boxes, which have no device.

tracker_lngany | null

Longitude from that device. Null with the latitude.

tracker_updated_atstring | null

When the device last reported. Null when there is no device.

tracker_has_alertboolean

True when the device raised an alert, for example a door opening or a temperature excursion.

customs_hold_reasonstring | null

Why customs is holding the box, when the carrier names a reason. Null when there is no hold.

customs_hold_sincestring | null

When the hold started. Null when there is no hold.

container_sizestring | null

Equipment size, for example 40HC. Null when the carrier did not state it.

equipment_typestring | null

Equipment family as the carrier names it. Null when unstated.

iso_type_codestring | null

The type half of the ISO 6346 code (G1 for a general-purpose box, R1 for a reefer). Null when unstated.

unresolvable_sincestring | null

When we gave up resolving this reference. Null while we are still trying, which is the normal state.

route_alertobject | null

A route problem we detected, for example a destination change or a missed connection. Null when the route is behaving.

planned_departure_atstring

Departure the carrier planned or actually filed for the load port. Null when the carrier publishes none.

current_vessel_namestring

Name of that hull. Null when we hold no name for the IMO.

cargo_cutoff_atstring | null

Cargo (gate) cutoff at the load port. Null when the carrier does not publish it, or when the ship has already sailed: read field_provenance to tell those apart.

vgm_cutoff_atstring | null

VGM filing cutoff. Null under the same rules as cargo_cutoff_at.

si_cutoff_atstring | null

Shipping-instruction cutoff. Null under the same rules as cargo_cutoff_at.

customs_release_cutoff_atstring | null

Customs-release cutoff at the load port. Null under the same rules as cargo_cutoff_at.

cutoff_enrichmentobject | null

Where the cutoffs came from when they were not on the carrier response, for example a terminal schedule. Null when no enrichment ran.

unresolved_reasonstring | null

Why a reference could not be resolved: invalid_number, not_found or bl_booking_unresolved. Null means resolved or still resolving.

updated_atstring

When the record itself last changed in our database, which includes bookkeeping writes. For "when did we last learn something about the shipment", read last_updated_at.

archived_reasonstring | null

Why tracking stopped: your delete call, or an automatic close-out once the box finished its cycle. Null while active.

identified_notified_atstring | null

Internal bookkeeping: when the "container identified" digest was sent for this box. Null when none was sent.

intermediary_enriched_atstring | null

Internal bookkeeping: when a lessor or intermediary lookup last enriched this record. Null when none has run.

import_batch_idstring | null

Groups every box created by one bulk import, so their digest fires once per batch. Null on a single manual add.

seal_numberstring | null

Carrier seal on the box. Null unless the carrier publishes it, which most do not on a track response.

move_typestring | null

The scope of the move the carrier is performing, for example port to port or door to door. Null when unstated.

vgm_kgnumber | null

Verified gross mass, kilograms. Null until the shipper files a VGM and the carrier publishes it.

gross_weight_kgnumber | null

Gross weight of the loaded box, kilograms. Null when the carrier publishes none.

package_countnumber | null

Pieces inside the box. Null when the carrier publishes no cargo particulars.

package_unitstring | null

Unit the package count is in, for example CTN or PLT. Null with the count.

measurement_cbmnumber | null

Cargo volume, cubic metres. Null when the carrier publishes none.

service_requirementstring | null

A special handling requirement filed on the shipment, for example a reefer set point. Null when none.

commercial_rawobject | null

Cargo and commercial particulars exactly as the carrier filed them, when a carrier publishes any. Null on most lines. Read the typed fields above instead: this is kept so a value we did not map is never lost.

tracked_fromstring | null

The surface the box was added from. Null on records added before we recorded it.

sourcestring

Where the answer on this call came from: direct_carrier or warm_db.

route_dataobject

The route in the shape our map consumers read: the legs, the current pin and the AIS block. Also returned on the compatibility surface, field for field.

routeobject[]

The legs of the drawn route. This is the map geometry, and it is not the four-point route block above.

route[]object
fromobject

Where the leg starts.

latnumber

Latitude.

lngnumber

Longitude.

namestring

Human-readable name.

statestring

State, province or region of the port, when the gazetteer holds one.

locodestring

UN/LOCODE of the place.

countrystring

Country name.

timezonestring

IANA time zone of the place. Null when we could not resolve the port.

country_codestring

ISO 3166-1 alpha-2 country code.

toobject

Where the leg ends.

latnumber

Latitude.

lngnumber

Longitude.

namestring

Human-readable name.

statestring

State, province or region of the port, when the gazetteer holds one.

locodestring

UN/LOCODE of the place.

countrystring

Country name.

timezonestring

IANA time zone of the place. Null when we could not resolve the port.

country_codestring

ISO 3166-1 alpha-2 country code.

pathobject[]

The drawn geometry of the leg as lat and lng pairs. Empty on an inland leg, where we do not draw a line we cannot verify.

typestring

Event code, for example DEPA or LOAD.

vesselobject | null

Vessel currently carrying the container, or null when we hold neither a name nor an IMO. Its lat and lng are always null here; the keyed endpoints carry the live position under vessel_position.

transport_typestring | null

The mode carrying the leg, for example VESSEL or TRUCK, when the carrier names it. Null when it does not.

pinnumber[]

Where to draw the box right now, as a lat and lng pair. Null when we have nothing solid enough to place it.

pin_sourcestring

How the pin was placed: ais_vessel_position from a real fix, route_reckoning when computed along the route, or a port when the box is sitting at one.

aisobject

The vessel and port dates as an AIS-shaped block, kept in the layout integrators migrating from the older API already parse. Null when we hold no vessel.

dataobject

The AIS-shaped payload. It is nested under a data key because that is the layout of the API this surface is compatible with, not because it is a second envelope.

vesselobject

The hull these dates belong to.

imonumber

IMO number of the vessel.

flagstring

Flag state of the vessel, as a two-letter code. Null when we hold none.

mmsinumber

Vessel MMSI. Null when we hold none.

namestring

Human-readable name.

call_signstring

Vessel radio call sign. Null when we hold none.

last_eventobject

The most recent vessel move behind these dates.

datestring

When it happened, as a port wall-clock string without an offset, which is the layout this block has always used.

voyagestring | null

Carrier voyage number, when published. Null otherwise.

descriptionstring

The carrier own phrasing for the event, falling back to our word for the code.

updated_atstring

When this AIS block was last rebuilt.

arrival_portobject

The arrival call these dates describe.

codestring

The short port code the compatible API prints next to the UN/LOCODE. Read locode for the standard one.

locodestring

UN/LOCODE of the place.

datestring

The date of the call, as a port wall-clock string with no offset, which is the layout this block has always used. Read date_label to know whether it is an estimate or an actual.

date_labelstring

Which kind of date the neighbouring value is: ETA, ETD, ATA or ATD. Read it before treating a date as an actual.

country_codestring

ISO 3166-1 alpha-2 country code.

departure_portobject

The departure call these dates describe.

codestring

The short port code, as above. Read locode for the standard one.

locodestring

UN/LOCODE of the place.

datestring

The date of the call, in the same wall-clock layout. Read date_label before treating it as an actual.

date_labelstring

Which kind of date the neighbouring value is: ETA, ETD, ATA or ATD. Read it before treating a date as an actual.

country_codestring

ISO 3166-1 alpha-2 country code.

discharge_portobject

The discharge call these dates describe.

codestring

The short port code, as above. Read locode for the standard one.

locodestring

UN/LOCODE of the place.

datestring

The date of the sea discharge, in the same wall-clock layout. Read date_label before treating it as an actual.

date_labelstring

Which kind of date the neighbouring value is: ETA, ETD, ATA or ATD. Read it before treating a date as an actual.

country_codestring

ISO 3166-1 alpha-2 country code.

namestring

Human-readable name.

last_vessel_positionobject

The most recent fix for the hull, with the time it was taken.

latnumber

Latitude.

lngnumber

Longitude.

updated_atstring

When the fix was taken.

statusstring

Whether the AIS block carries data, and why not when it does not.

sourceobject

Who produced the route and the AIS in this block. Read it before attributing our route to anybody else.

providerstring

Machine name of the producer.

provider_namestring

Display name of the producer.

route_geometrystring

How the drawn line was produced, for example trackingmcp_computed.

aisstring

Which vessel-position source fed the AIS block.

notestring

One sentence of provenance in plain language.

pin_estimatedboolean

True when the pin was computed rather than observed. Never present a computed pin as a sighting.

pin_estimated_fromstring | null

The observation the estimate was anchored to. Null when there was none to anchor to.

geometry_versionnumber

Which generation of our route-drawing produced this geometry. Bumped when the drawing changes, so a cached line can be invalidated.

route_data_computed_atstring

When this route block was last built.

equipment_ownerstring | null

Registered owner of the box, resolved from its BIC prefix. Null when the prefix is unregistered.

equipment_lessorstring | null

Leasing company, when the box is leased rather than carrier-owned. Null otherwise.

lessee_namestring | null

Who holds the box on lease. Null unless the lessor publishes it.

carrier_hint_codestring | null

An unconfirmed carrier candidate derived from lessor data. Never a confirmed carrier: read carrier_code for that.

lessor_statusstring | null

The box status as the lessor reports it, for example on-hire or off-hire. Null when we hold no lessor record.

lessor_checked_atstring | null

When we last asked the lessor. Null when we never have.

redelivery_referencestring | null

Redelivery booking for the empty. Null until one exists.

redelivery_datestring | null

When the empty is due back. Null until scheduled.

redelivery_locationstring | null

Where the empty is due back. Null until scheduled.

redelivery_yardstring | null

The depot the empty is due back at. Null until scheduled.

lessor_contract_numberstring | null

Lease contract the box sits on. Null unless published.

lessor_contract_typestring | null

Lease type, for example long-term or one-way. Null unless published.

equipment_manufacturerstring | null

Who built the box. Null unless the lessor publishes it.

lessor_on_hire_datestring | null

When the box went on hire. Null unless published.

lessor_on_hire_locationstring | null

Where it went on hire. Null unless published.

lessor_on_hire_yardstring | null

The depot it went on hire at. Null unless published.

connector_statusany | null

Where a request to connect this carrier stands, when the line needs one. Null when the carrier is already connected.

connector_notify_requested_atstring | null

When you asked to be told the connector went live. Null when you did not ask.

connector_notified_atstring | null

When we told you it went live. Null when we have not.

field_provenanceobject

Per-field account of WHY a declared field is empty, keyed by field name. This is the difference between "the carrier does not publish it", "your contract terms would unlock it" and "it does not apply to this shipment".

cargo_cutoff_atobject

Cargo (gate) cutoff at the load port. Null when the carrier does not publish it, or when the ship has already sailed: read field_provenance to tell those apart.

statestring

Why the field stands where it does: resolved, contract_required, not_published, not_applicable or awaiting_carrier.

actionstring

What would change the state: supply_terms, wait, or do_not_expect when nothing will.

sourcestring | null

Where the answer on this call came from: direct_carrier or warm_db.

confidenceany | null

On a card, whether the slot partners agree with each other. On a prediction, how much to trust the shifted arrival.

evidencestring

The reasoning behind the state, in one sentence, so a support answer does not need our source.

si_cutoff_atobject

Shipping-instruction cutoff. Null under the same rules as cargo_cutoff_at.

statestring

Why the field stands where it does: resolved, contract_required, not_published, not_applicable or awaiting_carrier.

actionstring

What would change the state: supply_terms, wait, or do_not_expect when nothing will.

sourcestring | null

Where the answer on this call came from: direct_carrier or warm_db.

confidenceany | null

On a card, whether the slot partners agree with each other. On a prediction, how much to trust the shifted arrival.

evidencestring

The reasoning behind the state, in one sentence, so a support answer does not need our source.

vgm_cutoff_atobject

VGM filing cutoff. Null under the same rules as cargo_cutoff_at.

statestring

Why the field stands where it does: resolved, contract_required, not_published, not_applicable or awaiting_carrier.

actionstring

What would change the state: supply_terms, wait, or do_not_expect when nothing will.

sourcestring | null

Where the answer on this call came from: direct_carrier or warm_db.

confidenceany | null

On a card, whether the slot partners agree with each other. On a prediction, how much to trust the shifted arrival.

evidencestring

The reasoning behind the state, in one sentence, so a support answer does not need our source.

customs_release_cutoff_atobject

Customs-release cutoff at the load port. Null under the same rules as cargo_cutoff_at.

statestring

Why the field stands where it does: resolved, contract_required, not_published, not_applicable or awaiting_carrier.

actionstring

What would change the state: supply_terms, wait, or do_not_expect when nothing will.

sourcestring | null

Where the answer on this call came from: direct_carrier or warm_db.

confidenceany | null

On a card, whether the slot partners agree with each other. On a prediction, how much to trust the shifted arrival.

evidencestring

The reasoning behind the state, in one sentence, so a support answer does not need our source.

discharge_datetimeobject

When the box was discharged, which is when free time starts counting. Null when no discharge is on file yet.

statestring

Why the field stands where it does: resolved, contract_required, not_published, not_applicable or awaiting_carrier.

actionstring

What would change the state: supply_terms, wait, or do_not_expect when nothing will.

sourcestring | null

Where the answer on this call came from: direct_carrier or warm_db.

confidenceany | null

On a card, whether the slot partners agree with each other. On a prediction, how much to trust the shifted arrival.

evidencestring

The reasoning behind the state, in one sentence, so a support answer does not need our source.

free_daysobject

Free days the terms allow at this port. Null when no terms and no published tariff apply.

statestring

Why the field stands where it does: resolved, contract_required, not_published, not_applicable or awaiting_carrier.

actionstring

What would change the state: supply_terms, wait, or do_not_expect when nothing will.

sourcestring | null

Where the answer on this call came from: direct_carrier or warm_db.

confidenceany | null

On a card, whether the slot partners agree with each other. On a prediction, how much to trust the shifted arrival.

evidencestring

The reasoning behind the state, in one sentence, so a support answer does not need our source.

demurrage_last_free_dayobject

The last day before demurrage accrues, or null when no terms are on file.

statestring

Why the field stands where it does: resolved, contract_required, not_published, not_applicable or awaiting_carrier.

actionstring

What would change the state: supply_terms, wait, or do_not_expect when nothing will.

sourcestring | null

Where the answer on this call came from: direct_carrier or warm_db.

confidenceany | null

On a card, whether the slot partners agree with each other. On a prediction, how much to trust the shifted arrival.

evidencestring

The reasoning behind the state, in one sentence, so a support answer does not need our source.

demurrage_daily_rate_usdobject

Daily demurrage rate in force at the destination, US dollars. Null when neither your terms nor a published tariff cover the port.

statestring

Why the field stands where it does: resolved, contract_required, not_published, not_applicable or awaiting_carrier.

actionstring

What would change the state: supply_terms, wait, or do_not_expect when nothing will.

sourcestring | null

Where the answer on this call came from: direct_carrier or warm_db.

confidenceany | null

On a card, whether the slot partners agree with each other. On a prediction, how much to trust the shifted arrival.

evidencestring

The reasoning behind the state, in one sentence, so a support answer does not need our source.

demurrage_at_riskobject

True when the free-time clock on this box is a concern.

statestring

Why the field stands where it does: resolved, contract_required, not_published, not_applicable or awaiting_carrier.

actionstring

What would change the state: supply_terms, wait, or do_not_expect when nothing will.

sourcestring | null

Where the answer on this call came from: direct_carrier or warm_db.

confidenceany | null

On a card, whether the slot partners agree with each other. On a prediction, how much to trust the shifted arrival.

evidencestring

The reasoning behind the state, in one sentence, so a support answer does not need our source.

last_updated_atobject

The more recent of the carrier check and the AIS fix: when we last learned anything about this shipment.

statestring

Why the field stands where it does: resolved, contract_required, not_published, not_applicable or awaiting_carrier.

actionstring

What would change the state: supply_terms, wait, or do_not_expect when nothing will.

sourcestring

Where the answer on this call came from: direct_carrier or warm_db.

confidencestring

On a card, whether the slot partners agree with each other. On a prediction, how much to trust the shifted arrival.

evidencestring

The reasoning behind the state, in one sentence, so a support answer does not need our source.

field_provenance_summaryobject

Counts of the declared cutoff and demurrage fields by state, so you can tell "we do not have it" from "your contract terms would unlock it".

resolvednumber

Declared fields we hold a value for.

contract_requirednumber

Declared fields that stay empty until you supply your own free-time terms.

not_publishednumber

Declared fields this carrier does not publish.

not_applicablenumber

Declared fields that do not apply to this shipment.

awaiting_carriernumber

Declared fields we expect but have not received yet.

unblocked_by_contract_termsboolean

True when supplying free-time terms would fill at least one empty field.

carrier_response_rawobject | null

The carrier payload behind this record, kept for support and replay. Null unless retention is on for your organisation. Not a stable shape: it is whatever that carrier sent.

origin_coordobject

Coordinate of the origin port. Null when the port could not be placed.

latnumber

Latitude.

lngnumber

Longitude.

approximateboolean

True when the coordinate is a place centroid rather than a terminal position. Do not measure distances against an approximate point.

approx_fromany | null

What the approximate point was derived from. Null when the coordinate is exact.

destination_coordobject

Coordinate of the destination port. Null when the port could not be placed.

latnumber

Latitude.

lngnumber

Longitude.

approximateboolean

True when the coordinate is a place centroid rather than a terminal position. Do not measure distances against an approximate point.

approx_fromany | null

What the approximate point was derived from. Null when the coordinate is exact.

is_demoboolean

True on a sample reference. Sample boxes return typical data and have no live carrier feed.

child_containersobject | null

The boxes a bill of lading or booking resolves to, each with its own timeline. Null on a plain container lookup.

ais_etaany | null

Kept for older clients: the AIS-broadcast ETA, also present as vessel_position.eta_ais. Null when the hull broadcasts none.

eventsobject[]

Milestone timeline, oldest to newest.

events[]object
idstring

Stable identifier for the record. On the tracking endpoints this is the container UUID, except on a portfolio summary row, where it is the container number.

org_idstring

Your organisation. Every keyed read is scoped to it, so this is always your own id: it exists so a record stays self-describing once exported.

container_idstring

The container number this row is about.

dcsa_event_idstring

The id this event carries on the DCSA /v2 surface, so the same physical event can be matched across both surfaces.

event_typestring

DCSA event category: SHIPMENT, TRANSPORT or EQUIPMENT.

event_classifier_codestring

DCSA classifier: ACT, EST or PLN.

event_date_timestring

When the event happened or is forecast to (ISO 8601).

event_created_date_timestring

When we recorded the event, not when it happened. A late-filed event can be recorded days after the fact.

transport_event_type_codestring | null

DCSA transport code on a vessel move: ARRI for arrival, DEPA for departure. Null on an equipment event.

delay_reason_codestring | null

Carrier code for why a move slipped. Null on most lines, which publish no reason.

change_remarkany | null

The carrier own free-text remark about a change to this event. Null when it sent none.

equipment_event_type_codestring

DCSA equipment code on a box move, for example GTOT for a gate-out or LOAD for a load. Null on a transport event.

empty_indicator_codestring

EMPTY or LADEN on an equipment event. Present only when the carrier reported the fill state: the standard has no unknown value and we do not invent one. It is not an end-of-shipment signal.

equipment_referencestring

The container the event happened to.

iso_equipment_codestring | null

ISO 6346 equipment code as filed on this event. Null when the carrier stated none.

shipment_event_type_codestring | null

DCSA shipment code on a documentation move. Null on the other two families.

document_idstring | null

The document the shipment event refers to, on the lines that publish one. Null otherwise.

document_type_codestring | null

What that document is, for example a bill of lading. Null with the id.

reasonstring | null

The carrier stated reason for the event, on the lines that publish one. Null otherwise.

transport_callobject

The location, vessel and voyage of the port call. Null when the carrier gave no call.

locationobject

UN/LOCODE for the event, or null when the carrier gave no place.

locationNamestring

Port name as the carrier wrote it, unmapped. Read the UN/LOCODE next to it for the resolved port.

UNLocationCodestring

UN/LOCODE.

referencesany | null

Extra carrier references filed against the event. Null when the carrier filed none.

sealsany | null

Seal numbers filed against the event. Null when the carrier filed none.

normalisation_confidencestring

How sure we are of the normalised code: REPORTED when the carrier gave a code we map directly, INFERRED when we derived it from its wording, UNKNOWN when neither was possible.

supplier_raw_event_codestring | null

The code the source used, before normalisation. Null when the source sent no code.

supplier_raw_payloadany | null

The source own event object, kept verbatim. Null when nothing needed keeping. Not a stable shape.

created_atstring

When the record was created (ISO 8601).

event_idstring | null

The carrier own id for the event, when it publishes one. Null on most lines. Read id for our stable id.

event_datetimestring

Same instant as event_date_time, under the name the earlier API used. Kept so old integrations keep working.

event_codestring

Machine-readable event code, for example LOAD, DISC, GTIN, GTOT, ARRI, DEPA. Null when the carrier sent none.

raw_payloadobject

The connector event exactly as it was stored, so a value we did not map is never lost. Treat it as evidence, not as API surface: its keys vary by carrier.

datetimestring

Event timestamp (ISO 8601), or null when the carrier gave none.

timezonestring

IANA time zone of the place. Null when we could not resolve the port.

unlocodestring

UN/LOCODE port code. On a tracking event it is canonicalised, and null when the carrier named no port.

is_actualboolean

True when the event happened. False means planned or estimated.

port_namestring

Resolved port name.

event_codestring

Machine-readable event code, for example LOAD, DISC, GTIN, GTOT, ARRI, DEPA. Null when the carrier sent none.

vessel_imoany | null

IMO number of the carrying vessel, or null when unknown.

descriptionstring

The carrier own phrasing for the event, falling back to our word for the code.

source_kindstring

Which source produced the event: carrier for a direct carrier call, searates or twin_share when it reached us another way.

vessel_namestring | null

Name of the carrying vessel, or null when the carrier named none.

event_familystring

Which family the code belongs to: EQUIPMENT, TRANSPORT or SHIPMENT.

voyage_numberstring | null

Carrier voyage number.

datetime_basisstring

What the stored instant MEANS: utc for a true instant, port_local for a wall-clock we could not place. Every value on the documented fields above is already a true instant.

datetime_localstring

The port wall-clock carried alongside the instant, inside the raw payload.

time_semanticsstring

How the instant was established during normalisation. Diagnostic, not contract.

transport_modeany | null

Mode the source named for the move. Null when it named none.

datetime_precisionstring

How precise the carrier was: datetime, or date when it gave a day with no time. A date-only event must never be read as midnight.

utc_offset_minutesnumber

Minutes to add to the UTC instant to reach the local wall-clock. Null with the local time.

source_resolve_methodstring

The exact rung the source was resolved on, kept verbatim so a coarse bucket never hides the detail. Diagnostic.

event_local_datetimestring

The port wall-clock for the same moment, naive and with no offset, exactly as a terminal prints it. Null when we could not place the port, and a null here means we do not know, never assume UTC.

utc_offset_minutesnumber

Minutes to add to the UTC instant to reach the local wall-clock. Null with the local time.

event_timezonestring

IANA zone of the port, which survives a DST change in a way a bare offset cannot. Null when the port could not be resolved.

event_time_semanticsstring

Internal marker for how this row timestamp was established. Do not branch on it: read the UTC instant and, if you need port time, its three local companions.

event_namestring

The step in plain language, for example Gated out.

journey_timelineobject[]

The shipment as a reader story: carrier events plus the moves we inferred between them, in order. Empty until the first event lands.

journey_timeline[]object
idstring

Stable identifier for the record. On the tracking endpoints this is the container UUID, except on a portfolio summary row, where it is the container number.

kindstring

carrier_event when a carrier filed it, trackingmcp_inference when we derived the step from surrounding events.

classifierstring

DCSA classifier: ACT for actual, EST for estimated, PLN for planned.

occurred_atstring

When the step happened (UTC). Null when the source gave a wall-clock we could not place.

event_namestring

The step in plain language, for example Gated out.

port_unlocodestring

Resolved port UN/LOCODE. Null when the carrier location could not be placed.

port_namestring

Resolved port name.

facility_namestring | null

Terminal or depot inside the port, when the carrier names one. Null otherwise.

evidence_event_idsstring[]

The event ids this step was built from, so an inference can always be traced back.

confidencestring

On a card, whether the slot partners agree with each other. On a prediction, how much to trust the shifted arrival.

labelstring

The event in plain words. A non-actual event is tagged "(planned)".

port_roleany | null

The role the port plays on this route: origin, transshipment or destination. Null when the route is not resolved enough to say.

milestoneany | null

The voyage milestone this step marks, when it marks one. Null on ordinary steps.

exceptionsobject[]

Count of shipments in an exception state: customs hold, rolled, delayed or at transshipment.

history_daysnumber

How far back the timeline reaches on your plan, in days.

current_legobject | null

The leg the box is on now. Null before departure and after final discharge.

legsobject[]

The voyage broken into legs. Empty when we cannot yet split it.

vessel_positionobject

Live AIS position of the carrying vessel. Null when we hold no IMO or no fix yet.

imostring

IMO number of the vessel.

namestring

Human-readable name.

latnumber

Latitude.

lngnumber

Longitude.

speed_knotsnumber

Speed over ground, in knots.

heading_degnumber

Heading in degrees.

nav_statusstring

Navigational status as reported by AIS, for example "Under way using engine" or "Moored". We drop a moored or anchored claim that the position contradicts.

position_updated_atstring

When we last wrote the position row.

position_fix_atstring

When the hull was actually observed. This, not position_updated_at, is the age that matters.

eta_aisstring

The destination ETA the vessel itself is broadcasting, which is the master own entry and often disagrees with the carrier. Null when the hull broadcasts none.

destination_unlocodestring

Destination port UN/LOCODE, or null when unresolved.

photo_urlstring

Photograph of the hull. Null when we hold none.

particulars_updated_atstring

When the vessel particulars were last refreshed.

reported_nav_statusstring

The navigational status the vessel broadcasts, unchecked.

nav_status_verifiedboolean

False when the broadcast status contradicts where the vessel actually is, for example Moored while far from any port. Then read nav_status, which we correct.

nav_status_reasonstring

Why the broadcast status was not trusted, for example outside_port_geofence. Null when it was trusted.

nearest_port_nmnumber

Distance to the nearest port, nautical miles, which is the evidence behind the check. Null when the status needed no checking.

pin_sourcestring

How the pin was placed: ais_vessel_position from a real fix, route_reckoning when computed along the route, or a port when the box is sitting at one.

pin_basisstring

What the reckoning leaned on when the pin was computed rather than observed, for example a published schedule.

pin_estimated_fromstring | null

The observation the estimate was anchored to. Null when there was none to anchor to.

observed_positionobject

The last position we actually observed, never a computed one. Null when the hull has no fix on record.

latnumber

Latitude.

lngnumber

Longitude.

observed_atstring

When the fix was taken.

qualitystring

How exact the fix is: precise for a terrestrial fix, coarse for a satellite one.

accuracy_kmnumber | null

Radius the fix is good to, kilometres. Null when the source states no accuracy.

estimated_positionobject

A computed position, for when there is no fresh fix. Always labelled as computed; never merge the two blocks.

latnumber

Latitude.

lngnumber

Longitude.

estimated_atstring

The moment the estimate describes.

based_on_observation_atstring | null

The observation the estimate was reckoned from. Null when the reckoning had no fix to start from and leaned on the schedule alone.

classificationstring

Which reckoning class produced the estimate. Diagnostic detail for support, not something to branch on.

methodstring

How the position was produced, for example route_reckoning.

vessel_photoobject

Photograph of the current hull with its attribution. Null when we hold none.

urlstring

Where we POST the events.

sourcestring

Where the answer on this call came from: direct_carrier or warm_db.

retrieved_atstring

When we fetched the photograph.

last_updated_atstring

The more recent of the carrier check and the AIS fix: when we last learned anything about this shipment.

last_updated_sourcestring

Which of the two produced last_updated_at: carrier_poll or ais_vessel_position. Null when neither has happened yet.

last_ais_fix_atstring

When the vessel was last actually observed by AIS, or null when we hold no fix.

vessel_namesobject

IMO to name map covering every leg, so an onward vessel can be named without a second call. Empty when no leg carries a hull we can name.

transshipmentobject | null

The hub the box is dwelling at and its onward vessel. Null unless it is dwelling.

schedule_overlayobject

The published vessel rotation we matched this box to, which is the plan against which actuals can be read. Null when nothing matched.

sourcestring

Where the answer on this call came from: direct_carrier or warm_db.

matchstring

How strongly the sailing matches the box, strongest first: vessel_voyage, vessel_lane, vessel_route, onward_vessel_lane, lane, carrier_lane. Weaker matches are context, not proof.

carrier_codestring

Carrier SCAC.

service_namestring

Carrier service or loop name.

vessel_imostring

IMO number of the carrying vessel, or null when unknown.

voyage_numberstring

Carrier voyage number.

published_departurestring

The departure the carrier published (ISO 8601). Null when it published none.

published_arrivalstring

The arrival the carrier published (ISO 8601). Null when it published none.

transit_daysnumber

Port-to-port transit in days.

is_transshipmentboolean

True when the box changes vessel on the way.

legsobject[]

The voyage broken into legs. Empty when we cannot yet split it.

legs[]object
seqnumber

Position of the leg in the rotation, starting at 1.

from_unlocodestring

UN/LOCODE the leg departs.

to_unlocodestring

UN/LOCODE the leg arrives at.

from_namestring

Name of the departure port.

to_namestring

Name of the arrival port.

vessel_namestring

Name of the carrying vessel, or null when the carrier named none.

voyagestring

Carrier voyage number, when published. Null otherwise.

servicestring

Carrier service or loop name.

etdstring

Estimated time of departure (ISO 8601).

etastring

Arrival time (ISO 8601). Null when the carrier publishes none and we cannot predict one.

eta_intelobject

Probability envelope and reliability context. Null on thin lanes.

basisstring

What the reliability figures were computed from, which tells you how much to lean on them.

carrier_scopedboolean

True when the statistics are for THIS carrier on this lane, false when they are lane-level across all carriers and therefore coarser.

confidence_pctnumber

On-time percentage for the lane, which is the same number the ring shows.

on_time_pctnumber

Share of sailings that arrived on time.

median_delay_hoursnumber | null

Typical delay on the lane, hours. Null on a lane too thin to score.

p90_delay_hoursnumber

Delay that 90 percent of arrivals stay inside, hours. Null on a thin lane.

observationsnumber

Number of observed sailings behind the figure.

window_daysnumber

How far back those observations reach, days.

band_lowstring

Best case: the published ETA, arriving on time. Null when there is no ETA to anchor to.

band_highstring

The date 90 percent of arrivals land by. Null when there is no ETA to anchor to.

expectedstring

The typical outcome: the ETA plus the median delay. Null when there is no ETA to anchor to.

transit_p50_hoursnumber | null

Median transit time on the lane, hours. Null on a thin lane.

transit_p90_hoursnumber | null

Transit time 90 percent of sailings stay inside, hours. Null on a thin lane.

eta_at_riskobject | null

Congestion warning. Null unless the next port is congested or the vessel has waited at anchor.

observabilityobject

Which of the four lenses we can offer on this shipment, and how many are active.

lensesobject

actuals (carrier milestones), position (the vessel), plan (a schedule) and probability (a confidence figure).

actualsboolean

True when we hold carrier milestones.

positionboolean

True when we hold a vessel.

planboolean

On LoadingMCP, the computed load plan. Inside a tracking observability lens, true when we hold a schedule for the shipment.

probabilityboolean

True when the ETA can carry a confidence figure.

active_countnumber

How many of the four lenses are present.

agreementstring

Whether the sources tell the same story: aligned, diverging, partial, or insufficient when there are too few to compare.

eta_sourcesobject[]

The ETA each cross-checkable source implies, so a disagreement can be seen rather than averaged away.

eta_sources[]object
lensstring

Which source this ETA came from: carrier, published or ais.

etastring

Arrival time (ISO 8601). Null when the carrier publishes none and we cannot predict one.

max_spread_hoursnumber

Hours between the furthest-apart ETA sources. Null when fewer than two sources have an ETA.

ai_insightstring | null

A written read of the shipment state. Null when none has been generated for this box.

ai_insight_pendingboolean

True while one is being generated, so a client can poll instead of showing an empty space.

Errors

A failure carries { "ok": false, "error": { "code", "message", "severity" } }. Branch on the code, and log the message.

UNAUTHORIZED401

The key is missing, malformed or revoked.

NOT_FOUND404

No container with that UUID on your account. Note the id is the UUID, not the container number.

curl 'https://api.trackingmcp.com/v1/containers/8f1c2d4e-6a3b-4f52-9c70-11ab22cd33ef' \
  -H "Authorization: Bearer tmcp_YOUR_API_KEY"
Response
{
  "api_version": "2026-08-04",
  "ok": true,
  "data": {
    "id": "6b2f4c81-9d35-4e70-a18c-5f7e2a9b4d63",
    "org_id": "e04a7c19-8b62-4d35-9017-3a5c8e2b6f94",
    "container_number": "HLXU8765432",
    "bl_number": null,
    "booking_number": null,
    "carrier_code": "ONEY",
    "carrier_name": "ONE",
    "iso_code": null,
    "size_teu": null,
    "container_type": null,
    "status": "in_transit",
    "origin_unlocode": "CNCKG",
    "destination_unlocode": "GBSOU",
    "origin_name": "CHONGQING, CHONGQING",
    "destination_name": "SOUTHAMPTON, HAMPSHIRE",
    "eta": "2026-10-17T22:00:00+00:00",
    "eta_is_estimated": true,
    "eta_confidence_pct": 71,
    "discharge_datetime": null,
    "free_days": null,
    "last_free_day": null,
    "demurrage_at_risk": false,
    "demurrage_accrued_usd": null,
    "tags": [],
    "notes": null,
    "added_at": "2026-08-19T13:07:40.567796+00:00",
    "last_polled_at": "2026-08-19T13:08:08.636+00:00",
    "poll_priority": "transit",
    "archived_at": null,
    "identifier": "HLXU8765432",
    "identifier_type": "container_id",
    "current_vessel_imo": "9637260",
    "current_voyage_id": null,
    "demurrage_daily_rate_usd": null,
    "demurrage_last_free_day": null,
    "last_poll_trigger": null,
    "tracker_lat": null,
    "tracker_lng": null,
    "tracker_updated_at": null,
    "tracker_has_alert": false,
    "customs_hold_reason": null,
    "customs_hold_since": null,
    "container_size": null,
    "equipment_type": null,
    "iso_type_code": null,
    "unresolvable_since": null,
    "route_alert": null,
    "planned_departure_at": "2026-08-12T09:57:00+00:00",
    "current_vessel_name": "HMM PRIDE",
    "cargo_cutoff_at": null,
    "vgm_cutoff_at": null,
    "si_cutoff_at": null,
    "customs_release_cutoff_at": null,
    "cutoff_enrichment": null,
    "unresolved_reason": null,
    "updated_at": "2026-08-19T13:08:15.748434+00:00",
    "archived_reason": null,
    "identified_notified_at": null,
    "intermediary_enriched_at": null,
    "import_batch_id": null,
    "seal_number": null,
    "move_type": null,
    "vgm_kg": null,
    "gross_weight_kg": null,
    "package_count": null,
    "package_unit": null,
    "measurement_cbm": null,
    "service_requirement": null,
    "commercial_raw": null,
    "tracked_from": null,
    "source": "api",
    "route_data": {
      "route": [
        {
          "from": {
            "lat": 29.719167,
            "lng": 106.641667,
            "name": "Chongqing",
            "state": "CQ",
            "locode": "CNCKG",
            "country": "China",
            "timezone": "Asia/Shanghai",
            "country_code": "CN"
          },
          "to": {
            "lat": 31.1267,
            "lng": 121.46178,
            "name": "Shanghai",
            "state": "SH",
            "locode": "CNSHA",
            "country": "China",
            "timezone": "Asia/Shanghai",
            "country_code": "CN"
          },
          "path": [],
          "type": "LAND",
          "vessel": null,
          "transport_type": null
        },
        {
          "from": {
            "lat": 31.1267,
            "lng": 121.46178,
            "name": "Shanghai",
            "state": "SH",
            "locode": "CNSHA",
            "country": "China",
            "timezone": "Asia/Shanghai",
            "country_code": "CN"
          },
          "to": {
            "lat": 50.899862,
            "lng": -1.43843,
            "name": "Southampton",
            "state": "HAM",
            "locode": "GBSOU",
            "country": "United Kingdom",
            "timezone": "Europe/London",
            "country_code": "GB"
          },
          "path": [
            [
              31.1267,
              121.46177999999998
            ],
            [
              30.77811875,
              121.31717249999997
            ],
            [
              30.6436625,
              121.34495874999993
            ]
          ],
          "type": "SEA",
          "vessel": {
            "imo": 9637260,
            "flag": "KR",
            "mmsi": 441486000,
            "name": "HMM PRIDE",
            "call_sign": "D8HP"
          },
          "transport_type": "VESSEL"
        }
      ],
      "pin": [
        30.424815185353165
      ],
      "pin_source": "schedule",
      "ais": {
        "data": {
          "vessel": {
            "imo": 9637260,
            "flag": "KR",
            "mmsi": 441486000,
            "name": "HMM PRIDE",
            "call_sign": "D8HP"
          },
          "last_event": {
            "date": "2026-08-12 09:57:00",
            "voyage": null,
            "description": "Vessel departure"
          },
          "updated_at": "2026-08-19 13:08:15",
          "arrival_port": {
            "code": "SOU",
            "locode": "GBSOU",
            "date": "2026-10-17 22:00:00",
            "date_label": "ETA",
            "country_code": "GB"
          },
          "departure_port": {
            "code": "SHA",
            "locode": "CNSHA",
            "date": "2026-09-12 19:00:00",
            "date_label": "ETD",
            "country_code": "CN"
          },
          "discharge_port": {
            "code": "SOU",
            "locode": "GBSOU",
            "date": "2026-10-17 23:30:00",
            "date_label": "ETA",
            "country_code": "GB",
            "name": "Southampton"
          },
          "last_vessel_position": {
            "lat": 49.02262,
            "lng": -123.14808,
            "updated_at": "2026-08-19 13:08:17"
          }
        },
        "status": "NOT_ON_BOARD"
      },
      "source": {
        "provider": "trackingmcp",
        "provider_name": "TrackingMCP",
        "route_geometry": "trackingmcp_computed",
        "ais": "trackingmcp_vessel_positions",
        "note": "Route geometry and AIS fields were built from TrackingMCP container events, ports, and vessel positions."
      },
      "pin_estimated": true,
      "pin_estimated_from": null,
      "geometry_version": 2
    },
    "route_data_computed_at": "2026-08-19T13:08:15.681+00:00",
    "equipment_owner": null,
    "equipment_lessor": null,
    "lessee_name": null,
    "carrier_hint_code": null,
    "lessor_status": null,
    "lessor_checked_at": null,
    "redelivery_reference": null,
    "redelivery_date": null,
    "redelivery_location": null,
    "redelivery_yard": null,
    "lessor_contract_number": null,
    "lessor_contract_type": null,
    "equipment_manufacturer": null,
    "lessor_on_hire_date": null,
    "lessor_on_hire_location": null,
    "lessor_on_hire_yard": null,
    "connector_status": null,
    "connector_notify_requested_at": null,
    "connector_notified_at": null,
    "field_provenance": {
      "cargo_cutoff_at": {
        "state": "not_applicable",
        "action": "do_not_expect",
        "source": null,
        "confidence": null,
        "evidence": "cargo_cutoff_at is a pre-departure deadline; this shipment has already sailed (status in_transit)."
      },
      "si_cutoff_at": {
        "state": "not_applicable",
        "action": "do_not_expect",
        "source": null,
        "confidence": null,
        "evidence": "si_cutoff_at is a pre-departure deadline; this shipment has already sailed (status in_transit)."
      },
      "vgm_cutoff_at": {
        "state": "not_applicable",
        "action": "do_not_expect",
        "source": null,
        "confidence": null,
        "evidence": "vgm_cutoff_at is a pre-departure deadline; this shipment has already sailed (status in_transit)."
      },
      "customs_release_cutoff_at": {
        "state": "not_applicable",
        "action": "do_not_expect",
        "source": null,
        "confidence": null,
        "evidence": "customs_release_cutoff_at is a pre-departure deadline; this shipment has already sailed (status in_transit)."
      },
      "discharge_datetime": {
        "state": "awaiting_carrier",
        "action": "wait",
        "source": null,
        "confidence": null,
        "evidence": "No laden discharge event reported at the final port of discharge yet."
      },
      "free_days": {
        "state": "contract_required",
        "action": "supply_contract_terms",
        "source": null,
        "confidence": null,
        "evidence": "Free time is a commercial term between you and the carrier, negotiated per contract and lane. We cannot observe it. Supply it via POST /v1/demurrage-terms and every field below resolves."
      },
      "demurrage_last_free_day": {
        "state": "not_applicable",
        "action": "wait",
        "source": null,
        "confidence": null,
        "evidence": "Free time starts at discharge. This container has not been discharged, so a last free day would not be a real date."
      },
      "demurrage_daily_rate_usd": {
        "state": "contract_required",
        "action": "supply_contract_terms",
        "source": null,
        "confidence": null,
        "evidence": "The daily demurrage rate is a tariff/contract figure, not a tracking observation. Supply it with your free-time terms to get a costed exposure."
      },
      "demurrage_at_risk": {
        "state": "not_applicable",
        "action": "wait",
        "source": null,
        "confidence": null,
        "evidence": "Risk is only assessable after discharge."
      },
      "last_updated_at": {
        "state": "resolved",
        "action": "none",
        "source": "carrier",
        "confidence": "exact",
        "evidence": "Last carrier check at 2026-08-19T13:08:08.636+00:00, more recent than the vessel's last position fix at 2026-08-19T13:04:58+00:00."
      }
    },
    "field_provenance_summary": {
      "resolved": 1,
      "contract_required": 2,
      "not_published": 0,
      "not_applicable": 6,
      "awaiting_carrier": 1,
      "unblocked_by_contract_terms": true
    },
    "carrier_response_raw": null,
    "origin_coord": {
      "lat": 29.719167,
      "lng": 106.641667,
      "approximate": false,
      "approx_from": null
    },
    "destination_coord": {
      "lat": 50.899862,
      "lng": -1.43843,
      "approximate": false,
      "approx_from": null
    },
    "is_demo": false,
    "child_containers": null,
    "ais_eta": null,
    "events": [
      {
        "id": "5a3c9e71-4d82-4f60-b295-7c1e6b4a8d30",
        "org_id": "e04a7c19-8b62-4d35-9017-3a5c8e2b6f94",
        "container_id": "6b2f4c81-9d35-4e70-a18c-5f7e2a9b4d63",
        "dcsa_event_id": "8f1c2d4e-6a3b-4f52-9c70-11ab22cd33ef",
        "event_type": "EQUIPMENT",
        "event_classifier_code": "ACT",
        "event_date_time": "2026-08-07T05:25:00+00:00",
        "event_created_date_time": "2026-08-19T13:08:07.285702+00:00",
        "transport_event_type_code": null,
        "delay_reason_code": null,
        "change_remark": null,
        "equipment_event_type_code": "GTOT",
        "empty_indicator_code": "EMPTY",
        "equipment_reference": "HLXU8765432",
        "iso_equipment_code": null,
        "shipment_event_type_code": null,
        "document_id": null,
        "document_type_code": null,
        "reason": null,
        "transport_call": {
          "location": {
            "locationName": "CHONGQING, CHONGQING",
            "UNLocationCode": "CNCKG"
          }
        },
        "references": null,
        "seals": null,
        "normalisation_confidence": "INFERRED",
        "supplier_raw_event_code": null,
        "supplier_raw_payload": null,
        "created_at": "2026-08-19T13:08:07.285702+00:00",
        "event_id": null,
        "event_datetime": "2026-08-07T05:25:00+00:00",
        "event_code": "GTOT",
        "raw_payload": {
          "datetime": "2026-08-07T05:25:00.000Z",
          "timezone": "Asia/Shanghai",
          "unlocode": "CNCKG",
          "is_actual": true,
          "port_name": "CHONGQING, CHONGQING",
          "event_code": "GTOT",
          "vessel_imo": null,
          "description": "Empty Container Release to Shipper",
          "source_kind": "searates",
          "vessel_name": null,
          "event_family": "EQUIPMENT",
          "voyage_number": null,
          "datetime_basis": "utc",
          "datetime_local": "2026-08-07T13:25:00",
          "time_semantics": "carrier_offset",
          "transport_mode": null,
          "datetime_precision": "datetime",
          "utc_offset_minutes": 480,
          "source_resolve_method": "searates_hint"
        },
        "event_local_datetime": "2026-08-07T13:25:00",
        "utc_offset_minutes": 480,
        "event_timezone": "Asia/Shanghai",
        "event_time_semantics": "carrier_offset",
        "event_name": "Gated out"
      },
      {
        "id": "3f1c9a4e-7b52-4f0e-9a41-2c9d5e6b8a10",
        "org_id": "e04a7c19-8b62-4d35-9017-3a5c8e2b6f94",
        "container_id": "6b2f4c81-9d35-4e70-a18c-5f7e2a9b4d63",
        "dcsa_event_id": "a94b2e10-33d7-4c8a-b0f1-6d2e7c9a4b55",
        "event_type": "EQUIPMENT",
        "event_classifier_code": "ACT",
        "event_date_time": "2026-08-07T16:01:00+00:00",
        "event_created_date_time": "2026-08-19T13:08:07.402357+00:00",
        "transport_event_type_code": null,
        "delay_reason_code": null,
        "change_remark": null,
        "equipment_event_type_code": "GTIN",
        "empty_indicator_code": null,
        "equipment_reference": "HLXU8765432",
        "iso_equipment_code": null,
        "shipment_event_type_code": null,
        "document_id": null,
        "document_type_code": null,
        "reason": null,
        "transport_call": {
          "location": {
            "locationName": "CHONGQING, CHONGQING",
            "UNLocationCode": "CNCKG"
          }
        },
        "references": null,
        "seals": null,
        "normalisation_confidence": "INFERRED",
        "supplier_raw_event_code": null,
        "supplier_raw_payload": null,
        "created_at": "2026-08-19T13:08:07.402357+00:00",
        "event_id": null,
        "event_datetime": "2026-08-07T16:01:00+00:00",
        "event_code": "GTIN",
        "raw_payload": {
          "datetime": "2026-08-07T16:01:00.000Z",
          "timezone": "Asia/Shanghai",
          "unlocode": "CNCKG",
          "is_actual": true,
          "port_name": "CHONGQING, CHONGQING",
          "event_code": "GTIN",
          "vessel_imo": null,
          "description": "Gate In to Outbound Terminal",
          "source_kind": "searates",
          "vessel_name": null,
          "event_family": "EQUIPMENT",
          "voyage_number": null,
          "datetime_basis": "utc",
          "datetime_local": "2026-08-08T00:01:00",
          "time_semantics": "carrier_offset",
          "transport_mode": null,
          "datetime_precision": "datetime",
          "utc_offset_minutes": 480,
          "source_resolve_method": "searates_hint"
        },
        "event_local_datetime": "2026-08-08T00:01:00",
        "utc_offset_minutes": 480,
        "event_timezone": "Asia/Shanghai",
        "event_time_semantics": "carrier_offset",
        "event_name": "Gated in"
      }
    ],
    "journey_timeline": [
      {
        "id": "5a3c9e71-4d82-4f60-b295-7c1e6b4a8d30",
        "kind": "carrier_event",
        "classifier": "ACT",
        "occurred_at": "2026-08-07T05:25:00.000Z",
        "event_name": "Gated out",
        "port_unlocode": "CNCKG",
        "port_name": "CHONGQING, CHONGQING",
        "facility_name": null,
        "evidence_event_ids": [
          "5a3c9e71-4d82-4f60-b295-7c1e6b4a8d30"
        ],
        "confidence": "reported",
        "label": "GTOT",
        "port_role": null,
        "milestone": null
      },
      {
        "id": "3f1c9a4e-7b52-4f0e-9a41-2c9d5e6b8a10",
        "kind": "carrier_event",
        "classifier": "ACT",
        "occurred_at": "2026-08-07T16:01:00.000Z",
        "event_name": "Gated in",
        "port_unlocode": "CNCKG",
        "port_name": "CHONGQING, CHONGQING",
        "facility_name": null,
        "evidence_event_ids": [
          "3f1c9a4e-7b52-4f0e-9a41-2c9d5e6b8a10"
        ],
        "confidence": "reported",
        "label": "GTIN",
        "port_role": null,
        "milestone": null
      }
    ],
    "exceptions": [],
    "history_days": 365,
    "current_leg": null,
    "legs": [],
    "vessel_position": {
      "imo": "9637260",
      "name": "HMM PRIDE",
      "lat": 49.022617,
      "lng": -123.148083,
      "speed_knots": 0,
      "heading_deg": 133,
      "nav_status": "Status unverified",
      "position_updated_at": "2026-08-19T13:08:17.763+00:00",
      "position_fix_at": "2026-08-19T13:04:58+00:00",
      "eta_ais": "2026-08-12T16:00:00+00:00",
      "destination_unlocode": "USTIW",
      "photo_url": "https://static.vesselfinder.net/ship-photo/9637260-441486000-53d9ac3aef04a1f3f9c4448ba21edbf8/1?v1",
      "particulars_updated_at": "2026-08-16T06:08:02.062+00:00",
      "reported_nav_status": "Moored",
      "nav_status_verified": false,
      "nav_status_reason": "outside_port_geofence",
      "nearest_port_nm": 4105.3456502614135
    },
    "pin_source": "route_reckoning",
    "pin_basis": "schedule",
    "pin_estimated_from": null,
    "observed_position": {
      "lat": 49.022617,
      "lng": -123.148083,
      "observed_at": "2026-08-19T13:04:58+00:00",
      "quality": "precise",
      "accuracy_km": null
    },
    "estimated_position": {
      "lat": 30.424815185353165,
      "lng": 114.07153602984077,
      "estimated_at": "2026-08-19T14:26:00.000Z",
      "based_on_observation_at": null,
      "classification": "SAT-A",
      "method": "route_reckoning"
    },
    "vessel_photo": {
      "url": "https://static.vesselfinder.net/ship-photo/9637260-441486000-53d9ac3aef04a1f3f9c4448ba21edbf8/1?v1",
      "source": "external_enrichment",
      "retrieved_at": "2026-08-16T06:08:02.062+00:00"
    },
    "last_updated_at": "2026-08-19T13:08:08.636+00:00",
    "last_updated_source": "carrier_poll",
    "last_ais_fix_at": "2026-08-19T13:04:58+00:00",
    "vessel_names": {},
    "transshipment": null,
    "schedule_overlay": {
      "source": "published_schedule",
      "match": "vessel_lane",
      "carrier_code": "MSCU",
      "service_name": "GRIFFIN SERVICE",
      "vessel_imo": "9637260",
      "voyage_number": "0056W",
      "published_departure": "2026-09-17T11:30:00+00:00",
      "published_arrival": "2026-10-17T07:00:00+00:00",
      "transit_days": 30,
      "is_transshipment": false,
      "legs": [
        {
          "seq": 1,
          "from_unlocode": "SGSIN",
          "to_unlocode": "GBSOU",
          "from_name": "SINGAPORE",
          "to_name": "SOUTHAMPTON",
          "vessel_name": "HMM PRIDE",
          "voyage": "0056W",
          "service": "GRIFFIN SERVICE",
          "etd": "2026-09-17T11:30:00.000Z",
          "eta": "2026-10-17T07:00:00.000Z"
        }
      ]
    },
    "eta_intel": {
      "basis": "carrier_schedule",
      "carrier_scoped": true,
      "confidence_pct": 71,
      "on_time_pct": 71,
      "median_delay_hours": null,
      "p90_delay_hours": 168,
      "observations": 13270,
      "window_days": 90,
      "band_low": "2026-10-17T22:00:00+00:00",
      "band_high": "2026-10-24T22:00:00.000Z",
      "expected": "2026-10-21T10:00:00.000Z",
      "transit_p50_hours": null,
      "transit_p90_hours": null
    },
    "eta_at_risk": null,
    "observability": {
      "lenses": {
        "actuals": true,
        "position": true,
        "plan": true,
        "probability": true
      },
      "active_count": 4,
      "agreement": "aligned",
      "eta_sources": [
        {
          "lens": "carrier",
          "eta": "2026-10-17T22:00:00+00:00"
        }
      ],
      "max_spread_hours": 15
    },
    "ai_insight": null,
    "ai_insight_pending": true
  }
}