TimeToCargo

Navo24 / TrackingMCP

Migrate from Navo24 / TrackingMCP to TimeToCargo API v2: authentication, requests and response handling

This guide covers migration from Navo24 REST API v1 to TimeToCargo API v2. Navo24 POST /v1/containers immediately returns a permanent record ID. A TimeToCargo batch request first returns a temporary task ID. Retrieve the permanent tracking ID from the task result.

See the migration workflow for importing references and setting up notifications. Full TimeToCargo schemas are in the API reference.

Authentication

Navo24 uses the Authorization: Bearer tmcp_… header. The Navo24 / TrackingMCP base URL is https://api.trackingmcp.com.

To switch to TimeToCargo:

  1. Create a key in your TimeToCargo account.
  2. Change the base URL to https://tracking.timetocargo.com/v2. For example, the full tracking endpoint is https://tracking.timetocargo.com/v2/tracking.
  3. Send the new key in the api_key query parameter of every request, including batch tasks and webhook management. Keys and tokens from the former provider cannot be reused.

See authentication for key usage and request limits.

Tracking records and identifiers

Navo24 / TrackingMCPTimeToCargoRequired change
container record (data.id)shipment.idMap the source data.id to the new tracking ID. A bill of lading or booking result can contain several containers.
identifiertrack_numberPass identifier as the tracking reference. Do not replace it with the internal Navo24 record ID.
container statusshipment_statusRead shipment progress from shipment_status. Check the subscription status, ACTIVE or ARCHIVED, separately.

Operation mapping

Navo24 / TrackingMCPTimeToCargoRequired change
POST /v1/containersPOST /v2/tracking/batch → GET /v2/tracking/batchSubmit references, save task_id, and retrieve the task results. Then save each reference's permanent data.results[].data.tracking_metadata.id.
GET /v1/containersGET /v2/shipmentsReplace cursor with page and limit. Use status=ACTIVE for active subscriptions.
GET /v1/containers/{id}, GET /v1/containers/lookup/{identifier}GET /v2/shipmentsFetch /v2/shipments pages and find the record by its saved new id. There is no individual lookup by ID or reference.
POST /v1/containers/{id}/recheckGET /v2/tracking?force_update=truePass the reference, type and SCAC together with force_update=true. This request does not use the Navo24 record ID.
DELETE /v1/containers/{id}DELETE /v2/shipmentsSend the new IDs in the shipmentIds body array. Check archiving and deletion rules in the lifecycle guide.
/v1/webhooks: POST/GET/PATCH/DELETE/test/v2/webhooksCreate new webhooks and configure the secret, signature verification and notification parsing using the webhook guide.
GET /v2/events, summary, demurrageNo direct equivalentRead events from containers[].events[]. Separately retain DCSA data and demurrage calculations used by your system.

Request parameters

Navo24 / TrackingMCPTimeToCargoRequired change
identifiertracked_items[].track_number.valueIn the POST /v2/tracking/batch body, copy identifier into tracked_items[].track_number.value.
identifier_typetracked_items[].track_number.typeReplace container_id with container, bill_of_lading with bl, and booking with bk.
carrier_codetracked_items[].companyFind the carrier through GET /v2/companies and pass its scac in tracked_items[].company.
cursor / limit / archivedpage / limit / statusSwitch to numbered pages using page. Use status=ARCHIVED for archived records and status=ACTIVE for active ones.
bl_number / container_numberNo complete equivalentChoose one primary reference. If Navo24 requires both a bill of lading and a container for a carrier, test tracking with the chosen reference separately.
tags / tracked_fromnote / no equivalentSave one label of up to 40 characters as note through PATCH /v2/shipments/{id}. Keep other tags locally. There is no tracked_from event cutoff.

Response fields

Select a record from data.data[] in the GET /v2/shipments response. Paths starting with tracked_item are relative to that record. Containers are in tracked_item.data.data.containers[], with events in each container's events[]. In GET /v2/tracking, shipment data is directly under data.

Navo24 / TrackingMCPTimeToCargoResponse handling
data.items[]data.data[]Iterate over data.data instead of data.items. Continue fetching pages through data.meta.totalPages.
data.items[].iddata.data[].idStore new IDs alongside the source Navo24 IDs. Use only the new IDs to edit labels or stop tracking.
identifier / identifier_typetracked_item.track_number / tracked_item.track_number_typeIn the selected record, read the reference from tracked_item.track_number and its type from tracked_item.track_number_type.
statustracked_item.data.data.shipment_statusReplace Navo24 status handling with shipment_status values, for example in_transit with IN_TRANSIT. The record's outer status describes the subscription.
events / route / current positiontracked_item.data.data.containers[].events / route_infoRead events from the selected record's tracked_item.data.data.containers[].events[]. Add need_route=true to the list request when you need route_info.

