Cargotime

project44

Переход с project44 на Cargotime API v2: ключи доступа, запросы и обработка ответов

Руководство описывает переход с project44 Unified API и Ocean API v4 на Cargotime API v2 для морских перевозок. Методы Unified и Ocean отмечены отдельно, поскольку их параметры и ответы отличаются.

Общий порядок переноса номеров и настройки уведомлений приведён в порядке перехода. Полные схемы Cargotime — в справочнике API.

Аутентификация

project44 использует OAuth с учётными данными приложения и заголовок Authorization: Bearer …. При выгрузке исходных данных используйте региональный адрес project44, настроенный для вашего аккаунта: NA или EU.

Для перехода на Cargotime:

  1. Создайте ключ в личном кабинете Cargotime.
  2. Замените базовый адрес на https://tracking.cargotime.ru/v2. Например, полный адрес запроса отслеживания — https://tracking.cargotime.ru/v2/tracking.
  3. Передавайте новый ключ в параметре URL api_key каждого запроса, включая пакетные задачи и управление вебхуками. Ключи и токены прежнего сервиса не подходят.

Правила использования ключа и ограничения запросов — в разделе аутентификации.

Отслеживания и идентификаторы

project44CargotimeЧто изменить
Unified shipment.id / Ocean masterShipmentIdshipment.id (частично)Создайте отслеживание по номеру контейнера, коносамента или букинга. Сохраните связь нового ID с исходным masterShipmentId.
Ocean oceanLegIdshipment.id + ваша таблица этаповСохраните oceanLegId вместе с исходным masterShipmentId и новым ID. Отдельный объект морского этапа в новом API не создаётся.
equipmentIdentifier / identifierstrack_number + containers[]Выберите основной номер для запроса. Номера контейнеров из результата обрабатывайте отдельно от внутренних ID project44.
events / positions / statesevents[] / route_info / shipment_statusПолучайте события, текущую точку и состояние из отдельных полей. Историю всех позиций и смены состояний сохраните до отключения project44.

Соответствие операций

project44CargotimeЧто изменить
Unified: POST /api/v4/shipments/trackingPOST /v2/tracking/batch → GET /v2/tracking/batchПередайте основные номера в пакетном запросе, получите результат задачи и сохраните постоянные ID отслеживаний.
Unified: PUT /api/v4/shipments/trackingНет прямого аналогаДля нового номера создайте новое отслеживание. Изменения плана перевозки и связей между этапами храните в своей системе.
Unified: GET /api/v4/shipments/{shipmentId}/trackingGET /v2/shipmentsПолучите страницы списка и выберите запись по новому ID из таблицы соответствий. Отдельного запроса получения по ID нет.
Unified: GET /api/v4/shipments/{shipmentId}/eventhistory, /positionhistory, /tracking/historyGET /v2/shipments?need_route=true (частично)Используйте список для получения текущих данных и маршрута. Историю событий, координат и прошлых ответов project44 выгрузите отдельно.
Ocean: POST /api/v4/ocean/shipmentsPOST /v2/tracking/batch → GET /v2/tracking/batchПередайте номер контейнера и SCAC. Сохраните task_id, получите результат и свяжите новый ID с исходными masterShipmentId и oceanLegId.
Ocean: GET /api/v4/ocean/shipments/{shipmentId}/statusesGET /v2/shipmentsНайдите запись по новому ID и получите данные из tracked_item.data.data. Если нужна текущая точка, добавьте need_route=true.
Unified: DELETE /api/v4/shipments/{shipmentId}/tracking, Ocean: DELETE /api/v4/ocean/shipments/{shipmentId}DELETE /v2/shipmentsПередайте новые ID в массиве shipmentIds. Условия остановки, архивации и удаления описаны в жизненном цикле.
GET /api/v4/shipments/{shipmentId}/attributesnote + ваша системаПеренесите одну подпись до 40 символов в note. Остальные атрибуты храните в своей системе.
GET/PUT /api/v4/webhooks, GET/DELETE /api/v4/webhooks/{webhookId}/v2/webhooksСоздайте вебхуки заново через /v2/webhooks. Обновите методы управления, проверку подписи и обработчик уведомлений по руководству.

