Cargotime

Порядок перехода

Перенос номеров, идентификаторов, данных и уведомлений на Cargotime API v2

Следуйте этому порядку вместе с руководством по вашему сервису. Здесь описаны общие действия, а на странице сервиса указано, какие методы и поля заменить. Полные схемы запросов и ответов — в справочнике API.

1. Сохраните номера и связи идентификаторов

Одна запись Cargotime отслеживает один номер: контейнера, коносамента (bl) или букинга (bk, бронирования перевозки). Результат по коносаменту или букингу может содержать несколько контейнеров. Внутренние ID прежнего сервиса не переносятся. После запуска сохраните соответствие старых и новых ID в своей базе.

ЗначениеНазначениеЧто сохранить
Номер контейнера, коносамента или букингаНомер, по которому перевозчик предоставляет данныеСохраните номер вместе с типом и SCAC перевозчика. Эти значения понадобятся для запроса.
ID прежнего сервисаСсылка на прежнюю запись в вашем приложенииСохраните исходный ID и свяжите его с новым ID отслеживания после получения результата.
data.task_idВременный ID пакетной задачиСохраните до получения результатов. Не используйте его для изменения или остановки отслеживания.
data.tracking_metadata.idПостоянный ID отслеживанияСохраните вместе с исходным ID. В ответе списка этот же ID находится в data.data[].id.
containers[].numberНомер контейнера внутри результатаСохраните вместе с новым ID отслеживания, если ваша система ведёт отдельный учёт контейнеров по одному документу.

2. Настройте аутентификацию и параметры запроса

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

Для одного номера используйте GET /v2/tracking, для нескольких — POST /v2/tracking/batch.

ДанныеGET /v2/trackingPOST /v2/tracking/batch
Ключ доступаПараметр URL api_keyТот же параметр URL api_key
НомерПараметр URL valueПоле tracked_items[].track_number.value в теле JSON
Тип номераПараметр URL type: container, bl или bkПоле tracked_items[].track_number.type с теми же значениями
ПеревозчикПараметр URL companyПоле tracked_items[].company в теле JSON
Запрос маршрутаПараметр URL need_route=trueТот же параметр URL need_route=true для пакетного запроса
Подпись отслеживанияПосле получения постоянного ID выполните PATCH /v2/shipments/{id} с полем noteПолучите постоянный ID из результата задачи и выполните такой же PATCH

Номер, тип и перевозчик обязательны. Через GET /v2/companies найдите SCAC перевозчика и проверьте поддержку нужного типа номера в cn, bl или bk. Числовой ID или внутренний код другого сервиса сначала сопоставьте с этим справочником. Автоматическое определение перевозчика company=AUTO доступно только при type=container. Для коносамента и букинга укажите SCAC.

3. Настройте вебхуки и сохраните историю

Если нужны уведомления с первых обновлений, создайте вебхуки через POST /v2/webhooks до переноса номеров. Они настраиваются для аккаунта. Передавать callback_url в каждом запросе отслеживания не нужно. Настройте event_types, новый секрет, проверку подписи и обработку повторных доставок по руководству по вебхукам.

GET /v2/webhook-notifications содержит сведения о доставке уведомлений. Для собственного архива обновлений сохраняйте полученные уведомления у себя. Историю прежнего сервиса, теги, сроки бесплатного вывоза контейнеров, сборы, измерения AIS и пользовательские поля выгрузите отдельно.

4. Разделите запуск отслеживания и получение сохранённых данных

ДействиеОперацияЧто изменить в приложении
Запустить отслеживание одного номера и получить ответGET /v2/trackingПередайте номер, тип и перевозчика. Запрос может активировать отслеживание и израсходовать кредит.
Запустить фоновую обработку от 1 до 500 номеровPOST /v2/tracking/batchПередайте массив tracked_items. Сохраните возвращённый data.task_id.
Получить результат задачиGET /v2/tracking/batch?task_id=…Дождитесь data.status: "PROCESSED" и обработайте каждый элемент data.results[].
Получить сохранённые отслеживанияGET /v2/shipments?page=1&limit=50&status=ACTIVEПеребирайте data.data[] и запрашивайте страницы до data.meta.totalPages. Для архивных записей используйте status=ARCHIVED.
Получить сохранённый маршрутGET /v2/shipments?need_route=trueПолучайте tracked_item.data.data.route_info выбранной записи. Обработайте возможный null.
Изменить подписьPATCH /v2/shipments/{id}Передайте note длиной до 40 символов. Пустая строка очищает подпись.
Остановить отслеживанияDELETE /v2/shipmentsПередайте массив новых ID в shipmentIds в теле запроса. Проверьте условия архивации и удаления в жизненном цикле.

