improved

Updated Payload for NO_CONTAINERS / NO_EVENTS API responses

What's new

NO_CONTAINERS (200) api responses

When sending a tracking request for a BL or BK reference very early on, it is possible that no container is yet attached to the shipping reference. In this case, the api will send a NO_CONTAINERS response with no data in the payload.

In some cases, while no container number is attached to the shipment, the carrier still shares partial key milestone data such as POL and POD or ETD and ETA.

This data will now be contained in the route object of NO_CONTAINERS api responses.

example of a Yang Ming Booking Reference without Container Data

example of a Yang Ming Booking Reference without Container Data

NO_EVENTS (200) api responses

The same logic applies to NO_EVENTS api responses.

Important Notes:

  • Empty Tables:
    Previously, the containers and containers.events tables were never empty in the API response. They can now be empty if no data is available.

  • New Metadata Warnings:
    To keep you informed, we’ve introduced new warnings in the metadata object:

    • NO_EVENTS: The shipping line shared container data but not event details.
    • NO_CONTAINERS: No container information was received from the shipping line.

These updates ensure greater transparency and more meaningful insights, even when shipping data is incomplete.

Examples

NO_EVENTS

Previous Response:

{
    "errorCode": 200,
    "message": "NO_EVENTS",
    "details": [
        "Request completed successfully. The line provided information on containers, but did not provide information on events"
    ],
    "time": "2025-01-20T10:14:27Z"
}

Updated Response:

{
    "metadata": {
        "shipmentType": "CT",
        "shipmentNumber": "DFSU1942290",
        "sealine": "TXZJ",
        "sealineName": "T.S. Lines",
        "shippingStatus": "UNKNOWN",
        "updatedAt": "2025-01-20T09:03:21Z",
        "warnings": [
            "NO_EVENTS",
            "NO_POL",
            "NO_POD"
        ]
    },
    "locations": [],
    "route": {
        "prepol": {
            "location": null,
            "date": null,
            "actual": null,
            "predictiveEta": null
        },
        "pol": {
            "location": null,
            "date": null,
            "actual": null,
            "predictiveEta": null
        },
        "pod": {
            "location": null,
            "date": null,
            "actual": null,
            "predictiveEta": null
        },
        "postpod": {
            "location": null,
            "date": null,
            "actual": null,
            "predictiveEta": null
        }
    },
    "vessels": [],
    "facilities": [],
    "containers": [
        {
            "number": "DFSU1942290",
            "isoCode": null,
            "status": "UNKNOWN",
            "events": []
        }
    ],
    "routeData": {
        "routeSegments": [],
        "coordinates": null,
        "ais": {
            "status": "NOT_ON_BOARD",
            "data": null
        }
    }
}

NO_CONTAINERS

Previous Response:

{
    "errorCode": 200,
    "message": "NO_CONTAINERS",
    "details": [
        "Request completed successfully. The line did not provide container information"
    ],
    "time": "2025-01-20T10:16:15Z"
}

Updated Response:

{
    "metadata": {
        "shipmentType": "BL",
        "shipmentNumber": "EUKOULAW1993277",
        "sealine": "EUKO",
        "sealineName": "Eukor",
        "shippingStatus": "DELIVERED",
        "updatedAt": "2025-01-20T08:48:22Z",
        "warnings": [
            "NO_CONTAINERS"
        ]
    },
    "locations": [
        {
            "name": "Ulsan",
            "state": "Ulsan",
            "country": "South Korea",
            "countryCode": "KR",
            "locode": "KRUSN",
            "coordinates": {
                "lat": 35.53722,
                "lng": 129.31667
            },
            "timezone": "Asia/Seoul"
        },
        {
            "name": "Antwerp",
            "state": "Flanders",
            "country": "Belgium",
            "countryCode": "BE",
            "locode": "BEANR",
            "coordinates": {
                "lat": 51.22047,
                "lng": 4.40026
            },
            "timezone": "Europe/Brussels"
        }
    ],
    "route": {
        "prepol": {
            "location": null,
            "date": null,
            "actual": null,
            "predictiveEta": null
        },
        "pol": {
            "location": {
                "name": "Ulsan",
                "state": "Ulsan",
                "country": "South Korea",
                "countryCode": "KR",
                "locode": "KRUSN",
                "coordinates": {
                    "lat": 35.53722,
                    "lng": 129.31667
                },
                "timezone": "Asia/Seoul"
            },
            "date": "2024-11-10T00:00:00+09:00",
            "actual": true,
            "predictiveEta": null
        },
        "pod": {
            "location": {
                "name": "Antwerp",
                "state": "Flanders",
                "country": "Belgium",
                "countryCode": "BE",
                "locode": "BEANR",
                "coordinates": {
                    "lat": 51.22047,
                    "lng": 4.40026
                },
                "timezone": "Europe/Brussels"
            },
            "date": "2024-12-31T00:00:00+01:00",
            "actual": true,
            "predictiveEta": null
        },
        "postpod": {
            "location": null,
            "date": null,
            "actual": null,
            "predictiveEta": null
        }
    },
    "vessels": [],
    "facilities": [],
    "containers": [],
    "routeData": {
        "routeSegments": [],
        "coordinates": null,
        "ais": {
            "status": "NOT_ON_BOARD",
            "data": null
        }
    }
}

💡

These 2 cases will translate to webhooks. shipment.added.to.endpoint and shipment.any.change events will be sent.