Параметры запроса

project44CargotimeЧто изменить
Unified identifiers: CONTAINER_ID / BILL_OF_LADING / BOOKING_NUMBERtracked_items[].track_number.value + typeПередайте выбранный номер в track_number.value. Преобразуйте CONTAINER_ID в container, BILL_OF_LADING в bl, BOOKING_NUMBER в bk.
Unified identifiers: CARRIER_SCACtracked_items[].companyВозьмите значение идентификатора CARRIER_SCAC, проверьте его в GET /v2/companies и передайте в company.
Ocean equipmentIdentifiertracked_items[].track_numberДля equipmentIdentifier.type: "CONTAINER_ID" передайте его value и укажите track_number.type: "container".
Ocean carrierSCACCodetracked_items[].companyПередайте значение carrierSCACCode в company после проверки перевозчика в GET /v2/companies.
Ocean includePositionDataneed_route=trueДобавьте параметр URL need_route=true. Он включает маршрут и текущую точку, но не полную историю AIS.
attributes / plan / relatedShipments / accessGroupsnote + ваша системаОдну подпись сохраните в note отдельным PATCH. План, связи перевозок и группы доступа перенесите в свою систему.

Поля ответа

В ответе GET /v2/shipments выберите запись из data.data[]. Пути, начинающиеся с tracked_item, указаны относительно этой записи. Контейнеры находятся в tracked_item.data.data.containers[], события — в events[] каждого контейнера. В ответе GET /v2/tracking данные перевозки находятся сразу в data.

project44CargotimeКак обработать ответ
Unified id / Ocean shipment.oceanLegIddata.task_id → results[].data.tracking_metadata.idПосле запуска получите результат задачи и сохраните постоянный data.results[].data.tracking_metadata.id. Свяжите его с обоими исходными ID project44.
Unified GET tracking: identifiers / plan / routeInfotracked_item и данные перевозкиВ списке берите номер из tracked_item.track_number, сведения о перевозке из tracked_item.data.data. Отдельной копии плана project44 в ответе нет.
Ocean trackedShipment.equipmentIdentifier.valuetracked_item.data.data.containers[].numberНайдите нужный контейнер по containers[].number. Не сравнивайте его номер с внутренним ID записи.
Ocean trackedShipment.events[]tracked_item.data.data.containers[].events[]Получайте код из status_code, дату из date, признак фактического события из actual. Учитывайте порт и этап при преобразовании кода project44.
Ocean trackedShipment.stops / vesselssummary / locations / events[].vesselМесто события найдите по location в locations. Название судна получите из строки vessel самого события.
Ocean trackedShipment.positions / statesroute_info / shipment_statusИспользуйте route_info.current_position для текущей точки, shipment_status для состояния перевозки. Полных массивов истории positions и states нет.
Ocean shipmentIdmasterShipmentId в исходной системеВ исходных данных используйте актуальный masterShipmentId вместо устаревшего shipmentId. Ни один из них не заменяет новый ID отслеживания.

Примеры ответов

В каждой паре подписаны ответы прежнего сервиса и Cargotime. Большие JSON-примеры можно раскрыть отдельно от таблиц сопоставления. Это сокращённые примеры с условными данными. Над каждым JSON указан путь к показанной части ответа. Пути в следующей таблице начинаются от этой части.

Unified: идентификаторы и пользовательская подпись

Как сопоставить

