diff --git a/docs/coverage/home.mdx b/docs/coverage/home.mdx index 71aad83b..8fd4f31c 100644 --- a/docs/coverage/home.mdx +++ b/docs/coverage/home.mdx @@ -64,7 +64,7 @@ Terminal49 integrates directly with each supported shipping line and normalizes Some carriers are live in production but not in the public default set. Contact Terminal49 to enable them on your account. -See [account-enabled carriers](/coverage/ocean-carriers#account-enabled-carriers) for Seaboard Marine (`SMLU`) and Trailer Bridge (`TRBR`). +See [account-enabled carriers](/coverage/ocean-carriers#account-enabled-carriers) for Trailer Bridge (`TRBR`). ## Supported terminals diff --git a/docs/coverage/ocean-carriers.mdx b/docs/coverage/ocean-carriers.mdx index 2567ddba..7bf119bd 100644 --- a/docs/coverage/ocean-carriers.mdx +++ b/docs/coverage/ocean-carriers.mdx @@ -1491,83 +1491,15 @@ SCAC `PCIU`. | Other events | Estimated Arrival | Supported | | Other events | Booking Cancelled | Not supported | -## Safmarine - -SCAC `SAFM`. - -| Section | Feature | Coverage | -| --- | --- | --- | -| Tracking identifiers | Bill Of Lading | Supported | -| Tracking identifiers | Booking Number | Supported | -| Tracking identifiers | Container Number | Not supported | -| Origin | POL Name | Unknown | -| Origin | POL Locode | Unknown | -| Origin | POL Timezone | Unknown | -| Origin | POL ETD | Unknown | -| Origin | POL ATD | Unknown | -| Destination port | POD Name | Unknown | -| Destination port | POD Locode | Unknown | -| Destination port | POD Terminal | Unknown | -| Destination port | POD Timezone | Unknown | -| Destination port | POD Voyage Number | Unknown | -| Destination port | POD Vessel Name | Unknown | -| Destination port | POD Vessel IMO | Unknown | -| Destination port | POD ETA | Unknown | -| Destination port | POD ATA | Unknown | -| Inland destination | Destination Name | Unknown | -| Inland destination | Destination Locode | Unknown | -| Inland destination | Destination Timezone | Unknown | -| Inland destination | Destination ETA | Unknown | -| Inland destination | Destination ATA | Unknown | -| Container attributes | Number | Unknown | -| Container attributes | Seal Number | Unknown | -| Container attributes | Equipment Type | Unknown | -| Container attributes | Equipment Length | Unknown | -| Container attributes | Equipment Height | Unknown | -| Container attributes | Weight (Lbs) | Unknown | -| Container attributes | POD Arrived At | Unknown | -| Container attributes | POD Discharged At | Unknown | -| Container attributes | POD Full Out At | Unknown | -| Container attributes | Destination Arrived At | Unknown | -| Container attributes | Destination Full Out At | Unknown | -| Container attributes | Empty Terminated At | Unknown | -| Container milestones | Empty Out | Unknown | -| Container milestones | Full In | Unknown | -| Container milestones | Vessel Loaded | Unknown | -| Container milestones | Vessel Departed | Unknown | -| Container milestones | Transshipment Arrived | Unknown | -| Container milestones | Transshipment Discharged | Unknown | -| Container milestones | Transshipment Loaded | Unknown | -| Container milestones | Transshipment Departed | Unknown | -| Container milestones | Vessel Arrived | Unknown | -| Container milestones | Vessel Berthed | Unknown | -| Container milestones | Vessel Discharged | Unknown | -| Container milestones | Full Out | Unknown | -| Container milestones | Empty Returned | Unknown | -| Additional milestones | Feeder Arrived | Unknown | -| Additional milestones | Feeder Discharged | Unknown | -| Additional milestones | Feeder Loaded | Unknown | -| Additional milestones | Feeder Departed | Unknown | -| Additional milestones | Rail Loaded | Unknown | -| Additional milestones | Rail Departed | Unknown | -| Additional milestones | Rail Arrived | Unknown | -| Additional milestones | Rail Unloaded | Unknown | -| Additional milestones | Arrived At Destination | Unknown | -| Additional milestones | Delivered | Unknown | -| Additional milestones | Estimated Arrival at Final Destination | Unknown | -| Other events | SSL LFD Changed | Unknown | -| Other events | Estimated Arrival | Unknown | -| Other events | Booking Cancelled | Unknown | - ## Seaboard Marine -SCAC `SMLU`. Account enablement required. +SCAC `SMLU`. | Section | Feature | Coverage | | --- | --- | --- | | Tracking identifiers | Bill Of Lading | Supported | | Tracking identifiers | Booking Number | Supported | -| Tracking identifiers | Container Number | Not supported | +| Tracking identifiers | Container Number | Supported | | Origin | POL Name | Unknown | | Origin | POL Locode | Unknown | | Origin | POL Timezone | Unknown | @@ -1695,142 +1627,6 @@ SCAC `SEAU`. | Other events | Estimated Arrival | Supported | | Other events | Booking Cancelled | Not supported | -## Sealand Europe - -SCAC `SEJJ`. - -| Section | Feature | Coverage | -| --- | --- | --- | -| Tracking identifiers | Bill Of Lading | Supported | -| Tracking identifiers | Booking Number | Supported | -| Tracking identifiers | Container Number | Supported | -| Origin | POL Name | Unknown | -| Origin | POL Locode | Unknown | -| Origin | POL Timezone | Unknown | -| Origin | POL ETD | Unknown | -| Origin | POL ATD | Unknown | -| Destination port | POD Name | Unknown | -| Destination port | POD Locode | Unknown | -| Destination port | POD Terminal | Unknown | -| Destination port | POD Timezone | Unknown | -| Destination port | POD Voyage Number | Unknown | -| Destination port | POD Vessel Name | Unknown | -| Destination port | POD Vessel IMO | Unknown | -| Destination port | POD ETA | Unknown | -| Destination port | POD ATA | Unknown | -| Inland destination | Destination Name | Unknown | -| Inland destination | Destination Locode | Unknown | -| Inland destination | Destination Timezone | Unknown | -| Inland destination | Destination ETA | Unknown | -| Inland destination | Destination ATA | Unknown | -| Container attributes | Number | Unknown | -| Container attributes | Seal Number | Unknown | -| Container attributes | Equipment Type | Unknown | -| Container attributes | Equipment Length | Unknown | -| Container attributes | Equipment Height | Unknown | -| Container attributes | Weight (Lbs) | Unknown | -| Container attributes | POD Arrived At | Unknown | -| Container attributes | POD Discharged At | Unknown | -| Container attributes | POD Full Out At | Unknown | -| Container attributes | Destination Arrived At | Unknown | -| Container attributes | Destination Full Out At | Unknown | -| Container attributes | Empty Terminated At | Unknown | -| Container milestones | Empty Out | Unknown | -| Container milestones | Full In | Unknown | -| Container milestones | Vessel Loaded | Unknown | -| Container milestones | Vessel Departed | Unknown | -| Container milestones | Transshipment Arrived | Unknown | -| Container milestones | Transshipment Discharged | Unknown | -| Container milestones | Transshipment Loaded | Unknown | -| Container milestones | Transshipment Departed | Unknown | -| Container milestones | Vessel Arrived | Unknown | -| Container milestones | Vessel Berthed | Unknown | -| Container milestones | Vessel Discharged | Unknown | -| Container milestones | Full Out | Unknown | -| Container milestones | Empty Returned | Unknown | -| Additional milestones | Feeder Arrived | Unknown | -| Additional milestones | Feeder Discharged | Unknown | -| Additional milestones | Feeder Loaded | Unknown | -| Additional milestones | Feeder Departed | Unknown | -| Additional milestones | Rail Loaded | Unknown | -| Additional milestones | Rail Departed | Unknown | -| Additional milestones | Rail Arrived | Unknown | -| Additional milestones | Rail Unloaded | Unknown | -| Additional milestones | Arrived At Destination | Unknown | -| Additional milestones | Delivered | Unknown | -| Additional milestones | Estimated Arrival at Final Destination | Unknown | -| Other events | SSL LFD Changed | Unknown | -| Other events | Estimated Arrival | Unknown | -| Other events | Booking Cancelled | Unknown | - -## SeaLead - -SCAC `SQQY`. - -| Section | Feature | Coverage | -| --- | --- | --- | -| Tracking identifiers | Bill Of Lading | Supported | -| Tracking identifiers | Booking Number | Supported | -| Tracking identifiers | Container Number | Supported | -| Origin | POL Name | Unknown | -| Origin | POL Locode | Unknown | -| Origin | POL Timezone | Unknown | -| Origin | POL ETD | Unknown | -| Origin | POL ATD | Unknown | -| Destination port | POD Name | Unknown | -| Destination port | POD Locode | Unknown | -| Destination port | POD Terminal | Unknown | -| Destination port | POD Timezone | Unknown | -| Destination port | POD Voyage Number | Unknown | -| Destination port | POD Vessel Name | Unknown | -| Destination port | POD Vessel IMO | Unknown | -| Destination port | POD ETA | Unknown | -| Destination port | POD ATA | Unknown | -| Inland destination | Destination Name | Unknown | -| Inland destination | Destination Locode | Unknown | -| Inland destination | Destination Timezone | Unknown | -| Inland destination | Destination ETA | Unknown | -| Inland destination | Destination ATA | Unknown | -| Container attributes | Number | Unknown | -| Container attributes | Seal Number | Unknown | -| Container attributes | Equipment Type | Unknown | -| Container attributes | Equipment Length | Unknown | -| Container attributes | Equipment Height | Unknown | -| Container attributes | Weight (Lbs) | Unknown | -| Container attributes | POD Arrived At | Unknown | -| Container attributes | POD Discharged At | Unknown | -| Container attributes | POD Full Out At | Unknown | -| Container attributes | Destination Arrived At | Unknown | -| Container attributes | Destination Full Out At | Unknown | -| Container attributes | Empty Terminated At | Unknown | -| Container milestones | Empty Out | Unknown | -| Container milestones | Full In | Unknown | -| Container milestones | Vessel Loaded | Unknown | -| Container milestones | Vessel Departed | Unknown | -| Container milestones | Transshipment Arrived | Unknown | -| Container milestones | Transshipment Discharged | Unknown | -| Container milestones | Transshipment Loaded | Unknown | -| Container milestones | Transshipment Departed | Unknown | -| Container milestones | Vessel Arrived | Unknown | -| Container milestones | Vessel Berthed | Unknown | -| Container milestones | Vessel Discharged | Unknown | -| Container milestones | Full Out | Unknown | -| Container milestones | Empty Returned | Unknown | -| Additional milestones | Feeder Arrived | Unknown | -| Additional milestones | Feeder Discharged | Unknown | -| Additional milestones | Feeder Loaded | Unknown | -| Additional milestones | Feeder Departed | Unknown | -| Additional milestones | Rail Loaded | Unknown | -| Additional milestones | Rail Departed | Unknown | -| Additional milestones | Rail Arrived | Unknown | -| Additional milestones | Rail Unloaded | Unknown | -| Additional milestones | Arrived At Destination | Unknown | -| Additional milestones | Delivered | Unknown | -| Additional milestones | Estimated Arrival at Final Destination | Unknown | -| Other events | SSL LFD Changed | Unknown | -| Other events | Estimated Arrival | Unknown | -| Other events | Booking Cancelled | Unknown | - ## Seth Shipping SCAC `SSPH`. diff --git a/docs/coverage/terminals.mdx b/docs/coverage/terminals.mdx index 4448bb3f..cd657e86 100644 --- a/docs/coverage/terminals.mdx +++ b/docs/coverage/terminals.mdx @@ -140,13 +140,13 @@ Brisbane, Australia. Port UN/LOCODE `AUBNE`. SMDG code: `DPBNE`. FIRMS code: Not | --- | --- | --- | | Container milestones | Import milestones | Supported | | Pickup & availability | Available for pickup | Unknown | -| Pickup & availability | Terminal LFD | Unknown | +| Pickup & availability | Terminal LFD | Supported | | Holds & fees | Holds & releases | Unknown | | Holds & fees | Fee type | Unknown | | Holds & fees | Fee amount | Unknown | | Gate & yard | Pickup appointment | Unknown | | Gate & yard | Yard location | Unknown | -| Container milestones | Vessel discharged | Unknown | +| Container milestones | Vessel discharged | Supported | | Container milestones | Full out | Unknown | | Gate & yard | Chassis number | Unknown | | Container milestones | On rail | Unknown | @@ -180,13 +180,13 @@ Fremantle, Australia. Port UN/LOCODE `AUFRE`. SMDG code: `CONFR`. FIRMS code: No | --- | --- | --- | | Container milestones | Import milestones | Supported | | Pickup & availability | Available for pickup | Unknown | -| Pickup & availability | Terminal LFD | Unknown | +| Pickup & availability | Terminal LFD | Supported | | Holds & fees | Holds & releases | Unknown | | Holds & fees | Fee type | Unknown | | Holds & fees | Fee amount | Unknown | | Gate & yard | Pickup appointment | Unknown | | Gate & yard | Yard location | Unknown | -| Container milestones | Vessel discharged | Unknown | +| Container milestones | Vessel discharged | Supported | | Container milestones | Full out | Unknown | | Gate & yard | Chassis number | Unknown | | Container milestones | On rail | Unknown | @@ -280,13 +280,13 @@ Sydney, Australia. Port UN/LOCODE `AUSYD`. SMDG code: `CTLPB`. FIRMS code: Not a | --- | --- | --- | | Container milestones | Import milestones | Supported | | Pickup & availability | Available for pickup | Unknown | -| Pickup & availability | Terminal LFD | Unknown | +| Pickup & availability | Terminal LFD | Supported | | Holds & fees | Holds & releases | Unknown | | Holds & fees | Fee type | Unknown | | Holds & fees | Fee amount | Unknown | | Gate & yard | Pickup appointment | Unknown | | Gate & yard | Yard location | Unknown | -| Container milestones | Vessel discharged | Unknown | +| Container milestones | Vessel discharged | Supported | | Container milestones | Full out | Unknown | | Gate & yard | Chassis number | Unknown | | Container milestones | On rail | Unknown | diff --git a/docs/data/coverage/coverage.json b/docs/data/coverage/coverage.json index 2bb98fdd..d58b9479 100644 --- a/docs/data/coverage/coverage.json +++ b/docs/data/coverage/coverage.json @@ -532,13 +532,13 @@ "features": { "importMilestones": "supported", "availableForPickup": "unknown", - "lastFreeDay": "unknown", + "lastFreeDay": "supported", "holds": "unknown", "feeType": "unknown", "feeAmount": "unknown", "pickupAppointment": "unknown", "yardLocation": "unknown", - "vesselDischarged": "unknown", + "vesselDischarged": "supported", "fullOut": "unknown", "chassisNumber": "unknown", "onRail": "unknown", @@ -582,13 +582,13 @@ "features": { "importMilestones": "supported", "availableForPickup": "unknown", - "lastFreeDay": "unknown", + "lastFreeDay": "supported", "holds": "unknown", "feeType": "unknown", "feeAmount": "unknown", "pickupAppointment": "unknown", "yardLocation": "unknown", - "vesselDischarged": "unknown", + "vesselDischarged": "supported", "fullOut": "unknown", "chassisNumber": "unknown", "onRail": "unknown", @@ -707,13 +707,13 @@ "features": { "importMilestones": "supported", "availableForPickup": "unknown", - "lastFreeDay": "unknown", + "lastFreeDay": "supported", "holds": "unknown", "feeType": "unknown", "feeAmount": "unknown", "pickupAppointment": "unknown", "yardLocation": "unknown", - "vesselDischarged": "unknown", + "vesselDischarged": "supported", "fullOut": "unknown", "chassisNumber": "unknown", "onRail": "unknown", @@ -5373,86 +5373,16 @@ "bookingCancelled": "unsupported" } }, - { - "name": "Safmarine", - "legalName": "Safmarine Container Line", - "scac": "SAFM", - "alternativeScacs": [], - "access": "public", - "features": { - "billOfLading": "supported", - "bookingNumber": "supported", - "containerNumber": "unsupported", - "polName": "unknown", - "polLocode": "unknown", - "polTimezone": "unknown", - "polEtd": "unknown", - "polAtd": "unknown", - "podName": "unknown", - "podLocode": "unknown", - "podTerminal": "unknown", - "podTimezone": "unknown", - "podVoyageNumber": "unknown", - "podVesselName": "unknown", - "podVesselImo": "unknown", - "podEta": "unknown", - "podAta": "unknown", - "destinationName": "unknown", - "destinationLocode": "unknown", - "destinationTimezone": "unknown", - "destinationEta": "unknown", - "destinationAta": "unknown", - "number": "unknown", - "sealNumber": "unknown", - "equipmentType": "unknown", - "equipmentLength": "unknown", - "equipmentHeight": "unknown", - "weightLbs": "unknown", - "podArrivedAt": "unknown", - "podDischargedAt": "unknown", - "podFullOutAt": "unknown", - "destinationArrivedAt": "unknown", - "destinationFullOutAt": "unknown", - "emptyTerminatedAt": "unknown", - "emptyOut": "unknown", - "fullIn": "unknown", - "vesselLoaded": "unknown", - "vesselDeparted": "unknown", - "transshipmentArrived": "unknown", - "transshipmentDischarged": "unknown", - "transshipmentLoaded": "unknown", - "transshipmentDeparted": "unknown", - "vesselArrived": "unknown", - "vesselBerthed": "unknown", - "vesselDischarged": "unknown", - "fullOut": "unknown", - "emptyReturned": "unknown", - "feederArrived": "unknown", - "feederDischarged": "unknown", - "feederLoaded": "unknown", - "feederDeparted": "unknown", - "railLoaded": "unknown", - "railDeparted": "unknown", - "railArrived": "unknown", - "railUnloaded": "unknown", - "arrivedAtDestination": "unknown", - "delivered": "unknown", - "estimatedArrivalAtFinalDestination": "unknown", - "sslLfdChanged": "unknown", - "estimatedArrival": "unknown", - "bookingCancelled": "unknown" - } - }, { "name": "Seaboard Marine", "legalName": "Seaboard Marine", "scac": "SMLU", "alternativeScacs": [], - "access": "account", + "access": "public", "features": { "billOfLading": "supported", "bookingNumber": "supported", - "containerNumber": "unsupported", + "containerNumber": "supported", "polName": "unknown", "polLocode": "unknown", "polTimezone": "unknown", @@ -5585,148 +5515,6 @@ "bookingCancelled": "unsupported" } }, - { - "name": "Sealand Europe", - "legalName": "Sealand Europe", - "scac": "SEJJ", - "alternativeScacs": [], - "access": "public", - "features": { - "billOfLading": "supported", - "bookingNumber": "supported", - "containerNumber": "supported", - "polName": "unknown", - "polLocode": "unknown", - "polTimezone": "unknown", - "polEtd": "unknown", - "polAtd": "unknown", - "podName": "unknown", - "podLocode": "unknown", - "podTerminal": "unknown", - "podTimezone": "unknown", - "podVoyageNumber": "unknown", - "podVesselName": "unknown", - "podVesselImo": "unknown", - "podEta": "unknown", - "podAta": "unknown", - "destinationName": "unknown", - "destinationLocode": "unknown", - "destinationTimezone": "unknown", - "destinationEta": "unknown", - "destinationAta": "unknown", - "number": "unknown", - "sealNumber": "unknown", - "equipmentType": "unknown", - "equipmentLength": "unknown", - "equipmentHeight": "unknown", - "weightLbs": "unknown", - "podArrivedAt": "unknown", - "podDischargedAt": "unknown", - "podFullOutAt": "unknown", - "destinationArrivedAt": "unknown", - "destinationFullOutAt": "unknown", - "emptyTerminatedAt": "unknown", - "emptyOut": "unknown", - "fullIn": "unknown", - "vesselLoaded": "unknown", - "vesselDeparted": "unknown", - "transshipmentArrived": "unknown", - "transshipmentDischarged": "unknown", - "transshipmentLoaded": "unknown", - "transshipmentDeparted": "unknown", - "vesselArrived": "unknown", - "vesselBerthed": "unknown", - "vesselDischarged": "unknown", - "fullOut": "unknown", - "emptyReturned": "unknown", - "feederArrived": "unknown", - "feederDischarged": "unknown", - "feederLoaded": "unknown", - "feederDeparted": "unknown", - "railLoaded": "unknown", - "railDeparted": "unknown", - "railArrived": "unknown", - "railUnloaded": "unknown", - "arrivedAtDestination": "unknown", - "delivered": "unknown", - "estimatedArrivalAtFinalDestination": "unknown", - "sslLfdChanged": "unknown", - "estimatedArrival": "unknown", - "bookingCancelled": "unknown" - } - }, - { - "name": "SeaLead", - "legalName": "SeaLead", - "scac": "SQQY", - "alternativeScacs": [ - "SJHH" - ], - "access": "public", - "features": { - "billOfLading": "supported", - "bookingNumber": "supported", - "containerNumber": "supported", - "polName": "unknown", - "polLocode": "unknown", - "polTimezone": "unknown", - "polEtd": "unknown", - "polAtd": "unknown", - "podName": "unknown", - "podLocode": "unknown", - "podTerminal": "unknown", - "podTimezone": "unknown", - "podVoyageNumber": "unknown", - "podVesselName": "unknown", - "podVesselImo": "unknown", - "podEta": "unknown", - "podAta": "unknown", - "destinationName": "unknown", - "destinationLocode": "unknown", - "destinationTimezone": "unknown", - "destinationEta": "unknown", - "destinationAta": "unknown", - "number": "unknown", - "sealNumber": "unknown", - "equipmentType": "unknown", - "equipmentLength": "unknown", - "equipmentHeight": "unknown", - "weightLbs": "unknown", - "podArrivedAt": "unknown", - "podDischargedAt": "unknown", - "podFullOutAt": "unknown", - "destinationArrivedAt": "unknown", - "destinationFullOutAt": "unknown", - "emptyTerminatedAt": "unknown", - "emptyOut": "unknown", - "fullIn": "unknown", - "vesselLoaded": "unknown", - "vesselDeparted": "unknown", - "transshipmentArrived": "unknown", - "transshipmentDischarged": "unknown", - "transshipmentLoaded": "unknown", - "transshipmentDeparted": "unknown", - "vesselArrived": "unknown", - "vesselBerthed": "unknown", - "vesselDischarged": "unknown", - "fullOut": "unknown", - "emptyReturned": "unknown", - "feederArrived": "unknown", - "feederDischarged": "unknown", - "feederLoaded": "unknown", - "feederDeparted": "unknown", - "railLoaded": "unknown", - "railDeparted": "unknown", - "railArrived": "unknown", - "railUnloaded": "unknown", - "arrivedAtDestination": "unknown", - "delivered": "unknown", - "estimatedArrivalAtFinalDestination": "unknown", - "sslLfdChanged": "unknown", - "estimatedArrival": "unknown", - "bookingCancelled": "unknown" - } - }, { "name": "Seth Shipping", "legalName": "Seth Shipping", diff --git a/docs/data/coverage/shipping-lines.csv b/docs/data/coverage/shipping-lines.csv index 29077fca..e287b10b 100644 --- a/docs/data/coverage/shipping-lines.csv +++ b/docs/data/coverage/shipping-lines.csv @@ -1280,128 +1280,67 @@ "PIL","PCIU","public","","","","","","","sslLfdChanged","SSL LFD Changed","Other events","unsupported","2026-10-13" "PIL","PCIU","public","","","","","","","estimatedArrival","Estimated Arrival","Other events","supported","2026-10-13" "PIL","PCIU","public","","","","","","","bookingCancelled","Booking Cancelled","Other events","unsupported","2026-10-13" -"Safmarine","SAFM","public","","","","","","","billOfLading","Bill Of Lading","Tracking identifiers","supported","2026-10-13" -"Safmarine","SAFM","public","","","","","","","bookingNumber","Booking Number","Tracking identifiers","supported","2026-10-13" -"Safmarine","SAFM","public","","","","","","","containerNumber","Container Number","Tracking identifiers","unsupported","2026-10-13" -"Safmarine","SAFM","public","","","","","","","polName","POL Name","Origin","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","polLocode","POL Locode","Origin","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","polTimezone","POL Timezone","Origin","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","polEtd","POL ETD","Origin","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","polAtd","POL ATD","Origin","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","podName","POD Name","Destination port","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","podLocode","POD Locode","Destination port","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","podTerminal","POD Terminal","Destination port","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","podTimezone","POD Timezone","Destination port","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","podVoyageNumber","POD Voyage Number","Destination port","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","podVesselName","POD Vessel Name","Destination port","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","podVesselImo","POD Vessel IMO","Destination port","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","podEta","POD ETA","Destination port","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","podAta","POD ATA","Destination port","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","destinationName","Destination Name","Inland destination","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","destinationLocode","Destination Locode","Inland destination","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","destinationTimezone","Destination Timezone","Inland destination","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","destinationEta","Destination ETA","Inland destination","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","destinationAta","Destination ATA","Inland destination","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","number","Number","Container attributes","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","sealNumber","Seal Number","Container attributes","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","equipmentType","Equipment Type","Container attributes","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","equipmentLength","Equipment Length","Container attributes","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","equipmentHeight","Equipment Height","Container attributes","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","weightLbs","Weight (Lbs)","Container attributes","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","podArrivedAt","POD Arrived At","Container attributes","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","podDischargedAt","POD Discharged At","Container attributes","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","podFullOutAt","POD Full Out At","Container attributes","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","destinationArrivedAt","Destination Arrived At","Container attributes","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","destinationFullOutAt","Destination Full Out At","Container attributes","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","emptyTerminatedAt","Empty Terminated At","Container attributes","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","emptyOut","Empty Out","Container milestones","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","fullIn","Full In","Container milestones","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","vesselLoaded","Vessel Loaded","Container milestones","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","vesselDeparted","Vessel Departed","Container milestones","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","transshipmentArrived","Transshipment Arrived","Container milestones","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","transshipmentDischarged","Transshipment Discharged","Container milestones","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","transshipmentLoaded","Transshipment Loaded","Container milestones","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","transshipmentDeparted","Transshipment Departed","Container milestones","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","vesselArrived","Vessel Arrived","Container milestones","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","vesselBerthed","Vessel Berthed","Container milestones","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","vesselDischarged","Vessel Discharged","Container milestones","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","fullOut","Full Out","Container milestones","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","emptyReturned","Empty Returned","Container milestones","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","feederArrived","Feeder Arrived","Additional milestones","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","feederDischarged","Feeder Discharged","Additional milestones","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","feederLoaded","Feeder Loaded","Additional milestones","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","feederDeparted","Feeder Departed","Additional milestones","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","railLoaded","Rail Loaded","Additional milestones","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","railDeparted","Rail Departed","Additional milestones","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","railArrived","Rail Arrived","Additional milestones","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","railUnloaded","Rail Unloaded","Additional milestones","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","arrivedAtDestination","Arrived At Destination","Additional milestones","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","delivered","Delivered","Additional milestones","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","estimatedArrivalAtFinalDestination","Estimated Arrival at Final Destination","Additional milestones","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","sslLfdChanged","SSL LFD Changed","Other events","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","estimatedArrival","Estimated Arrival","Other events","unknown","2026-10-13" -"Safmarine","SAFM","public","","","","","","","bookingCancelled","Booking Cancelled","Other events","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","billOfLading","Bill Of Lading","Tracking identifiers","supported","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","bookingNumber","Booking Number","Tracking identifiers","supported","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","containerNumber","Container Number","Tracking identifiers","unsupported","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","polName","POL Name","Origin","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","polLocode","POL Locode","Origin","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","polTimezone","POL Timezone","Origin","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","polEtd","POL ETD","Origin","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","polAtd","POL ATD","Origin","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","podName","POD Name","Destination port","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","podLocode","POD Locode","Destination port","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","podTerminal","POD Terminal","Destination port","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","podTimezone","POD Timezone","Destination port","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","podVoyageNumber","POD Voyage Number","Destination port","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","podVesselName","POD Vessel Name","Destination port","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","podVesselImo","POD Vessel IMO","Destination port","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","podEta","POD ETA","Destination port","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","podAta","POD ATA","Destination port","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","destinationName","Destination Name","Inland destination","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","destinationLocode","Destination Locode","Inland destination","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","destinationTimezone","Destination Timezone","Inland destination","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","destinationEta","Destination ETA","Inland destination","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","destinationAta","Destination ATA","Inland destination","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","number","Number","Container attributes","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","sealNumber","Seal Number","Container attributes","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","equipmentType","Equipment Type","Container attributes","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","equipmentLength","Equipment Length","Container attributes","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","equipmentHeight","Equipment Height","Container attributes","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","weightLbs","Weight (Lbs)","Container attributes","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","podArrivedAt","POD Arrived At","Container attributes","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","podDischargedAt","POD Discharged At","Container attributes","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","podFullOutAt","POD Full Out At","Container attributes","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","destinationArrivedAt","Destination Arrived At","Container attributes","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","destinationFullOutAt","Destination Full Out At","Container attributes","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","emptyTerminatedAt","Empty Terminated At","Container attributes","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","emptyOut","Empty Out","Container milestones","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","fullIn","Full In","Container milestones","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","vesselLoaded","Vessel Loaded","Container milestones","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","vesselDeparted","Vessel Departed","Container milestones","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","transshipmentArrived","Transshipment Arrived","Container milestones","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","transshipmentDischarged","Transshipment Discharged","Container milestones","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","transshipmentLoaded","Transshipment Loaded","Container milestones","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","transshipmentDeparted","Transshipment Departed","Container milestones","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","vesselArrived","Vessel Arrived","Container milestones","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","vesselBerthed","Vessel Berthed","Container milestones","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","vesselDischarged","Vessel Discharged","Container milestones","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","fullOut","Full Out","Container milestones","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","emptyReturned","Empty Returned","Container milestones","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","feederArrived","Feeder Arrived","Additional milestones","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","feederDischarged","Feeder Discharged","Additional milestones","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","feederLoaded","Feeder Loaded","Additional milestones","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","feederDeparted","Feeder Departed","Additional milestones","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","railLoaded","Rail Loaded","Additional milestones","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","railDeparted","Rail Departed","Additional milestones","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","railArrived","Rail Arrived","Additional milestones","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","railUnloaded","Rail Unloaded","Additional milestones","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","arrivedAtDestination","Arrived At Destination","Additional milestones","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","delivered","Delivered","Additional milestones","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","estimatedArrivalAtFinalDestination","Estimated Arrival at Final Destination","Additional milestones","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","sslLfdChanged","SSL LFD Changed","Other events","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","estimatedArrival","Estimated Arrival","Other events","unknown","2026-10-13" -"Seaboard Marine","SMLU","account","","","","","","","bookingCancelled","Booking Cancelled","Other events","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","billOfLading","Bill Of Lading","Tracking identifiers","supported","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","bookingNumber","Booking Number","Tracking identifiers","supported","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","containerNumber","Container Number","Tracking identifiers","supported","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","polName","POL Name","Origin","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","polLocode","POL Locode","Origin","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","polTimezone","POL Timezone","Origin","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","polEtd","POL ETD","Origin","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","polAtd","POL ATD","Origin","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","podName","POD Name","Destination port","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","podLocode","POD Locode","Destination port","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","podTerminal","POD Terminal","Destination port","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","podTimezone","POD Timezone","Destination port","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","podVoyageNumber","POD Voyage Number","Destination port","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","podVesselName","POD Vessel Name","Destination port","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","podVesselImo","POD Vessel IMO","Destination port","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","podEta","POD ETA","Destination port","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","podAta","POD ATA","Destination port","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","destinationName","Destination Name","Inland destination","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","destinationLocode","Destination Locode","Inland destination","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","destinationTimezone","Destination Timezone","Inland destination","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","destinationEta","Destination ETA","Inland destination","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","destinationAta","Destination ATA","Inland destination","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","number","Number","Container attributes","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","sealNumber","Seal Number","Container attributes","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","equipmentType","Equipment Type","Container attributes","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","equipmentLength","Equipment Length","Container attributes","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","equipmentHeight","Equipment Height","Container attributes","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","weightLbs","Weight (Lbs)","Container attributes","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","podArrivedAt","POD Arrived At","Container attributes","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","podDischargedAt","POD Discharged At","Container attributes","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","podFullOutAt","POD Full Out At","Container attributes","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","destinationArrivedAt","Destination Arrived At","Container attributes","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","destinationFullOutAt","Destination Full Out At","Container attributes","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","emptyTerminatedAt","Empty Terminated At","Container attributes","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","emptyOut","Empty Out","Container milestones","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","fullIn","Full In","Container milestones","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","vesselLoaded","Vessel Loaded","Container milestones","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","vesselDeparted","Vessel Departed","Container milestones","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","transshipmentArrived","Transshipment Arrived","Container milestones","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","transshipmentDischarged","Transshipment Discharged","Container milestones","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","transshipmentLoaded","Transshipment Loaded","Container milestones","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","transshipmentDeparted","Transshipment Departed","Container milestones","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","vesselArrived","Vessel Arrived","Container milestones","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","vesselBerthed","Vessel Berthed","Container milestones","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","vesselDischarged","Vessel Discharged","Container milestones","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","fullOut","Full Out","Container milestones","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","emptyReturned","Empty Returned","Container milestones","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","feederArrived","Feeder Arrived","Additional milestones","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","feederDischarged","Feeder Discharged","Additional milestones","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","feederLoaded","Feeder Loaded","Additional milestones","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","feederDeparted","Feeder Departed","Additional milestones","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","railLoaded","Rail Loaded","Additional milestones","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","railDeparted","Rail Departed","Additional milestones","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","railArrived","Rail Arrived","Additional milestones","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","railUnloaded","Rail Unloaded","Additional milestones","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","arrivedAtDestination","Arrived At Destination","Additional milestones","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","delivered","Delivered","Additional milestones","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","estimatedArrivalAtFinalDestination","Estimated Arrival at Final Destination","Additional milestones","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","sslLfdChanged","SSL LFD Changed","Other events","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","estimatedArrival","Estimated Arrival","Other events","unknown","2026-10-13" +"Seaboard Marine","SMLU","public","","","","","","","bookingCancelled","Booking Cancelled","Other events","unknown","2026-10-13" "Sealand Americas","SEAU","public","","","","","","","billOfLading","Bill Of Lading","Tracking identifiers","supported","2026-10-13" "Sealand Americas","SEAU","public","","","","","","","bookingNumber","Booking Number","Tracking identifiers","supported","2026-10-13" "Sealand Americas","SEAU","public","","","","","","","containerNumber","Container Number","Tracking identifiers","supported","2026-10-13" @@ -1463,128 +1402,6 @@ "Sealand Americas","SEAU","public","","","","","","","sslLfdChanged","SSL LFD Changed","Other events","unsupported","2026-10-13" "Sealand Americas","SEAU","public","","","","","","","estimatedArrival","Estimated Arrival","Other events","supported","2026-10-13" "Sealand Americas","SEAU","public","","","","","","","bookingCancelled","Booking Cancelled","Other events","unsupported","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","billOfLading","Bill Of Lading","Tracking identifiers","supported","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","bookingNumber","Booking Number","Tracking identifiers","supported","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","containerNumber","Container Number","Tracking identifiers","supported","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","polName","POL Name","Origin","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","polLocode","POL Locode","Origin","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","polTimezone","POL Timezone","Origin","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","polEtd","POL ETD","Origin","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","polAtd","POL ATD","Origin","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","podName","POD Name","Destination port","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","podLocode","POD Locode","Destination port","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","podTerminal","POD Terminal","Destination port","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","podTimezone","POD Timezone","Destination port","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","podVoyageNumber","POD Voyage Number","Destination port","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","podVesselName","POD Vessel Name","Destination port","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","podVesselImo","POD Vessel IMO","Destination port","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","podEta","POD ETA","Destination port","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","podAta","POD ATA","Destination port","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","destinationName","Destination Name","Inland destination","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","destinationLocode","Destination Locode","Inland destination","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","destinationTimezone","Destination Timezone","Inland destination","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","destinationEta","Destination ETA","Inland destination","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","destinationAta","Destination ATA","Inland destination","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","number","Number","Container attributes","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","sealNumber","Seal Number","Container attributes","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","equipmentType","Equipment Type","Container attributes","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","equipmentLength","Equipment Length","Container attributes","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","equipmentHeight","Equipment Height","Container attributes","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","weightLbs","Weight (Lbs)","Container attributes","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","podArrivedAt","POD Arrived At","Container attributes","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","podDischargedAt","POD Discharged At","Container attributes","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","podFullOutAt","POD Full Out At","Container attributes","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","destinationArrivedAt","Destination Arrived At","Container attributes","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","destinationFullOutAt","Destination Full Out At","Container attributes","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","emptyTerminatedAt","Empty Terminated At","Container attributes","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","emptyOut","Empty Out","Container milestones","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","fullIn","Full In","Container milestones","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","vesselLoaded","Vessel Loaded","Container milestones","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","vesselDeparted","Vessel Departed","Container milestones","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","transshipmentArrived","Transshipment Arrived","Container milestones","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","transshipmentDischarged","Transshipment Discharged","Container milestones","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","transshipmentLoaded","Transshipment Loaded","Container milestones","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","transshipmentDeparted","Transshipment Departed","Container milestones","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","vesselArrived","Vessel Arrived","Container milestones","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","vesselBerthed","Vessel Berthed","Container milestones","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","vesselDischarged","Vessel Discharged","Container milestones","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","fullOut","Full Out","Container milestones","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","emptyReturned","Empty Returned","Container milestones","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","feederArrived","Feeder Arrived","Additional milestones","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","feederDischarged","Feeder Discharged","Additional milestones","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","feederLoaded","Feeder Loaded","Additional milestones","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","feederDeparted","Feeder Departed","Additional milestones","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","railLoaded","Rail Loaded","Additional milestones","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","railDeparted","Rail Departed","Additional milestones","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","railArrived","Rail Arrived","Additional milestones","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","railUnloaded","Rail Unloaded","Additional milestones","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","arrivedAtDestination","Arrived At Destination","Additional milestones","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","delivered","Delivered","Additional milestones","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","estimatedArrivalAtFinalDestination","Estimated Arrival at Final Destination","Additional milestones","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","sslLfdChanged","SSL LFD Changed","Other events","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","estimatedArrival","Estimated Arrival","Other events","unknown","2026-10-13" -"Sealand Europe","SEJJ","public","","","","","","","bookingCancelled","Booking Cancelled","Other events","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","billOfLading","Bill Of Lading","Tracking identifiers","supported","2026-10-13" -"SeaLead","SQQY","public","","","","","","","bookingNumber","Booking Number","Tracking identifiers","supported","2026-10-13" -"SeaLead","SQQY","public","","","","","","","containerNumber","Container Number","Tracking identifiers","supported","2026-10-13" -"SeaLead","SQQY","public","","","","","","","polName","POL Name","Origin","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","polLocode","POL Locode","Origin","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","polTimezone","POL Timezone","Origin","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","polEtd","POL ETD","Origin","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","polAtd","POL ATD","Origin","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","podName","POD Name","Destination port","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","podLocode","POD Locode","Destination port","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","podTerminal","POD Terminal","Destination port","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","podTimezone","POD Timezone","Destination port","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","podVoyageNumber","POD Voyage Number","Destination port","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","podVesselName","POD Vessel Name","Destination port","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","podVesselImo","POD Vessel IMO","Destination port","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","podEta","POD ETA","Destination port","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","podAta","POD ATA","Destination port","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","destinationName","Destination Name","Inland destination","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","destinationLocode","Destination Locode","Inland destination","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","destinationTimezone","Destination Timezone","Inland destination","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","destinationEta","Destination ETA","Inland destination","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","destinationAta","Destination ATA","Inland destination","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","number","Number","Container attributes","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","sealNumber","Seal Number","Container attributes","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","equipmentType","Equipment Type","Container attributes","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","equipmentLength","Equipment Length","Container attributes","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","equipmentHeight","Equipment Height","Container attributes","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","weightLbs","Weight (Lbs)","Container attributes","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","podArrivedAt","POD Arrived At","Container attributes","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","podDischargedAt","POD Discharged At","Container attributes","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","podFullOutAt","POD Full Out At","Container attributes","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","destinationArrivedAt","Destination Arrived At","Container attributes","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","destinationFullOutAt","Destination Full Out At","Container attributes","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","emptyTerminatedAt","Empty Terminated At","Container attributes","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","emptyOut","Empty Out","Container milestones","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","fullIn","Full In","Container milestones","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","vesselLoaded","Vessel Loaded","Container milestones","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","vesselDeparted","Vessel Departed","Container milestones","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","transshipmentArrived","Transshipment Arrived","Container milestones","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","transshipmentDischarged","Transshipment Discharged","Container milestones","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","transshipmentLoaded","Transshipment Loaded","Container milestones","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","transshipmentDeparted","Transshipment Departed","Container milestones","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","vesselArrived","Vessel Arrived","Container milestones","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","vesselBerthed","Vessel Berthed","Container milestones","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","vesselDischarged","Vessel Discharged","Container milestones","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","fullOut","Full Out","Container milestones","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","emptyReturned","Empty Returned","Container milestones","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","feederArrived","Feeder Arrived","Additional milestones","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","feederDischarged","Feeder Discharged","Additional milestones","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","feederLoaded","Feeder Loaded","Additional milestones","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","feederDeparted","Feeder Departed","Additional milestones","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","railLoaded","Rail Loaded","Additional milestones","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","railDeparted","Rail Departed","Additional milestones","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","railArrived","Rail Arrived","Additional milestones","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","railUnloaded","Rail Unloaded","Additional milestones","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","arrivedAtDestination","Arrived At Destination","Additional milestones","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","delivered","Delivered","Additional milestones","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","estimatedArrivalAtFinalDestination","Estimated Arrival at Final Destination","Additional milestones","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","sslLfdChanged","SSL LFD Changed","Other events","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","estimatedArrival","Estimated Arrival","Other events","unknown","2026-10-13" -"SeaLead","SQQY","public","","","","","","","bookingCancelled","Booking Cancelled","Other events","unknown","2026-10-13" "Seth Shipping","SSPH","public","","","","","","","billOfLading","Bill Of Lading","Tracking identifiers","supported","2026-10-13" "Seth Shipping","SSPH","public","","","","","","","bookingNumber","Booking Number","Tracking identifiers","supported","2026-10-13" "Seth Shipping","SSPH","public","","","","","","","containerNumber","Container Number","Tracking identifiers","unsupported","2026-10-13" diff --git a/docs/data/coverage/shipping-lines.json b/docs/data/coverage/shipping-lines.json index d18d9a7e..15aefe7f 100644 --- a/docs/data/coverage/shipping-lines.json +++ b/docs/data/coverage/shipping-lines.json @@ -1782,86 +1782,16 @@ "bookingCancelled": "unsupported" } }, - { - "name": "Safmarine", - "legalName": "Safmarine Container Line", - "scac": "SAFM", - "alternativeScacs": [], - "access": "public", - "features": { - "billOfLading": "supported", - "bookingNumber": "supported", - "containerNumber": "unsupported", - "polName": "unknown", - "polLocode": "unknown", - "polTimezone": "unknown", - "polEtd": "unknown", - "polAtd": "unknown", - "podName": "unknown", - "podLocode": "unknown", - "podTerminal": "unknown", - "podTimezone": "unknown", - "podVoyageNumber": "unknown", - "podVesselName": "unknown", - "podVesselImo": "unknown", - "podEta": "unknown", - "podAta": "unknown", - "destinationName": "unknown", - "destinationLocode": "unknown", - "destinationTimezone": "unknown", - "destinationEta": "unknown", - "destinationAta": "unknown", - "number": "unknown", - "sealNumber": "unknown", - "equipmentType": "unknown", - "equipmentLength": "unknown", - "equipmentHeight": "unknown", - "weightLbs": "unknown", - "podArrivedAt": "unknown", - "podDischargedAt": "unknown", - "podFullOutAt": "unknown", - "destinationArrivedAt": "unknown", - "destinationFullOutAt": "unknown", - "emptyTerminatedAt": "unknown", - "emptyOut": "unknown", - "fullIn": "unknown", - "vesselLoaded": "unknown", - "vesselDeparted": "unknown", - "transshipmentArrived": "unknown", - "transshipmentDischarged": "unknown", - "transshipmentLoaded": "unknown", - "transshipmentDeparted": "unknown", - "vesselArrived": "unknown", - "vesselBerthed": "unknown", - "vesselDischarged": "unknown", - "fullOut": "unknown", - "emptyReturned": "unknown", - "feederArrived": "unknown", - "feederDischarged": "unknown", - "feederLoaded": "unknown", - "feederDeparted": "unknown", - "railLoaded": "unknown", - "railDeparted": "unknown", - "railArrived": "unknown", - "railUnloaded": "unknown", - "arrivedAtDestination": "unknown", - "delivered": "unknown", - "estimatedArrivalAtFinalDestination": "unknown", - "sslLfdChanged": "unknown", - "estimatedArrival": "unknown", - "bookingCancelled": "unknown" - } - }, { "name": "Seaboard Marine", "legalName": "Seaboard Marine", "scac": "SMLU", "alternativeScacs": [], - "access": "account", + "access": "public", "features": { "billOfLading": "supported", "bookingNumber": "supported", - "containerNumber": "unsupported", + "containerNumber": "supported", "polName": "unknown", "polLocode": "unknown", "polTimezone": "unknown", @@ -1994,148 +1924,6 @@ "bookingCancelled": "unsupported" } }, - { - "name": "Sealand Europe", - "legalName": "Sealand Europe", - "scac": "SEJJ", - "alternativeScacs": [], - "access": "public", - "features": { - "billOfLading": "supported", - "bookingNumber": "supported", - "containerNumber": "supported", - "polName": "unknown", - "polLocode": "unknown", - "polTimezone": "unknown", - "polEtd": "unknown", - "polAtd": "unknown", - "podName": "unknown", - "podLocode": "unknown", - "podTerminal": "unknown", - "podTimezone": "unknown", - "podVoyageNumber": "unknown", - "podVesselName": "unknown", - "podVesselImo": "unknown", - "podEta": "unknown", - "podAta": "unknown", - "destinationName": "unknown", - "destinationLocode": "unknown", - "destinationTimezone": "unknown", - "destinationEta": "unknown", - "destinationAta": "unknown", - "number": "unknown", - "sealNumber": "unknown", - "equipmentType": "unknown", - "equipmentLength": "unknown", - "equipmentHeight": "unknown", - "weightLbs": "unknown", - "podArrivedAt": "unknown", - "podDischargedAt": "unknown", - "podFullOutAt": "unknown", - "destinationArrivedAt": "unknown", - "destinationFullOutAt": "unknown", - "emptyTerminatedAt": "unknown", - "emptyOut": "unknown", - "fullIn": "unknown", - "vesselLoaded": "unknown", - "vesselDeparted": "unknown", - "transshipmentArrived": "unknown", - "transshipmentDischarged": "unknown", - "transshipmentLoaded": "unknown", - "transshipmentDeparted": "unknown", - "vesselArrived": "unknown", - "vesselBerthed": "unknown", - "vesselDischarged": "unknown", - "fullOut": "unknown", - "emptyReturned": "unknown", - "feederArrived": "unknown", - "feederDischarged": "unknown", - "feederLoaded": "unknown", - "feederDeparted": "unknown", - "railLoaded": "unknown", - "railDeparted": "unknown", - "railArrived": "unknown", - "railUnloaded": "unknown", - "arrivedAtDestination": "unknown", - "delivered": "unknown", - "estimatedArrivalAtFinalDestination": "unknown", - "sslLfdChanged": "unknown", - "estimatedArrival": "unknown", - "bookingCancelled": "unknown" - } - }, - { - "name": "SeaLead", - "legalName": "SeaLead", - "scac": "SQQY", - "alternativeScacs": [ - "SJHH" - ], - "access": "public", - "features": { - "billOfLading": "supported", - "bookingNumber": "supported", - "containerNumber": "supported", - "polName": "unknown", - "polLocode": "unknown", - "polTimezone": "unknown", - "polEtd": "unknown", - "polAtd": "unknown", - "podName": "unknown", - "podLocode": "unknown", - "podTerminal": "unknown", - "podTimezone": "unknown", - "podVoyageNumber": "unknown", - "podVesselName": "unknown", - "podVesselImo": "unknown", - "podEta": "unknown", - "podAta": "unknown", - "destinationName": "unknown", - "destinationLocode": "unknown", - "destinationTimezone": "unknown", - "destinationEta": "unknown", - "destinationAta": "unknown", - "number": "unknown", - "sealNumber": "unknown", - "equipmentType": "unknown", - "equipmentLength": "unknown", - "equipmentHeight": "unknown", - "weightLbs": "unknown", - "podArrivedAt": "unknown", - "podDischargedAt": "unknown", - "podFullOutAt": "unknown", - "destinationArrivedAt": "unknown", - "destinationFullOutAt": "unknown", - "emptyTerminatedAt": "unknown", - "emptyOut": "unknown", - "fullIn": "unknown", - "vesselLoaded": "unknown", - "vesselDeparted": "unknown", - "transshipmentArrived": "unknown", - "transshipmentDischarged": "unknown", - "transshipmentLoaded": "unknown", - "transshipmentDeparted": "unknown", - "vesselArrived": "unknown", - "vesselBerthed": "unknown", - "vesselDischarged": "unknown", - "fullOut": "unknown", - "emptyReturned": "unknown", - "feederArrived": "unknown", - "feederDischarged": "unknown", - "feederLoaded": "unknown", - "feederDeparted": "unknown", - "railLoaded": "unknown", - "railDeparted": "unknown", - "railArrived": "unknown", - "railUnloaded": "unknown", - "arrivedAtDestination": "unknown", - "delivered": "unknown", - "estimatedArrivalAtFinalDestination": "unknown", - "sslLfdChanged": "unknown", - "estimatedArrival": "unknown", - "bookingCancelled": "unknown" - } - }, { "name": "Seth Shipping", "legalName": "Seth Shipping", diff --git a/docs/data/coverage/shipping-lines.mdx b/docs/data/coverage/shipping-lines.mdx index 8c425fd9..dc7893b0 100644 --- a/docs/data/coverage/shipping-lines.mdx +++ b/docs/data/coverage/shipping-lines.mdx @@ -1441,83 +1441,15 @@ SCAC `PCIU`. | Other events | Estimated Arrival | Supported | | Other events | Booking Cancelled | Not supported | -## Safmarine - -SCAC `SAFM`. - -| Section | Feature | Coverage | -| --- | --- | --- | -| Tracking identifiers | Bill Of Lading | Supported | -| Tracking identifiers | Booking Number | Supported | -| Tracking identifiers | Container Number | Not supported | -| Origin | POL Name | Unknown | -| Origin | POL Locode | Unknown | -| Origin | POL Timezone | Unknown | -| Origin | POL ETD | Unknown | -| Origin | POL ATD | Unknown | -| Destination port | POD Name | Unknown | -| Destination port | POD Locode | Unknown | -| Destination port | POD Terminal | Unknown | -| Destination port | POD Timezone | Unknown | -| Destination port | POD Voyage Number | Unknown | -| Destination port | POD Vessel Name | Unknown | -| Destination port | POD Vessel IMO | Unknown | -| Destination port | POD ETA | Unknown | -| Destination port | POD ATA | Unknown | -| Inland destination | Destination Name | Unknown | -| Inland destination | Destination Locode | Unknown | -| Inland destination | Destination Timezone | Unknown | -| Inland destination | Destination ETA | Unknown | -| Inland destination | Destination ATA | Unknown | -| Container attributes | Number | Unknown | -| Container attributes | Seal Number | Unknown | -| Container attributes | Equipment Type | Unknown | -| Container attributes | Equipment Length | Unknown | -| Container attributes | Equipment Height | Unknown | -| Container attributes | Weight (Lbs) | Unknown | -| Container attributes | POD Arrived At | Unknown | -| Container attributes | POD Discharged At | Unknown | -| Container attributes | POD Full Out At | Unknown | -| Container attributes | Destination Arrived At | Unknown | -| Container attributes | Destination Full Out At | Unknown | -| Container attributes | Empty Terminated At | Unknown | -| Container milestones | Empty Out | Unknown | -| Container milestones | Full In | Unknown | -| Container milestones | Vessel Loaded | Unknown | -| Container milestones | Vessel Departed | Unknown | -| Container milestones | Transshipment Arrived | Unknown | -| Container milestones | Transshipment Discharged | Unknown | -| Container milestones | Transshipment Loaded | Unknown | -| Container milestones | Transshipment Departed | Unknown | -| Container milestones | Vessel Arrived | Unknown | -| Container milestones | Vessel Berthed | Unknown | -| Container milestones | Vessel Discharged | Unknown | -| Container milestones | Full Out | Unknown | -| Container milestones | Empty Returned | Unknown | -| Additional milestones | Feeder Arrived | Unknown | -| Additional milestones | Feeder Discharged | Unknown | -| Additional milestones | Feeder Loaded | Unknown | -| Additional milestones | Feeder Departed | Unknown | -| Additional milestones | Rail Loaded | Unknown | -| Additional milestones | Rail Departed | Unknown | -| Additional milestones | Rail Arrived | Unknown | -| Additional milestones | Rail Unloaded | Unknown | -| Additional milestones | Arrived At Destination | Unknown | -| Additional milestones | Delivered | Unknown | -| Additional milestones | Estimated Arrival at Final Destination | Unknown | -| Other events | SSL LFD Changed | Unknown | -| Other events | Estimated Arrival | Unknown | -| Other events | Booking Cancelled | Unknown | - ## Seaboard Marine -SCAC `SMLU`. Account enablement required. +SCAC `SMLU`. | Section | Feature | Coverage | | --- | --- | --- | | Tracking identifiers | Bill Of Lading | Supported | | Tracking identifiers | Booking Number | Supported | -| Tracking identifiers | Container Number | Not supported | +| Tracking identifiers | Container Number | Supported | | Origin | POL Name | Unknown | | Origin | POL Locode | Unknown | | Origin | POL Timezone | Unknown | @@ -1645,142 +1577,6 @@ SCAC `SEAU`. | Other events | Estimated Arrival | Supported | | Other events | Booking Cancelled | Not supported | -## Sealand Europe - -SCAC `SEJJ`. - -| Section | Feature | Coverage | -| --- | --- | --- | -| Tracking identifiers | Bill Of Lading | Supported | -| Tracking identifiers | Booking Number | Supported | -| Tracking identifiers | Container Number | Supported | -| Origin | POL Name | Unknown | -| Origin | POL Locode | Unknown | -| Origin | POL Timezone | Unknown | -| Origin | POL ETD | Unknown | -| Origin | POL ATD | Unknown | -| Destination port | POD Name | Unknown | -| Destination port | POD Locode | Unknown | -| Destination port | POD Terminal | Unknown | -| Destination port | POD Timezone | Unknown | -| Destination port | POD Voyage Number | Unknown | -| Destination port | POD Vessel Name | Unknown | -| Destination port | POD Vessel IMO | Unknown | -| Destination port | POD ETA | Unknown | -| Destination port | POD ATA | Unknown | -| Inland destination | Destination Name | Unknown | -| Inland destination | Destination Locode | Unknown | -| Inland destination | Destination Timezone | Unknown | -| Inland destination | Destination ETA | Unknown | -| Inland destination | Destination ATA | Unknown | -| Container attributes | Number | Unknown | -| Container attributes | Seal Number | Unknown | -| Container attributes | Equipment Type | Unknown | -| Container attributes | Equipment Length | Unknown | -| Container attributes | Equipment Height | Unknown | -| Container attributes | Weight (Lbs) | Unknown | -| Container attributes | POD Arrived At | Unknown | -| Container attributes | POD Discharged At | Unknown | -| Container attributes | POD Full Out At | Unknown | -| Container attributes | Destination Arrived At | Unknown | -| Container attributes | Destination Full Out At | Unknown | -| Container attributes | Empty Terminated At | Unknown | -| Container milestones | Empty Out | Unknown | -| Container milestones | Full In | Unknown | -| Container milestones | Vessel Loaded | Unknown | -| Container milestones | Vessel Departed | Unknown | -| Container milestones | Transshipment Arrived | Unknown | -| Container milestones | Transshipment Discharged | Unknown | -| Container milestones | Transshipment Loaded | Unknown | -| Container milestones | Transshipment Departed | Unknown | -| Container milestones | Vessel Arrived | Unknown | -| Container milestones | Vessel Berthed | Unknown | -| Container milestones | Vessel Discharged | Unknown | -| Container milestones | Full Out | Unknown | -| Container milestones | Empty Returned | Unknown | -| Additional milestones | Feeder Arrived | Unknown | -| Additional milestones | Feeder Discharged | Unknown | -| Additional milestones | Feeder Loaded | Unknown | -| Additional milestones | Feeder Departed | Unknown | -| Additional milestones | Rail Loaded | Unknown | -| Additional milestones | Rail Departed | Unknown | -| Additional milestones | Rail Arrived | Unknown | -| Additional milestones | Rail Unloaded | Unknown | -| Additional milestones | Arrived At Destination | Unknown | -| Additional milestones | Delivered | Unknown | -| Additional milestones | Estimated Arrival at Final Destination | Unknown | -| Other events | SSL LFD Changed | Unknown | -| Other events | Estimated Arrival | Unknown | -| Other events | Booking Cancelled | Unknown | - -## SeaLead - -SCAC `SQQY`. - -| Section | Feature | Coverage | -| --- | --- | --- | -| Tracking identifiers | Bill Of Lading | Supported | -| Tracking identifiers | Booking Number | Supported | -| Tracking identifiers | Container Number | Supported | -| Origin | POL Name | Unknown | -| Origin | POL Locode | Unknown | -| Origin | POL Timezone | Unknown | -| Origin | POL ETD | Unknown | -| Origin | POL ATD | Unknown | -| Destination port | POD Name | Unknown | -| Destination port | POD Locode | Unknown | -| Destination port | POD Terminal | Unknown | -| Destination port | POD Timezone | Unknown | -| Destination port | POD Voyage Number | Unknown | -| Destination port | POD Vessel Name | Unknown | -| Destination port | POD Vessel IMO | Unknown | -| Destination port | POD ETA | Unknown | -| Destination port | POD ATA | Unknown | -| Inland destination | Destination Name | Unknown | -| Inland destination | Destination Locode | Unknown | -| Inland destination | Destination Timezone | Unknown | -| Inland destination | Destination ETA | Unknown | -| Inland destination | Destination ATA | Unknown | -| Container attributes | Number | Unknown | -| Container attributes | Seal Number | Unknown | -| Container attributes | Equipment Type | Unknown | -| Container attributes | Equipment Length | Unknown | -| Container attributes | Equipment Height | Unknown | -| Container attributes | Weight (Lbs) | Unknown | -| Container attributes | POD Arrived At | Unknown | -| Container attributes | POD Discharged At | Unknown | -| Container attributes | POD Full Out At | Unknown | -| Container attributes | Destination Arrived At | Unknown | -| Container attributes | Destination Full Out At | Unknown | -| Container attributes | Empty Terminated At | Unknown | -| Container milestones | Empty Out | Unknown | -| Container milestones | Full In | Unknown | -| Container milestones | Vessel Loaded | Unknown | -| Container milestones | Vessel Departed | Unknown | -| Container milestones | Transshipment Arrived | Unknown | -| Container milestones | Transshipment Discharged | Unknown | -| Container milestones | Transshipment Loaded | Unknown | -| Container milestones | Transshipment Departed | Unknown | -| Container milestones | Vessel Arrived | Unknown | -| Container milestones | Vessel Berthed | Unknown | -| Container milestones | Vessel Discharged | Unknown | -| Container milestones | Full Out | Unknown | -| Container milestones | Empty Returned | Unknown | -| Additional milestones | Feeder Arrived | Unknown | -| Additional milestones | Feeder Discharged | Unknown | -| Additional milestones | Feeder Loaded | Unknown | -| Additional milestones | Feeder Departed | Unknown | -| Additional milestones | Rail Loaded | Unknown | -| Additional milestones | Rail Departed | Unknown | -| Additional milestones | Rail Arrived | Unknown | -| Additional milestones | Rail Unloaded | Unknown | -| Additional milestones | Arrived At Destination | Unknown | -| Additional milestones | Delivered | Unknown | -| Additional milestones | Estimated Arrival at Final Destination | Unknown | -| Other events | SSL LFD Changed | Unknown | -| Other events | Estimated Arrival | Unknown | -| Other events | Booking Cancelled | Unknown | - ## Seth Shipping SCAC `SSPH`. diff --git a/docs/data/coverage/terminals.csv b/docs/data/coverage/terminals.csv index f65a460f..cf15ab39 100644 --- a/docs/data/coverage/terminals.csv +++ b/docs/data/coverage/terminals.csv @@ -40,13 +40,13 @@ "Brisbane Autostrad","","","Brisbane","AUBNE","Australia","Australia","AUBNEPTFIT","PTFIT","","","emptyReturned","Empty returned","Container milestones","unknown","2026-10-13" "DP World Brisbane","","","Brisbane","AUBNE","Australia","Australia","","DPBNE","","","importMilestones","Import milestones","Container milestones","supported","2026-10-13" "DP World Brisbane","","","Brisbane","AUBNE","Australia","Australia","","DPBNE","","","availableForPickup","Available for pickup","Pickup & availability","unknown","2026-10-13" -"DP World Brisbane","","","Brisbane","AUBNE","Australia","Australia","","DPBNE","","","lastFreeDay","Terminal LFD","Pickup & availability","unknown","2026-10-13" +"DP World Brisbane","","","Brisbane","AUBNE","Australia","Australia","","DPBNE","","","lastFreeDay","Terminal LFD","Pickup & availability","supported","2026-10-13" "DP World Brisbane","","","Brisbane","AUBNE","Australia","Australia","","DPBNE","","","holds","Holds & releases","Holds & fees","unknown","2026-10-13" "DP World Brisbane","","","Brisbane","AUBNE","Australia","Australia","","DPBNE","","","feeType","Fee type","Holds & fees","unknown","2026-10-13" "DP World Brisbane","","","Brisbane","AUBNE","Australia","Australia","","DPBNE","","","feeAmount","Fee amount","Holds & fees","unknown","2026-10-13" "DP World Brisbane","","","Brisbane","AUBNE","Australia","Australia","","DPBNE","","","pickupAppointment","Pickup appointment","Gate & yard","unknown","2026-10-13" "DP World Brisbane","","","Brisbane","AUBNE","Australia","Australia","","DPBNE","","","yardLocation","Yard location","Gate & yard","unknown","2026-10-13" -"DP World Brisbane","","","Brisbane","AUBNE","Australia","Australia","","DPBNE","","","vesselDischarged","Vessel discharged","Container milestones","unknown","2026-10-13" +"DP World Brisbane","","","Brisbane","AUBNE","Australia","Australia","","DPBNE","","","vesselDischarged","Vessel discharged","Container milestones","supported","2026-10-13" "DP World Brisbane","","","Brisbane","AUBNE","Australia","Australia","","DPBNE","","","fullOut","Full out","Container milestones","unknown","2026-10-13" "DP World Brisbane","","","Brisbane","AUBNE","Australia","Australia","","DPBNE","","","chassisNumber","Chassis number","Gate & yard","unknown","2026-10-13" "DP World Brisbane","","","Brisbane","AUBNE","Australia","Australia","","DPBNE","","","onRail","On rail","Container milestones","unknown","2026-10-13" @@ -66,13 +66,13 @@ "Hutchison Brisbane Container Terminals","","","Brisbane","AUBNE","Australia","Australia","AUBNEHPAFI","HPAFI","","","emptyReturned","Empty returned","Container milestones","supported","2026-10-13" "DP World Fremantle","","","Fremantle","AUFRE","Australia","Australia","","CONFR","","","importMilestones","Import milestones","Container milestones","supported","2026-10-13" "DP World Fremantle","","","Fremantle","AUFRE","Australia","Australia","","CONFR","","","availableForPickup","Available for pickup","Pickup & availability","unknown","2026-10-13" -"DP World Fremantle","","","Fremantle","AUFRE","Australia","Australia","","CONFR","","","lastFreeDay","Terminal LFD","Pickup & availability","unknown","2026-10-13" +"DP World Fremantle","","","Fremantle","AUFRE","Australia","Australia","","CONFR","","","lastFreeDay","Terminal LFD","Pickup & availability","supported","2026-10-13" "DP World Fremantle","","","Fremantle","AUFRE","Australia","Australia","","CONFR","","","holds","Holds & releases","Holds & fees","unknown","2026-10-13" "DP World Fremantle","","","Fremantle","AUFRE","Australia","Australia","","CONFR","","","feeType","Fee type","Holds & fees","unknown","2026-10-13" "DP World Fremantle","","","Fremantle","AUFRE","Australia","Australia","","CONFR","","","feeAmount","Fee amount","Holds & fees","unknown","2026-10-13" "DP World Fremantle","","","Fremantle","AUFRE","Australia","Australia","","CONFR","","","pickupAppointment","Pickup appointment","Gate & yard","unknown","2026-10-13" "DP World Fremantle","","","Fremantle","AUFRE","Australia","Australia","","CONFR","","","yardLocation","Yard location","Gate & yard","unknown","2026-10-13" -"DP World Fremantle","","","Fremantle","AUFRE","Australia","Australia","","CONFR","","","vesselDischarged","Vessel discharged","Container milestones","unknown","2026-10-13" +"DP World Fremantle","","","Fremantle","AUFRE","Australia","Australia","","CONFR","","","vesselDischarged","Vessel discharged","Container milestones","supported","2026-10-13" "DP World Fremantle","","","Fremantle","AUFRE","Australia","Australia","","CONFR","","","fullOut","Full out","Container milestones","unknown","2026-10-13" "DP World Fremantle","","","Fremantle","AUFRE","Australia","Australia","","CONFR","","","chassisNumber","Chassis number","Gate & yard","unknown","2026-10-13" "DP World Fremantle","","","Fremantle","AUFRE","Australia","Australia","","CONFR","","","onRail","On rail","Container milestones","unknown","2026-10-13" @@ -131,13 +131,13 @@ "VICT Webb Dock East","","","Melbourne","AUMEL","Australia","Australia","AUMELVICTM","VICTM","","","emptyReturned","Empty returned","Container milestones","unsupported","2026-10-13" "DP World Sydney","","","Sydney","AUSYD","Australia","Australia","","CTLPB","","","importMilestones","Import milestones","Container milestones","supported","2026-10-13" "DP World Sydney","","","Sydney","AUSYD","Australia","Australia","","CTLPB","","","availableForPickup","Available for pickup","Pickup & availability","unknown","2026-10-13" -"DP World Sydney","","","Sydney","AUSYD","Australia","Australia","","CTLPB","","","lastFreeDay","Terminal LFD","Pickup & availability","unknown","2026-10-13" +"DP World Sydney","","","Sydney","AUSYD","Australia","Australia","","CTLPB","","","lastFreeDay","Terminal LFD","Pickup & availability","supported","2026-10-13" "DP World Sydney","","","Sydney","AUSYD","Australia","Australia","","CTLPB","","","holds","Holds & releases","Holds & fees","unknown","2026-10-13" "DP World Sydney","","","Sydney","AUSYD","Australia","Australia","","CTLPB","","","feeType","Fee type","Holds & fees","unknown","2026-10-13" "DP World Sydney","","","Sydney","AUSYD","Australia","Australia","","CTLPB","","","feeAmount","Fee amount","Holds & fees","unknown","2026-10-13" "DP World Sydney","","","Sydney","AUSYD","Australia","Australia","","CTLPB","","","pickupAppointment","Pickup appointment","Gate & yard","unknown","2026-10-13" "DP World Sydney","","","Sydney","AUSYD","Australia","Australia","","CTLPB","","","yardLocation","Yard location","Gate & yard","unknown","2026-10-13" -"DP World Sydney","","","Sydney","AUSYD","Australia","Australia","","CTLPB","","","vesselDischarged","Vessel discharged","Container milestones","unknown","2026-10-13" +"DP World Sydney","","","Sydney","AUSYD","Australia","Australia","","CTLPB","","","vesselDischarged","Vessel discharged","Container milestones","supported","2026-10-13" "DP World Sydney","","","Sydney","AUSYD","Australia","Australia","","CTLPB","","","fullOut","Full out","Container milestones","unknown","2026-10-13" "DP World Sydney","","","Sydney","AUSYD","Australia","Australia","","CTLPB","","","chassisNumber","Chassis number","Gate & yard","unknown","2026-10-13" "DP World Sydney","","","Sydney","AUSYD","Australia","Australia","","CTLPB","","","onRail","On rail","Container milestones","unknown","2026-10-13" diff --git a/docs/data/coverage/terminals.json b/docs/data/coverage/terminals.json index 0909b576..ae9518a3 100644 --- a/docs/data/coverage/terminals.json +++ b/docs/data/coverage/terminals.json @@ -153,13 +153,13 @@ "features": { "importMilestones": "supported", "availableForPickup": "unknown", - "lastFreeDay": "unknown", + "lastFreeDay": "supported", "holds": "unknown", "feeType": "unknown", "feeAmount": "unknown", "pickupAppointment": "unknown", "yardLocation": "unknown", - "vesselDischarged": "unknown", + "vesselDischarged": "supported", "fullOut": "unknown", "chassisNumber": "unknown", "onRail": "unknown", @@ -203,13 +203,13 @@ "features": { "importMilestones": "supported", "availableForPickup": "unknown", - "lastFreeDay": "unknown", + "lastFreeDay": "supported", "holds": "unknown", "feeType": "unknown", "feeAmount": "unknown", "pickupAppointment": "unknown", "yardLocation": "unknown", - "vesselDischarged": "unknown", + "vesselDischarged": "supported", "fullOut": "unknown", "chassisNumber": "unknown", "onRail": "unknown", @@ -328,13 +328,13 @@ "features": { "importMilestones": "supported", "availableForPickup": "unknown", - "lastFreeDay": "unknown", + "lastFreeDay": "supported", "holds": "unknown", "feeType": "unknown", "feeAmount": "unknown", "pickupAppointment": "unknown", "yardLocation": "unknown", - "vesselDischarged": "unknown", + "vesselDischarged": "supported", "fullOut": "unknown", "chassisNumber": "unknown", "onRail": "unknown", diff --git a/docs/data/coverage/terminals.mdx b/docs/data/coverage/terminals.mdx index 410a64f7..70ca8421 100644 --- a/docs/data/coverage/terminals.mdx +++ b/docs/data/coverage/terminals.mdx @@ -83,13 +83,13 @@ Brisbane, Australia. Port UN/LOCODE `AUBNE`. SMDG code: `DPBNE`. FIRMS code: Not | --- | --- | --- | | Container milestones | Import milestones | Supported | | Pickup & availability | Available for pickup | Unknown | -| Pickup & availability | Terminal LFD | Unknown | +| Pickup & availability | Terminal LFD | Supported | | Holds & fees | Holds & releases | Unknown | | Holds & fees | Fee type | Unknown | | Holds & fees | Fee amount | Unknown | | Gate & yard | Pickup appointment | Unknown | | Gate & yard | Yard location | Unknown | -| Container milestones | Vessel discharged | Unknown | +| Container milestones | Vessel discharged | Supported | | Container milestones | Full out | Unknown | | Gate & yard | Chassis number | Unknown | | Container milestones | On rail | Unknown | @@ -123,13 +123,13 @@ Fremantle, Australia. Port UN/LOCODE `AUFRE`. SMDG code: `CONFR`. FIRMS code: No | --- | --- | --- | | Container milestones | Import milestones | Supported | | Pickup & availability | Available for pickup | Unknown | -| Pickup & availability | Terminal LFD | Unknown | +| Pickup & availability | Terminal LFD | Supported | | Holds & fees | Holds & releases | Unknown | | Holds & fees | Fee type | Unknown | | Holds & fees | Fee amount | Unknown | | Gate & yard | Pickup appointment | Unknown | | Gate & yard | Yard location | Unknown | -| Container milestones | Vessel discharged | Unknown | +| Container milestones | Vessel discharged | Supported | | Container milestones | Full out | Unknown | | Gate & yard | Chassis number | Unknown | | Container milestones | On rail | Unknown | @@ -223,13 +223,13 @@ Sydney, Australia. Port UN/LOCODE `AUSYD`. SMDG code: `CTLPB`. FIRMS code: Not a | --- | --- | --- | | Container milestones | Import milestones | Supported | | Pickup & availability | Available for pickup | Unknown | -| Pickup & availability | Terminal LFD | Unknown | +| Pickup & availability | Terminal LFD | Supported | | Holds & fees | Holds & releases | Unknown | | Holds & fees | Fee type | Unknown | | Holds & fees | Fee amount | Unknown | | Gate & yard | Pickup appointment | Unknown | | Gate & yard | Yard location | Unknown | -| Container milestones | Vessel discharged | Unknown | +| Container milestones | Vessel discharged | Supported | | Container milestones | Full out | Unknown | | Gate & yard | Chassis number | Unknown | | Container milestones | On rail | Unknown | diff --git a/docs/snippets/data-sources/carrier-feature-data.mdx b/docs/snippets/data-sources/carrier-feature-data.mdx index fca7e402..9f4478ed 100644 --- a/docs/snippets/data-sources/carrier-feature-data.mdx +++ b/docs/snippets/data-sources/carrier-feature-data.mdx @@ -152,19 +152,12 @@ export const shippingLines = [ "alternativeScacs": [], "access": "public" }, - { - "name": "Safmarine", - "legalName": "Safmarine Container Line", - "scac": "SAFM", - "alternativeScacs": [], - "access": "public" - }, { "name": "Seaboard Marine", "legalName": "Seaboard Marine", "scac": "SMLU", "alternativeScacs": [], - "access": "account" + "access": "public" }, { "name": "Sealand Americas", @@ -175,22 +168,6 @@ export const shippingLines = [ ], "access": "public" }, - { - "name": "Sealand Europe", - "legalName": "Sealand Europe", - "scac": "SEJJ", - "alternativeScacs": [], - "access": "public" - }, - { - "name": "SeaLead", - "legalName": "SeaLead", - "scac": "SQQY", - "alternativeScacs": [ - "SJHH" - ], - "access": "public" - }, { "name": "Seth Shipping", "legalName": "Seth Shipping", @@ -1963,76 +1940,11 @@ export const shippingLineCoverage = { "bookingCancelled": "unsupported" } }, - "SAFM": { - "features": { - "billOfLading": "supported", - "bookingNumber": "supported", - "containerNumber": "unsupported", - "polName": "unknown", - "polLocode": "unknown", - "polTimezone": "unknown", - "polEtd": "unknown", - "polAtd": "unknown", - "podName": "unknown", - "podLocode": "unknown", - "podTerminal": "unknown", - "podTimezone": "unknown", - "podVoyageNumber": "unknown", - "podVesselName": "unknown", - "podVesselImo": "unknown", - "podEta": "unknown", - "podAta": "unknown", - "destinationName": "unknown", - "destinationLocode": "unknown", - "destinationTimezone": "unknown", - "destinationEta": "unknown", - "destinationAta": "unknown", - "number": "unknown", - "sealNumber": "unknown", - "equipmentType": "unknown", - "equipmentLength": "unknown", - "equipmentHeight": "unknown", - "weightLbs": "unknown", - "podArrivedAt": "unknown", - "podDischargedAt": "unknown", - "podFullOutAt": "unknown", - "destinationArrivedAt": "unknown", - "destinationFullOutAt": "unknown", - "emptyTerminatedAt": "unknown", - "emptyOut": "unknown", - "fullIn": "unknown", - "vesselLoaded": "unknown", - "vesselDeparted": "unknown", - "transshipmentArrived": "unknown", - "transshipmentDischarged": "unknown", - "transshipmentLoaded": "unknown", - "transshipmentDeparted": "unknown", - "vesselArrived": "unknown", - "vesselBerthed": "unknown", - "vesselDischarged": "unknown", - "fullOut": "unknown", - "emptyReturned": "unknown", - "feederArrived": "unknown", - "feederDischarged": "unknown", - "feederLoaded": "unknown", - "feederDeparted": "unknown", - "railLoaded": "unknown", - "railDeparted": "unknown", - "railArrived": "unknown", - "railUnloaded": "unknown", - "arrivedAtDestination": "unknown", - "delivered": "unknown", - "estimatedArrivalAtFinalDestination": "unknown", - "sslLfdChanged": "unknown", - "estimatedArrival": "unknown", - "bookingCancelled": "unknown" - } - }, "SMLU": { "features": { "billOfLading": "supported", "bookingNumber": "supported", - "containerNumber": "unsupported", + "containerNumber": "supported", "polName": "unknown", "polLocode": "unknown", "polTimezone": "unknown", @@ -2158,136 +2070,6 @@ export const shippingLineCoverage = { "bookingCancelled": "unsupported" } }, - "SEJJ": { - "features": { - "billOfLading": "supported", - "bookingNumber": "supported", - "containerNumber": "supported", - "polName": "unknown", - "polLocode": "unknown", - "polTimezone": "unknown", - "polEtd": "unknown", - "polAtd": "unknown", - "podName": "unknown", - "podLocode": "unknown", - "podTerminal": "unknown", - "podTimezone": "unknown", - "podVoyageNumber": "unknown", - "podVesselName": "unknown", - "podVesselImo": "unknown", - "podEta": "unknown", - "podAta": "unknown", - "destinationName": "unknown", - "destinationLocode": "unknown", - "destinationTimezone": "unknown", - "destinationEta": "unknown", - "destinationAta": "unknown", - "number": "unknown", - "sealNumber": "unknown", - "equipmentType": "unknown", - "equipmentLength": "unknown", - "equipmentHeight": "unknown", - "weightLbs": "unknown", - "podArrivedAt": "unknown", - "podDischargedAt": "unknown", - "podFullOutAt": "unknown", - "destinationArrivedAt": "unknown", - "destinationFullOutAt": "unknown", - "emptyTerminatedAt": "unknown", - "emptyOut": "unknown", - "fullIn": "unknown", - "vesselLoaded": "unknown", - "vesselDeparted": "unknown", - "transshipmentArrived": "unknown", - "transshipmentDischarged": "unknown", - "transshipmentLoaded": "unknown", - "transshipmentDeparted": "unknown", - "vesselArrived": "unknown", - "vesselBerthed": "unknown", - "vesselDischarged": "unknown", - "fullOut": "unknown", - "emptyReturned": "unknown", - "feederArrived": "unknown", - "feederDischarged": "unknown", - "feederLoaded": "unknown", - "feederDeparted": "unknown", - "railLoaded": "unknown", - "railDeparted": "unknown", - "railArrived": "unknown", - "railUnloaded": "unknown", - "arrivedAtDestination": "unknown", - "delivered": "unknown", - "estimatedArrivalAtFinalDestination": "unknown", - "sslLfdChanged": "unknown", - "estimatedArrival": "unknown", - "bookingCancelled": "unknown" - } - }, - "SQQY": { - "features": { - "billOfLading": "supported", - "bookingNumber": "supported", - "containerNumber": "supported", - "polName": "unknown", - "polLocode": "unknown", - "polTimezone": "unknown", - "polEtd": "unknown", - "polAtd": "unknown", - "podName": "unknown", - "podLocode": "unknown", - "podTerminal": "unknown", - "podTimezone": "unknown", - "podVoyageNumber": "unknown", - "podVesselName": "unknown", - "podVesselImo": "unknown", - "podEta": "unknown", - "podAta": "unknown", - "destinationName": "unknown", - "destinationLocode": "unknown", - "destinationTimezone": "unknown", - "destinationEta": "unknown", - "destinationAta": "unknown", - "number": "unknown", - "sealNumber": "unknown", - "equipmentType": "unknown", - "equipmentLength": "unknown", - "equipmentHeight": "unknown", - "weightLbs": "unknown", - "podArrivedAt": "unknown", - "podDischargedAt": "unknown", - "podFullOutAt": "unknown", - "destinationArrivedAt": "unknown", - "destinationFullOutAt": "unknown", - "emptyTerminatedAt": "unknown", - "emptyOut": "unknown", - "fullIn": "unknown", - "vesselLoaded": "unknown", - "vesselDeparted": "unknown", - "transshipmentArrived": "unknown", - "transshipmentDischarged": "unknown", - "transshipmentLoaded": "unknown", - "transshipmentDeparted": "unknown", - "vesselArrived": "unknown", - "vesselBerthed": "unknown", - "vesselDischarged": "unknown", - "fullOut": "unknown", - "emptyReturned": "unknown", - "feederArrived": "unknown", - "feederDischarged": "unknown", - "feederLoaded": "unknown", - "feederDeparted": "unknown", - "railLoaded": "unknown", - "railDeparted": "unknown", - "railArrived": "unknown", - "railUnloaded": "unknown", - "arrivedAtDestination": "unknown", - "delivered": "unknown", - "estimatedArrivalAtFinalDestination": "unknown", - "sslLfdChanged": "unknown", - "estimatedArrival": "unknown", - "bookingCancelled": "unknown" - } - }, "SSPH": { "features": { "billOfLading": "supported", diff --git a/docs/snippets/data-sources/terminal-feature-data.mdx b/docs/snippets/data-sources/terminal-feature-data.mdx index f7e104f3..414b10e3 100644 --- a/docs/snippets/data-sources/terminal-feature-data.mdx +++ b/docs/snippets/data-sources/terminal-feature-data.mdx @@ -1441,13 +1441,13 @@ export const terminalFeatureCoverage = { "features": { "importMilestones": "supported", "availableForPickup": "unknown", - "lastFreeDay": "unknown", + "lastFreeDay": "supported", "holds": "unknown", "feeType": "unknown", "feeAmount": "unknown", "pickupAppointment": "unknown", "yardLocation": "unknown", - "vesselDischarged": "unknown", + "vesselDischarged": "supported", "fullOut": "unknown", "chassisNumber": "unknown", "onRail": "unknown", @@ -1475,13 +1475,13 @@ export const terminalFeatureCoverage = { "features": { "importMilestones": "supported", "availableForPickup": "unknown", - "lastFreeDay": "unknown", + "lastFreeDay": "supported", "holds": "unknown", "feeType": "unknown", "feeAmount": "unknown", "pickupAppointment": "unknown", "yardLocation": "unknown", - "vesselDischarged": "unknown", + "vesselDischarged": "supported", "fullOut": "unknown", "chassisNumber": "unknown", "onRail": "unknown", @@ -1560,13 +1560,13 @@ export const terminalFeatureCoverage = { "features": { "importMilestones": "supported", "availableForPickup": "unknown", - "lastFreeDay": "unknown", + "lastFreeDay": "supported", "holds": "unknown", "feeType": "unknown", "feeAmount": "unknown", "pickupAppointment": "unknown", "yardLocation": "unknown", - "vesselDischarged": "unknown", + "vesselDischarged": "supported", "fullOut": "unknown", "chassisNumber": "unknown", "onRail": "unknown", diff --git a/tools/data/README.md b/tools/data/README.md new file mode 100644 index 00000000..e041f8f6 --- /dev/null +++ b/tools/data/README.md @@ -0,0 +1,13 @@ +# Reviewed coverage inputs + +`shipping-line-overrides.json` records reviewed changes to the historical shipping-line registry used during coverage imports. Keys must match a primary SCAC exactly; alternative SCACs do not inherit an override. + +An entry can contain: + +- `enabled`: boolean. `false` excludes the identity from the current roster and all derived exports. +- `access`: `public` or `account`. +- `trackingIdentifiers`: boolean values for `billOfLading`, `bookingNumber`, or `containerNumber`. + +These declarations describe tracking admission and current availability. They do not change returned-data feature assessments. The importer applies them before joining fresh observations, so an observed historical carrier cannot re-enter the roster and missing observations cannot overwrite a reviewed tracking declaration. + +Update this file through a reviewed change when integration availability or tracking admission changes. Keep evidence and operational configuration outside this public repository. The importer requires the file, validates its contents, and rejects unknown identities and fields. diff --git a/tools/data/shipping-line-overrides.json b/tools/data/shipping-line-overrides.json new file mode 100644 index 00000000..506430c8 --- /dev/null +++ b/tools/data/shipping-line-overrides.json @@ -0,0 +1,17 @@ +{ + "SAFM": { + "enabled": false + }, + "SEJJ": { + "enabled": false + }, + "SQQY": { + "enabled": false + }, + "SMLU": { + "access": "public", + "trackingIdentifiers": { + "containerNumber": true + } + } +} diff --git a/tools/data/terminal-capabilities.json b/tools/data/terminal-capabilities.json new file mode 100644 index 00000000..067d2a8b --- /dev/null +++ b/tools/data/terminal-capabilities.json @@ -0,0 +1,20 @@ +{ + "AUBNE:DPBNE": { + "features": { + "lastFreeDay": "supported", + "vesselDischarged": "supported" + } + }, + "AUFRE:CONFR": { + "features": { + "lastFreeDay": "supported", + "vesselDischarged": "supported" + } + }, + "AUSYD:CTLPB": { + "features": { + "lastFreeDay": "supported", + "vesselDischarged": "supported" + } + } +} diff --git a/tools/data/terminal-capabilities.md b/tools/data/terminal-capabilities.md new file mode 100644 index 00000000..c8b582e6 --- /dev/null +++ b/tools/data/terminal-capabilities.md @@ -0,0 +1,9 @@ +# Reviewed terminal capabilities + +`terminal-capabilities.json` records reviewed capabilities independently of traffic observations. Each key is the port UN/LOCODE followed by the verified SMDG terminal code, separated by a colon. Each record contains a `features` map using keys and statuses from the terminal coverage catalog. + +During a Hex import, these declarations override the observed classification for the specified features. A low-volume observation window can miss an implemented capability. Features without a declaration retain the imported classification; a missing declaration does not mean unsupported. + +Update declarations through a reviewed pull request after checking the integration implementation, active configuration, and source attribution. Preserve evidence in the internal review process. Do not add private implementation details or customer data to this public file. + +The generator rejects malformed identifiers, unknown feature keys, and invalid statuses. Tests also check that canonical coverage agrees with the reviewed declarations. Terminal names and legacy source codes are not capability identifiers. diff --git a/tools/generate-coverage.mjs b/tools/generate-coverage.mjs index 37bb776f..b2edaf2e 100644 --- a/tools/generate-coverage.mjs +++ b/tools/generate-coverage.mjs @@ -104,6 +104,90 @@ function validateTerminalIdentifiers({ locode, smdgCode, firmsCode }) { throw new Error('Invalid FIRMS code for ' + locode); } +export function validateTerminalCapabilities(capabilities) { + const featureKeys = new Set(terminalDefinitions.map(([key]) => key)); + if ( + !capabilities || + typeof capabilities !== 'object' || + Array.isArray(capabilities) + ) + throw new Error('Invalid terminal capability mapping'); + for (const [key, declaration] of Object.entries(capabilities)) { + if ( + !/^[A-Z]{2}[A-Z0-9]{3}:[A-Z0-9]{3,6}$/.test(key) || + !declaration || + typeof declaration !== 'object' || + Array.isArray(declaration) || + Object.keys(declaration).length !== 1 || + !declaration.features || + typeof declaration.features !== 'object' || + Array.isArray(declaration.features) || + Object.keys(declaration.features).length === 0 || + Object.entries(declaration.features).some( + ([feature, status]) => + !featureKeys.has(feature) || !statuses.has(status), + ) + ) + throw new Error('Invalid terminal capability mapping for ' + key); + } +} + +export function validateShippingLineOverrides(overrides, registry) { + if (!overrides || typeof overrides !== 'object' || Array.isArray(overrides)) + throw new Error('Invalid shipping line overrides'); + const primaryScacs = new Set(registry.map(({ scac }) => scac)); + for (const [scac, override] of Object.entries(overrides)) { + if ( + !primaryScacs.has(scac) || + !override || + typeof override !== 'object' || + Array.isArray(override) || + Object.keys(override).length === 0 || + Object.keys(override).some( + (key) => !['enabled', 'access', 'trackingIdentifiers'].includes(key), + ) || + ('enabled' in override && typeof override.enabled !== 'boolean') || + ('access' in override && !['public', 'account'].includes(override.access)) + ) + throw new Error('Invalid shipping line override for ' + scac); + if ('trackingIdentifiers' in override) { + const identifiers = override.trackingIdentifiers; + if ( + !identifiers || + typeof identifiers !== 'object' || + Array.isArray(identifiers) || + Object.keys(identifiers).length === 0 || + Object.entries(identifiers).some( + ([key, value]) => + !['billOfLading', 'bookingNumber', 'containerNumber'].includes( + key, + ) || typeof value !== 'boolean', + ) + ) + throw new Error('Invalid shipping line tracking override for ' + scac); + } + } +} + +export function applyShippingLineOverrides(registry, overrides) { + validateShippingLineOverrides(overrides, registry); + return registry + .filter( + ({ scac }) => + !Object.hasOwn(overrides, scac) || overrides[scac].enabled !== false, + ) + .map((carrier) => { + const override = Object.hasOwn(overrides, carrier.scac) + ? overrides[carrier.scac] + : undefined; + return { + ...carrier, + ...(override?.access ? { access: override.access } : {}), + ...override?.trackingIdentifiers, + }; + }); +} + async function importHex(filename) { const hex = JSON.parse(await readFile(filename, 'utf8')); const identity = await read('docs/snippets/data-sources/coverage-data.mdx'); @@ -129,6 +213,10 @@ async function importHex(filename) { throw new Error('Invalid terminal identifier mapping for ' + key); validateTerminalIdentifiers({ locode: key.slice(0, 5), ...codes }); } + const terminalCapabilities = JSON.parse( + await read('tools/data/terminal-capabilities.json'), + ); + validateTerminalCapabilities(terminalCapabilities); const terminalProfiles = new Map( hex.terminals.map((row) => [ row.port_locode + ':' + (row.firms_code || row.terminal), @@ -206,38 +294,53 @@ async function importHex(filename) { const terminals = exportValue(identity, 'terminals').map( ({ firmsCode: terminalCode, ...terminal }) => { const key = terminal.locode + ':' + (terminalCode || terminal.name); + const identifiers = terminalIdentifiers[key] ?? { + smdgCode: '', + firmsCode: '', + }; + const declaredFeatures = identifiers.smdgCode + ? terminalCapabilities[terminal.locode + ':' + identifiers.smdgCode] + ?.features + : undefined; return { ...terminal, terminalCode, - ...(terminalIdentifiers[key] ?? { smdgCode: '', firmsCode: '' }), - features: Object.fromEntries( - catalog.terminals.map(({ key: featureKey }) => [ - featureKey, - featureKey === 'importMilestones' - ? 'supported' - : normalizeStatus( - terminalProfiles.get(key)?.features[ - terminalLabels[featureKey] - ], - ), - ]), - ), + ...identifiers, + features: { + ...Object.fromEntries( + catalog.terminals.map(({ key: featureKey }) => [ + featureKey, + featureKey === 'importMilestones' + ? 'supported' + : normalizeStatus( + terminalProfiles.get(key)?.features[ + terminalLabels[featureKey] + ], + ), + ]), + ), + ...declaredFeatures, + }, }; }, ); - const shippingLines = exportValue(identity, 'carriers').map( - ({ billOfLading, bookingNumber, containerNumber, ...carrier }) => ({ - ...carrier, - features: { - ...features(sourceShipping.get(carrier.scac), catalog.shippingLines), - ...Object.fromEntries( - Object.entries({ billOfLading, bookingNumber, containerNumber }).map( - ([key, value]) => [key, value ? 'supported' : 'unsupported'], - ), - ), - }, - }), + const shippingOverrides = JSON.parse( + await read('tools/data/shipping-line-overrides.json'), ); + const shippingLines = applyShippingLineOverrides( + exportValue(identity, 'carriers'), + shippingOverrides, + ).map(({ billOfLading, bookingNumber, containerNumber, ...carrier }) => ({ + ...carrier, + features: { + ...features(sourceShipping.get(carrier.scac), catalog.shippingLines), + ...Object.fromEntries( + Object.entries({ billOfLading, bookingNumber, containerNumber }).map( + ([key, value]) => [key, value ? 'supported' : 'unsupported'], + ), + ), + }, + })); const railCarriers = hex.rail_carriers.map((row) => ({ name: row.carrier, scac: row.scac, diff --git a/tools/generate-coverage.test.mjs b/tools/generate-coverage.test.mjs index 729999cb..6e365900 100644 --- a/tools/generate-coverage.test.mjs +++ b/tools/generate-coverage.test.mjs @@ -8,6 +8,9 @@ import { generateFiles, updateAgentCoverage, validateCoverage, + validateTerminalCapabilities, + applyShippingLineOverrides, + validateShippingLineOverrides, } from './generate-coverage.mjs'; const data = JSON.parse( @@ -37,11 +40,11 @@ test('only approved public entities and complete feature assessments are exporte assert.equal(data.terminals.length, 138); assert.equal( data.shippingLines.filter((row) => row.access === 'public').length, - 36, + 34, ); assert.equal( data.shippingLines.filter((row) => row.access === 'account').length, - 2, + 1, ); assert.equal(data.railCarriers.length, 6); assert.equal(data.featureCatalog.railCarriers.length, 13); @@ -97,7 +100,7 @@ test('static references include every feature and preserve credential requiremen const files = generateFiles(data); const shipping = files.get('docs/data/coverage/shipping-lines.mdx'); const rail = files.get('docs/data/coverage/rail-carriers.mdx'); - assert.equal((shipping.match(/^\| (?!---|Section)/gm) ?? []).length, 38 * 61); + assert.equal((shipping.match(/^\| (?!---|Section)/gm) ?? []).length, 35 * 61); assert.equal((rail.match(/^\| (?!---|Section)/gm) ?? []).length, 6 * 13); assert.ok(rail.includes('Carrier credentials required')); assert.ok(rail.includes('requires the Rail Plan')); @@ -295,14 +298,6 @@ async function importFixture(t, mutate = () => {}) { scac, ), })); - await writeFile( - path.join(directory, 'docs/snippets/data-sources/coverage-data.mdx'), - 'export const terminals = ' + - JSON.stringify(terminals) + - ';\nexport const carriers = ' + - JSON.stringify(carriers) + - ';\n', - ); for (const page of ['terminals', 'ocean-carriers', 'rail']) await writeFile( path.join(directory, 'docs/coverage', page + '.mdx'), @@ -391,6 +386,12 @@ async function importFixture(t, mutate = () => {}) { 'USXXX:Named terminal': { smdgCode: 'NAM', firmsCode: '' }, }, omitFile: false, + capabilities: {}, + omitCapabilities: false, + shippingOverrides: {}, + omitShippingOverrides: false, + carriers, + terminals, }; mutate(hex, identifierOptions); if (!identifierOptions.omitFile) { @@ -400,6 +401,28 @@ async function importFixture(t, mutate = () => {}) { JSON.stringify(identifierOptions.identifiers), ); } + if (!identifierOptions.omitCapabilities) { + await mkdir(path.join(directory, 'tools/data'), { recursive: true }); + await writeFile( + path.join(directory, 'tools/data/terminal-capabilities.json'), + JSON.stringify(identifierOptions.capabilities), + ); + } + if (!identifierOptions.omitShippingOverrides) { + await mkdir(path.join(directory, 'tools/data'), { recursive: true }); + await writeFile( + path.join(directory, 'tools/data/shipping-line-overrides.json'), + JSON.stringify(identifierOptions.shippingOverrides), + ); + } + await writeFile( + path.join(directory, 'docs/snippets/data-sources/coverage-data.mdx'), + 'export const terminals = ' + + JSON.stringify(terminals) + + ';\nexport const carriers = ' + + JSON.stringify(carriers) + + ';\n', + ); const filename = path.join(directory, 'source.json'); await writeFile(filename, JSON.stringify(hex)); const result = spawnSync( @@ -529,7 +552,10 @@ test('CLI imports fresh terminal assessments and capture date without generated const check = spawnSync( process.execPath, ['tools/generate-coverage.mjs', '--check'], - { cwd: fixture.directory, encoding: 'utf8' }, + { + cwd: fixture.directory, + encoding: 'utf8', + }, ); assert.equal(check.status, 0, check.stderr); }); @@ -566,7 +592,13 @@ test('canonical tracking identifiers follow approved lookup admission for every ), 'carriers', ); - for (const approved of registry) { + const overrides = JSON.parse( + await readFile( + new URL('./data/shipping-line-overrides.json', import.meta.url), + 'utf8', + ), + ); + for (const approved of applyShippingLineOverrides(registry, overrides)) { const row = data.shippingLines.find(({ scac }) => scac === approved.scac); for (const key of ['billOfLading', 'bookingNumber', 'containerNumber']) assert.equal( @@ -631,7 +663,9 @@ test('terminal identifiers export separately while coverage keys retain source i ); assert.deepEqual( exportedValue(snippet, 'terminalFeatureCoverage')[stableKey], - { features: entity.features }, + { + features: entity.features, + }, ); const identity = exportedValue(snippet, 'terminalCoverageEntities').find( (row) => row.name === entity.name, @@ -785,3 +819,208 @@ test('CLI rejects missing or malformed identifier mapping before publishing', as }); } }); + +test('canonical reviewed capabilities survive independent traffic classifications', async () => { + const declarations = JSON.parse( + await readFile( + new URL('./data/terminal-capabilities.json', import.meta.url), + 'utf8', + ), + ); + validateTerminalCapabilities(declarations); + for (const [key, declaration] of Object.entries(declarations)) { + const matching = data.terminals.filter( + (row) => `${row.locode}:${row.smdgCode}` === key, + ); + assert.equal(matching.length, 1, key); + for (const [feature, status] of Object.entries(declaration.features)) + assert.equal(matching[0].features[feature], status, `${key} ${feature}`); + } +}); + +test('reviewed capability import uses verified port and SMDG identity and overrides low-volume observations', async (t) => { + const fixture = await importFixture(t, (hex, options) => { + options.capabilities = { + 'USXXX:ABC': { + features: { lastFreeDay: 'supported', vesselDischarged: 'supported' }, + }, + 'USYYY:NAM': { features: { lastFreeDay: 'supported' } }, + 'USXXX:CD34': { features: { lastFreeDay: 'supported' } }, + }; + hex.terminals[0].features['Vessel Discharged'] = 'unknown'; + }); + assert.equal(fixture.result.status, 0, fixture.result.stderr); + const imported = JSON.parse( + await fixture.read('docs/data/coverage/coverage.json'), + ); + assert.equal(imported.terminals[0].features.lastFreeDay, 'supported'); + assert.equal(imported.terminals[0].features.vesselDischarged, 'supported'); + assert.equal(imported.terminals[0].features.availableForPickup, 'limited'); + assert.equal(imported.terminals[1].features.lastFreeDay, 'unknown'); + assert.equal(imported.terminals[2].features.lastFreeDay, 'unknown'); +}); + +test('CLI requires a valid reviewed capability file before publishing', async (t) => { + for (const capabilities of [ + [], + null, + { 'USXXX:ABC': { features: { invented: 'supported' } } }, + { 'USXXX:ABC': { features: { lastFreeDay: 'yes' } } }, + { 'USXXX:': { features: { lastFreeDay: 'supported' } } }, + { 'USXXX:Named terminal': { features: { lastFreeDay: 'supported' } } }, + { 'USXXX:ABC': { features: {} } }, + { + 'USXXX:ABC': { features: { lastFreeDay: 'supported' }, private: 'value' }, + }, + ]) { + const fixture = await importFixture(t, (_hex, options) => { + options.capabilities = capabilities; + }); + assert.notEqual(fixture.result.status, 0); + assert.match(fixture.result.stderr, /Invalid terminal capability mapping/); + await assert.rejects(fixture.read('docs/data/coverage/coverage.json'), { + code: 'ENOENT', + }); + } + const missing = await importFixture(t, (_hex, options) => { + options.omitCapabilities = true; + }); + assert.notEqual(missing.result.status, 0); + assert.match(missing.result.stderr, /ENOENT/); +}); + +test('terminals sharing an SMDG code in different ports cannot inherit a declaration', async (t) => { + const fixture = await importFixture(t, (_hex, options) => { + options.capabilities = { + 'USXXX:ABC': { features: { lastFreeDay: 'supported' } }, + }; + options.terminals[1].locode = 'USYYY'; + options.identifiers['USYYY:Named terminal'] = { + smdgCode: 'ABC', + firmsCode: '', + }; + }); + assert.equal(fixture.result.status, 0, fixture.result.stderr); + const imported = JSON.parse( + await fixture.read('docs/data/coverage/coverage.json'), + ); + assert.equal(imported.terminals[0].features.lastFreeDay, 'supported'); + assert.equal(imported.terminals[1].smdgCode, 'ABC'); + assert.equal(imported.terminals[1].features.lastFreeDay, 'unknown'); +}); + +test('reviewed carrier state survives fresh observations and overrides historical admission', async (t) => { + const fixture = await importFixture(t, (hex, options) => { + for (const scac of ['SAFM', 'SEJJ', 'SQQY', 'SMLU', 'TRBR']) { + options.carriers.push({ + ...options.carriers[0], + scac, + access: 'account', + containerNumber: false, + }); + if (scac !== 'SMLU') + hex.shipping_lines.push({ + scac, + features: { + 'Container Number': 'supported', + 'POD ETA': 'supported', + }, + }); + } + options.shippingOverrides = { + SAFM: { enabled: false }, + SEJJ: { enabled: false }, + SQQY: { enabled: false }, + SMLU: { + access: 'public', + trackingIdentifiers: { containerNumber: true }, + }, + }; + }); + assert.equal(fixture.result.status, 0, fixture.result.stderr); + const imported = JSON.parse( + await fixture.read('docs/data/coverage/coverage.json'), + ); + for (const scac of ['SAFM', 'SEJJ', 'SQQY']) { + assert.ok(!imported.shippingLines.some((row) => row.scac === scac)); + assert.ok( + !JSON.parse( + await fixture.read('docs/data/coverage/shipping-lines.json'), + ).shippingLines.some((row) => row.scac === scac), + ); + } + const seaboard = imported.shippingLines.find((row) => row.scac === 'SMLU'); + assert.equal(seaboard.access, 'public'); + assert.equal(seaboard.features.containerNumber, 'supported'); + assert.equal(seaboard.features.podEta, 'unknown'); + const turkon = imported.shippingLines.find((row) => row.scac === 'TRBR'); + assert.equal(turkon.access, 'account'); + assert.equal(turkon.features.containerNumber, 'unsupported'); +}); + +test('shipping overrides require exact primary SCACs and reviewed field types', () => { + const registry = [ + { + scac: 'SMLU', + alternativeScacs: ['ALIA'], + access: 'account', + containerNumber: false, + }, + ]; + for (const overrides of [ + null, + [], + { ALIA: { enabled: false } }, + { XXXX: { enabled: false } }, + { SMLU: {} }, + { SMLU: { name: 'Changed' } }, + { SMLU: { enabled: 'false' } }, + { SMLU: { access: 'private' } }, + { SMLU: { trackingIdentifiers: [] } }, + { SMLU: { trackingIdentifiers: {} } }, + { SMLU: { trackingIdentifiers: { podEta: true } } }, + { SMLU: { trackingIdentifiers: { containerNumber: 'true' } } }, + ]) + assert.throws( + () => validateShippingLineOverrides(overrides, registry), + /Invalid shipping line/, + ); + assert.deepEqual(applyShippingLineOverrides(registry, {}), registry); + assert.deepEqual( + applyShippingLineOverrides( + registry, + Object.create({ SMLU: { enabled: false } }), + ), + registry, + ); + assert.deepEqual( + applyShippingLineOverrides(registry, { + SMLU: { + access: 'public', + trackingIdentifiers: { containerNumber: true }, + }, + }), + [{ ...registry[0], access: 'public', containerNumber: true }], + ); + assert.deepEqual( + applyShippingLineOverrides(registry, { SMLU: { enabled: false } }), + [], + ); +}); + +test('CLI requires the shipping override file and rejects invalid review state', async (t) => { + for (const mutate of [ + (_hex, options) => { + options.omitShippingOverrides = true; + }, + (_hex, options) => { + options.shippingOverrides = { ALIA: { enabled: false } }; + }, + ]) { + const fixture = await importFixture(t, mutate); + assert.notEqual(fixture.result.status, 0); + await assert.rejects(fixture.read('docs/data/coverage/coverage.json'), { + code: 'ENOENT', + }); + } +}); diff --git a/tools/verify-deployed-coverage.test.mjs b/tools/verify-deployed-coverage.test.mjs index dc35b365..2f8f9938 100644 --- a/tools/verify-deployed-coverage.test.mjs +++ b/tools/verify-deployed-coverage.test.mjs @@ -10,34 +10,23 @@ const pairs = { 'inland-rail-terminals': 'inland-rail-terminals', }; async function fixture(url) { - const path = new URL(url).pathname.replace('/docs/', ''); + const path = new URL(url).pathname.split('/docs/').at(-1); if (path === 'llms.txt') return Object.keys(pairs) .map((page) => `[${page}](/docs/coverage/${page})`) .join('\n'); if (path.startsWith('coverage/')) { const page = path.split('/').at(-1).replace(/\.md$/, ''); - const links = ['json', 'csv'] - .map( - (extension) => - `[${extension}](/docs/data/coverage/${pairs[page]}.${extension})`, + const source = ( + await readFile( + new URL('../docs/coverage/' + page + '.mdx', import.meta.url), + 'utf8', ) + ).replaceAll('](/data/coverage/', '](/docs/data/coverage/'); + if (path.endsWith('.md')) return source; + return [...source.matchAll(/\]\(([^)]+\.(?:json|csv))\)/g)] + .map((match) => `Download`) .join('\n'); - return path.endsWith('.md') - ? ( - await readFile( - new URL('../docs/coverage/' + page + '.mdx', import.meta.url), - 'utf8', - ) - ).replaceAll('](/data/coverage/', '](/docs/data/coverage/') + - '\n' + - links - : ['json', 'csv'] - .map( - (extension) => - `${extension}`, - ) - .join('\n'); } return ( await readFile( @@ -202,7 +191,7 @@ test('checks download URLs linked only from data references', async () => { return new Response( String(url).endsWith('/data/coverage/rail-carriers.md') ? body.replace( - '](/docs/data/coverage/rail-carriers.json)', + /\]\([^)]*\/rail-carriers\.json\)/, '](https://broken.example/rail-carriers.json)', ) : body,