Response examples

Each pair labels the former-provider and TimeToCargo responses. Expand the longer JSON examples when you need them; the mapping tables remain visible. These are shortened examples with illustrative data. The path above each JSON block identifies the part shown. Paths in the following table start from that part.

Request acceptance and two ID types

Navo24 / TrackingMCP — POST /v1/containers

Shortened response.

{
    "ok": true,
    "data": {
        "id": "33333333-3333-4333-8333-333333333333",
        "identifier": "MSCU1234567",
        "status": "unknown",
        "carrier_code": "MSCU"
    }
}

TimeToCargo — POST /v2/tracking/batch

Shortened response.

{
    "success": true,
    "status": "OK",
    "data": {
        "task_id": "22222222-2222-4222-8222-222222222222"
    }
}

How to map

Navo24 / TrackingMCPTimeToCargoRequired change
data.id = "33333333-3333-4333-8333-333333333333"data.task_id = "22222222-2222-4222-8222-222222222222"Do not save task_id as the tracking ID. Retrieve the task result and take the permanent ID from data.results[].data.tracking_metadata.id.
data.identifier = "MSCU1234567"No direct equivalentKeep the submitted reference locally until results arrive. The task-creation response contains only the task ID.
data.status = "unknown"status = "OK"OK confirms that the request was accepted. Shipment progress will be available in the task result's shipment_status.

The creation response contains only the task ID. After PROCESSED, retrieve the permanent ID from data.results[].data.tracking_metadata.id. Use it to locate the stored record and update its label.

List, reference type and ETA

How to map

Navo24 / TrackingMCPTimeToCargoRequired change
data.items[0].id = "33333333-3333-4333-8333-333333333333"data.data[0].id = "11111111-1111-4111-8111-111111111111"Map the Navo24 ID to the new id. Container numbers remain unchanged.
data.items[0].identifier_type = "container_id"data.data[0].tracked_item.track_number_type = "container"Read the type from tracked_item.track_number_type. For a container, the value is container.
data.items[0].status = "in_transit"data.data[0].tracked_item.data.data.shipment_status = "IN_TRANSIT"Read progress from tracked_item.data.data.shipment_status. The example value is IN_TRANSIT.
data.items[0].eta = "2026-10-12T08:00:00+02:00"data.data[0].tracked_item.data.data.summary.pod.date = "2026-10-12T08:00:00"Use summary.pod.date for arrival at the discharge port. Do not substitute it for final delivery to the destination address.
data.items[0].eta_is_estimated = truedata.data[0].tracked_item.data.data.containers[0].events[0].actual = falseCheck actual=false for an event with an estimated date. eta_is_estimated=true does not mean arrival has occurred.
data.items[0].tags = ["Order 123"]data.data[0].note = "Order 123"Move one required tag into note if it fits within 40 characters. Keep the remaining tags in your system.
data.has_more = falsedata.meta.totalPages = 1Instead of has_more, compare the current page with data.meta.totalPages and increment page.

Dates illustrate field formats. Preserve source offset and timezone meaning: deleting Z or +08:00 is not a timezone conversion.

Event and position from the detail response

How to map

Navo24 / TrackingMCPTimeToCargoRequired change
events[0].equipment_reference = "MSCU1234567"containers[0].number = "MSCU1234567"Find the container by containers[].number and process its events.
events[0].equipment_event_type_code = "LOAD"containers[0].events[0].status_code = "CLL"Here, LOAD is at the origin port and corresponds to CLL. Check a separate code for loading at other journey stages.
events[0].event_classifier_code = "ACT"containers[0].events[0].actual = trueReplace ACT with actual=true, and EST and PLN with actual=false.
events[0].transport_call.locationlocations[0]Resolve event.location through locations. Use the source name and UN/LOCODE when checking the location match.
vessel_positionroute_info.current_position = [1.25,103.75]Read the current point from route_info.current_position as [latitude, longitude]. Route last_updated does not replace the AIS measurement time.
eta_confidence_pct = 85No direct equivalentThere is no forecast confidence percentage field. Do not derive it from the planned date or shipment status.

Data to retain separately

After batch submission, retrieve the task result with status PROCESSED and save permanent IDs from data.results[].data.tracking_metadata.id. These examples cover the Navo24 REST API. SeaRates compatibility mode and DCSA use different formats, so review those handlers separately.

Last updated on