project44CargotimeЧто изменить
id = "33333333-3333-4333-8333-333333333333"id = "11111111-1111-4111-8111-111111111111"Сохраните соответствие исходного и нового ID. Для управления отслеживанием используйте новый id.
identifiers[0].value = "MSCU1234567"tracked_item.track_number = "MSCU1234567"Передайте номер без изменения и задайте тип container. В списке номер находится в tracked_item.track_number.
identifiers[1].value = "MSCU"tracked_item.data.data.summary.company.scacs = ["MEDU","MSCU"]Получайте коды перевозчика из массива scacs и проверяйте наличие нужного кода в нём.
identifiers[2].value = "BOOKING123"tracked_item.data.data.references.booking_numbers = ["BOOKING123"]Дополнительный номер букинга может появиться в references.booking_numbers. Он не меняет основной тип отслеживания с container на bk.
attributes[0].values[0] = "Order 123"note = "Order 123"Сохраните Order 123 в note после получения постоянного ID. Остальные атрибуты перенесите в свою базу.
relatedShipmentsНет прямого аналогаХраните связи с другими перевозками у себя. В новом ответе массива relatedShipments нет.

Ocean: событие, порт, судно и состояние

Как сопоставить

project44CargotimeЧто изменить
equipmentIdentifier.value = "MSCU1234567"containers[0].number = "MSCU1234567"Выберите контейнер по containers[].number. В этом примере номер остаётся MSCU1234567.
events[0].eventCode = "LOADED"containers[0].events[0].status_code = "CLL"Здесь LOADED относится к PORT_OF_LOADING, поэтому соответствует CLL. Для погрузки при перегрузке нужен другой код.
events[0].stopNumber = 10containers[0].events[0].location = 0Вместо поиска по stopNumber найдите объект в locations, у которого id равен event.location.
events[0].vesselNumber = 5containers[0].events[0].vessel = "EXAMPLE VESSEL"Получайте название судна прямо из event.vessel. Поиск по vesselNumber в отдельном массиве больше не нужен.
states[0].stateCode = "ON_WATER"shipment_status = "IN_TRANSIT"Для показанной перевозки в пути используйте shipment_status: "IN_TRANSIT". Историю состояний states[] храните отдельно.
events[0].timeStamp = "2026-10-01T04:00:00Z"containers[0].events[0].date = "2026-10-01T12:00:00"В примере 04:00 UTC соответствует 12:00 в Сингапуре. Сравнивайте даты с учётом часового пояса, а не только строки времени.

Ocean: история позиций и текущая точка

project44 — GET /api/v4/ocean/shipments/{shipmentId}/statuses?includePositionData=true

Фрагмент: trackedShipment.

{
    "positions": [
        {
            "geoCoordinates": {
                "latitude": 1.2,
                "longitude": 103.7
            },
            "timeStamp": "2026-10-03T08:30:00Z",
            "vesselNumber": 5
        },
        {
            "geoCoordinates": {
                "latitude": 1.25,
                "longitude": 103.75
            },
            "timeStamp": "2026-10-03T09:00:00Z",
            "vesselNumber": 5
        }
    ]
}

Cargotime — GET /v2/shipments?need_route=true

Фрагмент: data.data[0].tracked_item.data.data.route_info.

{
    "current_position": [1.25, 103.75],
    "last_updated": "2026-10-03T09:00:00"
}

Как сопоставить

project44CargotimeЧто изменить
positions[1].geoCoordinatescurrent_position = [1.25,103.75]Получайте текущую точку из массива [широта, долгота]. Не ожидайте массив всей истории координат.
positions[1].timeStamp = "2026-10-03T09:00:00Z"last_updated = "2026-10-03T09:00:00"last_updated относится к обновлению текущей позиции, а не всей геометрии маршрута. Сохраняйте исходную метку project44 отдельно: источник позиции и часовой пояс могут отличаться.
positionsНет прямого аналогаВыгрузите прошлые позиции project44 отдельно. route[].path описывает линию маршрута и не является журналом измерений AIS.

Что сохранить отдельно

Сохраните исходные masterShipmentId и oceanLegId вместе с новым ID отслеживания. План перевозки, связи этапов, прогнозы, историю позиций и правила доступа перенесите отдельно. При обработке событий учитывайте этап: в приведённом примере LOADED соответствует CLL только потому, что погрузка происходит в порту отправления.

Обновлено