Для получения одной сохранённой записи найдите её по новому ID в страницах /v2/shipments. Отдельного GET /v2/shipments/{id} и фильтра списка по ID нет. Не заменяйте получение сохранённых данных повторным запуском /v2/tracking: у этих операций разное назначение и правила списания кредитов.

Например, запрос одного контейнера:

GET https://tracking.cargotime.ru/v2/tracking?api_key=YOUR_API_KEY&value=MSCU1234567&type=container&company=MSCU

Два ответа пакетной обработки

Отправьте POST /v2/tracking/batch?api_key=YOUR_API_KEY с телом:

{
    "tracked_items": [
        {
            "track_number": {
                "type": "container",
                "value": "MSCU1234567"
            },
            "company": "MSCU"
        }
    ]
}

Ответ на запуск содержит ID задачи. Данные перевозки нужно получить отдельным запросом:

Ответ POST /v2/tracking/batch

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

Затем выполните GET /v2/tracking/batch?api_key=YOUR_API_KEY&task_id=22222222-2222-4222-8222-222222222222. Ниже показан пример завершённой задачи с условными данными контейнера, событиями и постоянным ID отслеживания.

Статусы задачи: CREATED — ожидает обработки, HANDLING — обрабатывается, PROCESSED — обработка завершена. После PROCESSED проверяйте success и status каждого элемента data.results[]. Завершение задачи не означает, что данные найдены по всем номерам.

Связывайте результат с исходным номером через results[].request.track_number. Сохраняйте постоянный results[].data.tracking_metadata.id, если data и tracking_metadata не равны null. Результаты хранятся до 6 часов. Сохраните их после завершения задачи; пример опроса с ограничением повторов — в пакетном отслеживании.

5. Обновите обработку ответа

В GET /v2/tracking данные перевозки находятся в data. В GET /v2/shipments сначала выберите запись из data.data[], затем получите её данные по путям из третьего столбца.

ДанныеВ ответе GET /v2/trackingВ выбранной записи data.data[]
Состояние перевозкиdata.shipment_statustracked_item.data.data.shipment_status
Перевозчик и основные точки маршрутаdata.summarytracked_item.data.data.summary
Контейнеры и событияdata.containers[].events[]tracked_item.data.data.containers[].events[]
Места событийdata.locations[]tracked_item.data.data.locations[]
Терминалыdata.terminals[]tracked_item.data.data.terminals[]
Маршрут и текущая точкаdata.route_infotracked_item.data.data.route_info
ID отслеживанияdata.tracking_metadata.idid
Статус подпискиdata.tracking_metadata.statusstatus: ACTIVE или ARCHIVED

Проверяйте статусы по отдельности:

  • success и status сообщают результат API-запроса. В списке также проверьте tracked_item.data.success и tracked_item.data.status каждой записи.
  • data.status пакетной задачи сообщает, завершена ли её обработка.
  • ACTIVE и ARCHIVED относятся к подписке на отслеживание.
  • shipment_status описывает состояние перевозки: например, IN_TRANSIT или DELIVERED.

Для событий используйте status_code, date и actual. При наличии всех дат события идут от новых к старым; если дата отсутствует, сохраняется порядок перевозчика. Не сопоставляйте события разных сервисов по индексу массива.

Например, CLL означает погрузку в порту отправления, CLT — погрузку при перегрузке. По event.location найдите объект с соответствующим id в locations, по event.terminal — в terminals. actual=true означает произошедшее событие, false — ожидаемое. Если значение равно null, сведений недостаточно. Дату без часового пояса нельзя автоматически считать UTC.

Маршрут запрашивается через need_route=true. Если информации о перевозке недостаточно для его построения, route_info может быть null. Координаты в route_info имеют порядок [широта, долгота]. Для GeoJSON поменяйте его на [долгота, широта].

Пустой результат не означает доставку. Разделяйте отсутствие данных, ошибки перевозчика и завершённую перевозку. Повторные запросы и HTTP 429 обрабатывайте по руководству по ошибкам, учитывая Retry-After, если он передан.

6. Проверьте переход на небольшой выборке

  1. Выгрузите номера, типы, перевозчиков и связи исходных ID. Для проверки можно использовать пробный период Cargotime. При запуске учитывайте правила расходования доступных отслеживаний.
  2. Проверьте контейнер, коносамент или букинг с несколькими контейнерами, отсутствие данных и завершённую перевозку.
  3. Сравните ответы по примерам из руководства сервиса. Проверьте пути к полям, коды событий, плановые и фактические даты, координаты. Прогнозы разных сервисов могут отличаться.
  4. Проверьте переход между страницами, ошибки отдельных номеров в пакетной задаче, отсутствие маршрута и повторную доставку уведомлений.
  5. Переключите получение данных и уведомлений на Cargotime. Сохраните таблицу соответствий ID и возможность возврата к прежней интеграции. После проверки остановите прежние подписки: Cargotime не отменяет их автоматически.

Обновлено