Cargotime

ShipsGo

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

Руководство описывает переход с ShipsGo Ocean API v2 на Cargotime API v2. Создание отслеживания, получение сохранённых данных и получение маршрута рассмотрены отдельно. Для старого ContainerService v1.2 параметры отличаются.

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

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

ShipsGo передаёт токен в заголовке X-Shipsgo-User-Token. Базовый адрес ShipsGo Ocean v2 — https://api.shipsgo.com/v2.

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

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

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

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

ShipsGoCargotimeЧто изменить
shipment.idshipment.idСохраните соответствие числового ID ShipsGo и нового ID отслеживания. Для управления записью используйте новый ID.
shipment.containers[]tracked_item.data.data.containers[]В выбранной записи списка получайте контейнеры из tracked_item.data.data.containers[]. У одного коносамента их может быть несколько.
shipment.reference / tagsnote + ваша системаПеренесите одну подпись до 40 символов в note. Остальные теги и дополнительные сведения храните у себя.

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

ShipsGoCargotimeЧто изменить
POST /ocean/shipmentsPOST /v2/tracking/batch → GET /v2/tracking/batchОтправьте номера через POST /v2/tracking/batch, получите результаты через GET /v2/tracking/batch и сохраните data.results[].data.tracking_metadata.id.
GET /ocean/shipmentsGET /v2/shipmentsПолучайте записи постранично через page и limit. Фильтр status выбирает действующие или архивные подписки.
GET /ocean/shipments/{shipment_id}GET /v2/shipmentsПолучите страницы списка и найдите запись по сохранённому новому ID. Отдельного запроса получения по ID нет.
PATCH /ocean/shipments/{shipment_id}PATCH /v2/shipments/{id}Передайте в теле {"note":"ваша подпись"}. Допускается до 40 символов. Другие поля записи этим методом не изменяются.
DELETE /ocean/shipments/{shipment_id}DELETE /v2/shipmentsПередайте новые ID в массиве shipmentIds. Учтите правила архивации и удаления из жизненного цикла.
GET /ocean/shipments/{shipment_id}/geojsonGET /v2/shipments?need_route=trueПолучайте route_info из сохранённой записи. Если карте нужен GeoJSON, преобразуйте массивы точек и поменяйте порядок координат.
GET /ocean/carriersGET /v2/companiesНайдите SCAC перевозчика и проверьте поддержку контейнеров, коносаментов или букингов в cn, bl, bk.
POST /…/{shipment_id}/tags, DELETE /…/{shipment_id}/tags/{tag_id}PATCH /v2/shipments/{id} (частично)Используйте note только для одной подписи. Коллекцию тегов, добавление отдельных тегов и поиск по ним реализуйте в своей системе.
POST/DELETE /…/followersНет прямого аналогаПеренесите адреса получателей в свою систему рассылки. Вебхуки отправляют HTTP-уведомления и не подписывают пользователей на письма.

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

ShipsGoCargotimeЧто изменить
container_numbertracked_items[].track_number.valueВ теле пакетного запроса передайте номер в tracked_items[].track_number.value и укажите track_number.type: "container".
booking_numbertrack_number.value + typeОпределите, содержит поле номер букинга или коносамента. Передайте номер в track_number.value, а в type укажите соответственно bk или bl.
carriertracked_items[].companyЗамените код ShipsGo на SCAC из GET /v2/companies. Код вида SG_… нельзя передавать в company без сопоставления.
reference / tagsnote после созданияСначала получите постоянный ID отслеживания, затем сохраните подпись через PATCH /v2/shipments/{id}. Поля note в пакетном запросе нет.
filters / order_by / skip / takestatus / page / limitЗамените skip и take на page и limit. Дополнительные фильтры и сортировку выполняйте у себя после получения нужных страниц.

Поля ответа

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

ShipsGoCargotimeКак обработать ответ
shipment.iddata.data[].idПолучайте постоянный ID из data.data[].id и сохраняйте связь с исходным shipment.id. Временный task_id для этого не подходит.
shipment.carrier.scactracked_item.data.data.summary.company.scacs[]Получайте коды из summary.company.scacs. Поле содержит массив, поэтому проверяйте наличие нужного SCAC в нём.
shipment.statustracked_item.data.data.shipment_statusДля движения в пути используйте IN_TRANSIT вместо SAILING. Прибытие, выгрузку и доставку обрабатывайте как отдельные этапы.
shipment.containers[].movements[]tracked_item.data.data.containers[].events[]Обрабатывайте containers[].events[]. Получайте время из date, признак факта из actual, код из status_code.
shipment.routetracked_item.data.data.summary / route_infoПолучайте порты из summary.pol и summary.pod. Линию маршрута берите из route_info.route[].path при need_route=true.

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

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

Запись, подпись и состояние перевозки

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

ShipsGoCargotimeЧто изменить
id = 1001id = "11111111-1111-4111-8111-111111111111"Сохраните пару «ID ShipsGo → новый ID». Значение 1001 не передаётся в методы управления новым отслеживанием.
reference = "Order 123"note = "Order 123"Сохраните Order 123 в note отдельным запросом после создания отслеживания. Максимальная длина — 40 символов.
container_number = "MSCU1234567"tracked_item.track_number = "MSCU1234567"Номер остаётся прежним. В записи списка он находится в tracked_item.track_number, тип — в tracked_item.track_number_type.
status = "SAILING"tracked_item.data.data.shipment_status = "IN_TRANSIT"Для показанного этапа используйте shipment_status: "IN_TRANSIT" вместо SAILING.
containers[0].type = "High Cube Dry"tracked_item.data.data.containers[0].type = "40' High Cube Dry"В новом ответе размер и тип контейнера объединены в containers[].type. Обновите отображение этих данных.
tagsНет прямого аналогаЕсли note уже занят номером заказа, сохраните теги отдельно. Несколько независимых тегов одним note не заменить.

События контейнера, прогноз и места событий

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

ShipsGoCargotimeЧто изменить
number = "MSCU1234567"containers[0].number = "MSCU1234567"Найдите нужный контейнер по containers[].number, затем обработайте его events.
movements[0].event = "LOAD"containers[0].events[1].status_code = "CLL"Погрузка в порту отправления в этом примере обозначена CLL. Для погрузки при перегрузке проверяйте код CLT.
movements[1].status = "EST"containers[0].events[0].actual = falseЗамените ACT на actual=true, EST на actual=false. Не считайте прогноз завершённым событием.
movements[1].timestamp = "2026-10-12T08:00:00+02:00"containers[0].events[0].date = "2026-10-12T08:00:00"Разбирайте смещение +02:00, если оно есть в дате. Признак фактического события определяйте по actual, а не по формату времени.
movements[0].locationlocations[0]Вместо вложенного объекта места найдите запись в locations по event.location.
movements[0].vessel.name = "EXAMPLE VESSEL"containers[0].events[1].vessel = "EXAMPLE VESSEL"Получайте название судна из строки event.vessel. Не ожидайте вложенный объект с именем и IMO.

Даты показывают форматы полей. При переносе учитывайте смещение и часовой пояс источника: удаление Z или +08:00 не является преобразованием времени.

GeoJSON и массив координат маршрута

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

ShipsGoCargotimeЧто изменить
geometry.coordinatesroute_info.route[0].pathПри преобразовании GeoJSON поменяйте порядок каждой точки с [долгота, широта] на [широта, долгота].
properties.current.coordinates = [103.75,1.25]route_info.current_position = [1.25,103.75]Получайте текущую точку отдельно из route_info.current_position. Она также использует порядок [широта, долгота].
geometry.type = "LineString"route_info.route[0].type = "sea"Используйте sea как вид транспорта. LineString описывает форму GeoJSON и не является допустимой заменой sea.
properties.status = "CURRENT"Нет прямого аналогаНе преобразуйте CURRENT в статус перевозки или подписки. Это состояние участка маршрута ShipsGo, для которого здесь нет отдельного поля.

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

Для отображения уже сохранённого маршрута используйте GET /v2/shipments?need_route=true. Запросы GET /v2/tracking?need_route=true и POST /v2/tracking/batch?need_route=true запускают отслеживание и могут расходовать кредиты. Если ваша карта использует GeoJSON, преобразуйте точки из [широта, долгота] в [долгота, широта].

Обновлено