Интеграции
26 Mar

Интеграция по API с Яндекс.Доставкой - Доставка в другой день

Продолжаем серию статей по интеграции с транспортными кампаниями. В прошлой статье мы говорили о ТК СДЭК

Сегодня поговорим о интеграции Яндекс.Доставки а именно доставка в другой день.

Такая интеграция может пригодиться например интернет-магазинам, маркет плейсам и т.д.

Как и в прошлой статье мы поговорим о базовых методах:

  • получение списка ПВЗ
  • расчет стоимости перевозки
  • создание заказа на перевозку
  • получение информации о заказе
  • отмена заказа

Image description

Ссылка на API документацию Яндекс.Доставки тут

Подготовка

API интеграция с Яндекс.Доставкой в другой день работает в 2х режимах:

  • Боевой - зарегистрируйтесь в личном кабинете и получите Bearer-токен. Используйте хост https://b2b-authproxy.taxi.yandex.net
  • Тестовый - для доступа используйте:
  • хост - https://b2b.taxi.tst.yandex.net
  • Bearer-токен - y2_AgAAAAD04omrAAAPeAAAAAACRpC94Qk6Z5rUTgOcTgYFECJllXYKFx8
  • platform_station_id - fbed3aa1-2cc6-4370-ab4d-59c5cc9bb924

Получение списка ПВЗ

Для получения списка всех ПВЗ Яндекс.Доставки необходимо отправить POST-запрос на адрес /api/b2b/platform/pickup-points/list с необязательными JSON-параметрами. С помощью параметров можно отфильтровать ПВЗ по типу, городу и другим критериям.

В ответе вы получите массив объектов ПВЗ с указанием кода, города, страны, режима работы и других параметров (см документацию).

Например, получим все ПВЗ:

curl --location --request POST 'https://b2b.taxi.tst.yandex.net/api/b2b/platform/pickup-points/list' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer y2_AgAAAAD04omrAAAPeAAAAAACRpC94Qk6Z5rUTgOcTgYFECJllXYKFx8'

Расчет стоимости перевозки

Данный этап является важным в интеграции так как предоставляет расчет стоимости по доступным тарифам и срокам доставки.

Для того что бы рассчитать стоимость доставки необходимо отправить POST-запрос на адрес /api/b2b/platform/pricing-calculator c JSON-параметрами.

Пройдемся по важным параметрам расчета стоимости подробнее:

  • source - информация о точке отправления заказа. Обязательный параметр. Это объект в котором достаточно указать:
    • platform_station_id - ID склада отправки, зарегистрированного в платформе.
  • destination - населенный пункт куда будет отправление. Обязательный параметр. Это объект в котором достаточно указать:
    • address - Адрес получения с указанием города, улицы и номера дома. Номер квартиры, подъезда и этаж указывать не нужно.
    • platform_station_id - ID ПВЗ или постамата, зарегистрированного в платформе, в который нужна доставка
  • tariff - тип доставки. Обязательный параметр. Одно из двух:
    • time_interval - доставка до двери в интервал
    • self_pickup - доставка до ПВЗ
  • total_weight - суммарный вес посылки в граммах

Все параметры можно найти в документации.

Например отправим запрос на расчет стоимости доставки из ПВЗ до адреса:

curl --location 'https://b2b.taxi.tst.yandex.net/api/b2b/platform/pricing-calculator' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer y2_AgAAAAD04omrAAAPeAAAAAACRpC94Qk6Z5rUTgOcTgYFECJllXYKFx8' \
--data '{
    "source": {
       "platform_station_id" : "fbed3aa1-2cc6-4370-ab4d-59c5cc9bb924"
    },
    "destination": {
        "address": "г. Москва, ул. Тверская, 10"
    },
    "tariff": "time_interval",
    "total_weight": 500
}'

И получим ответ:

{
    "pricing_total": "346.8 RUB"
}

Создание заказа на перевозку

После успешного расчета стоимости доставки можем переходить к созданию заказа на доставку.

Для создания заказа необходимо отправить POST-запрос на адрес /api/b2b/platform/request/create c JSON-параметрами.

Пройдемся по важным параметрам создания заказа подробнее:

  • billing_info - Данные для биллинга. Обязательное поле. Это объект, в котором достаточно указать:
    • payment_method - Метод оплаты. Обязательное поле. Одно из already_paid, cash_on_receipt, card_on_receipt.
  • source - Информация о точке отправления заказа. Обязательное поле. Это объект, в котором достаточно указать:
    • platform_station - ПВЗ отправления. Обязательное поле. Это объект, в котором достаточно указать:
      • platform_id - Идентификатор станции в Логистической платформе
  • destination - Информация о точке получения заказа. Обязательное поле. Это объект, в котором достаточно указать:
    • type - Тип пункта назначения. Обязательное поле, custom_location - доставка до двери, platform_station - доставка до ПВЗ.
    • custom_location - Описание произвольного пункта назначения. Обязательное поле, если тип указан - custom_location. Это объект, в котором достаточно указать:
      • latitude - Широта
      • longitude - Долгота
      • details - Дополнительная информация о пункте назначения. Это объект, в котором достаточно указать:
        • full_address - Полный адрес с указанием города, улицы и номера дома.
    • interval - Временной интервал. Это объект, в котором достаточно указать:
      • from - UNIX timestamp для нижней границы интервала
      • to - UNIX timetamp для верхней границы интервала
    • platform_station - Описание пункта назначения, зарегистрирована в платформе. Обязательное поле, если тип указан - platform_station. Это объект, в котором достаточно указать:
      • platform_id - Идентификатор станции в Логистической платформе
  • recipient_info - Данные о получателе. Обязательное поле. Это объект, в котором достаточно указать:
    • first_name - Имя
    • phone - Номер телефона
  • info - Базовый набор данных по запросу. Обязательное поле. Это объект, в котором достаточно указать:
    • operator_request_id - Идентификатор заказа у отправителя. Здесь подразумевается ваш внутренний уникальный идентификатор заказа. Можно в формате uuid.
  • last_mile_policy - Способ доставки. Обязательное поле. time_interval - доставка до двери в указанный интервал, self_pickup - доставка до ПВЗ
  • places - Информация о местах в заказе. Обязательное поле. Это массив объектов, в которых достаточно указать:
    • barcode - Штрихкод коробки. Можно любое уникальное значение. Подменяется на стороне Яндекс.Доставки.
    • physical_dims - Параметры места. Это объект, в котором достаточно указать:
      • dx - Длина, сантиметры
      • dy - Высота, сантиметры
      • dz - Ширина, сантиметры
      • weight_gross - Вес брутто, граммы
  • items - Информация о предметах в заказе. Обязательное поле. Это массив объектов, в которых достаточно указать:
    • article - Артикул
    • billing_details - Данные по биллингу для предмета. Это объект, в котором достаточно указать:
      • assessed_unit_price - Оценочная цена за единицу товара, в копейках
      • unit_price - Цена за единицу товара, в копейках
    • name - Название
    • count - Количество
    • place_barcode - Штрихкод коробки, к которой относится товар

Все параметры для создания заказа можно найти в документации.

В ответе вы получите request_id, по которому можно получить информацию и удалить заказ.

Отправим запрос на создание заказа из ПВЗ до адреса:

curl --location 'https://b2b.taxi.tst.yandex.net/api/b2b/platform/request/create' \
--header 'Accept-Language: ru-RU' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer y2_AgAAAAD04omrAAAPeAAAAAACRpC94Qk6Z5rUTgOcTgYFECJllXYKFx8' \
--data '{
    "info": {
        "operator_request_id": "11122233344"
    },
    "billing_info": {
        "payment_method": "already_paid"
    },
    "source" : {
        "platform_station": {
            "platform_id": "fbed3aa1-2cc6-4370-ab4d-59c5cc9bb924"
        }
    },
    "destination": {
        "type": "custom_location",
        "custom_location": {
            "details": {
                "full_address": "г. Москва, ул. Тверская, 10"
            },
            "interval": {
                "from" : 1743055200,
                "to": 1743087600
            }
        }
    },
    "recipient_info" : {
        "first_name" : "Иванов Иван Иванович",
        "phone": "79232897920"
    },
    "last_mile_policy": "time_interval",
    "places": [
        {
            "barcode": "0",
            "physical_dims": {
                "dx": 100,
                "dy": 100,
                "dz": 100,
                "weight_gross": 500
            }
        }
    ],
    "items": [
        {
            "article": "0001",
            "billing_details": {
                "assessed_unit_price": 0,
                "unit_price": 0
            },
            "name": "Товар 1",
            "count": 1,
            "place_barcode": "0"
        }
    ]
}'

ОБратите внимание что для создания заказа обязательно необходимо указать заголовок Accept-Language: ru-RU. Без него метод работать не будет

И получим ответ:

{
    "request_id": "e4aab986b4c248378140a2591f741075-udp"
}

Получение информации о заказе

Итак, мы рассчитали стоимость и создали заказ. В дальнейшем может понадобиться посмотреть детали заказа.

Для получения информации по заказу необходимо отправить GET-запрос на адрес /api/b2b/platform/request/info с обязательным query параметром - request_id.

В ответе вы получите информацию по заказу такую как статусы, отправителя и т.д. Подробное описание информации о заказе можно найти в документации

Отправим запрос на получение информации по нашему заказу:

curl --location 'https://b2b.taxi.tst.yandex.net/api/b2b/platform/request/info?request_id=e4aab986b4c248378140a2591f741075-udp' \
--header 'Authorization: Bearer y2_AgAAAAD04omrAAAPeAAAAAACRpC94Qk6Z5rUTgOcTgYFECJllXYKFx8'

И вот ответ:

{
    "route_id": null,
    "request_id": "e4aab986b4c248378140a2591f741075-udp",
    "request": {
        "info": {
            "operator_request_id": "11122233344",
            "referral_source": "logistic-platform-offers"
        },
        "source": {
            "platform_station": {
                "platform_id": "fbed3aa1-2cc6-4370-ab4d-59c5cc9bb924"
            }
        },
        "destination": {
            "type": "custom_location",
            "custom_location": {
                "latitude": 55.76287484805335,
                "longitude": 37.60839157784731,
                "details": {
                    "country": "Россия",
                    "locality": "Москва",
                    "region": "120540",
                    "federal_district": "Москва",
                    "street": "Тверская улица",
                    "house": "10с1",
                    "full_address": "г. Москва, ул. Тверская, 10",
                    "geo_id": 120540
                }
            },
            "interval": {
                "from": 1743055200,
                "to": 1743087600
            },
            "interval_utc": {
                "from": "2025-03-27T06:00:00+0000",
                "to": "2025-03-27T15:00:00+0000"
            }
        },
        "items": [
            {
                "count": 1,
                "name": "Товар 1",
                "article": "0001",
                "barcode": "ebec1e83206f49190ae41d786e7e8960",
                "billing_details": {
                    "nds": 20,
                    "unit_price": 0,
                    "assessed_unit_price": 0
                },
                "physical_dims": {
                    "dx": 0,
                    "dy": 0,
                    "dz": 0
                },
                "place_barcode": "PmTlvDlMTWaCsi9ZmbTX/g",
                "refused_count": 0
            }
        ],
        "places": [
            {
                "physical_dims": {
                    "dx": 100.0,
                    "dy": 100.0,
                    "dz": 100.0,
                    "weight_gross": 500.0
                },
                "barcode": "PmTlvDlMTWaCsi9ZmbTX/g"
            }
        ],
        "billing_info": {
            "payment_method": "already_paid",
            "delivery_cost": 0
        },
        "recipient_info": {
            "first_name": "Иванов Иван Иванович",
            "last_name": "",
            "patronymic": "",
            "phone": "+79232897920"
        },
        "available_actions": {
            "update_dates_available": true,
            "update_address_available": false,
            "update_courier_to_pickup_available": false,
            "update_pickup_to_courier_available": false,
            "update_pickup_to_pickup_available": false,
            "update_items": false,
            "update_recipient": true,
            "update_places": true
        },
        "particular_items_refuse": false,
        "delivery_policy": {
            "min": 1743055200,
            "max": 1743087600,
            "policy": "interval_strict"
        }
    },
    "state": {
        "status": "SORTING_CENTER_LOADED",
        "description": "Заказ подтвержден в сортировочном центре",
        "timestamp_unix": 1743007677,
        "timestamp": "2025-03-26T16:47:57.000000Z"
    },
    "full_items_price": 0,
    "sharing_url": "https://logistics-frontend.taxi.tst.yandex.ru/route/bb11cebe-a0ff-4e6a-81e3-cc854e2ee205",
    "courier_name": null,
    "courier_phone": null,
    "courier_phone_ext": null,
    "courier_order_id": "2038903"
}

Отмена заказа

В ваших бизнес-процессах может появиться необходимость отменить заказ.
В Яндекс.Доставке отмена заказа с типом доставки курьером возможна только до получения статуса DELIVERY_TRANSPORTATION_RECIPIENT.

Для отмена заказа необходимо отправить POST-запрос на адрес /api/b2b/platform/request/cancel с обязательным JSON-параметром - request_id.

При успешном выполнении запроса будет создана задача на отмену заказа.

Например отменим наш заказ:

curl --location 'https://b2b.taxi.tst.yandex.net/api/b2b/platform/request/cancel' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer y2_AgAAAAD04omrAAAPeAAAAAACRpC94Qk6Z5rUTgOcTgYFECJllXYKFx8' \
--data '{
    "request_id": "e4aab986b4c248378140a2591f741075-udp"
}'

Заказ ушел на отмену:

{
    "status": "CREATED",
    "reason": "cancellation_started",
    "description": "Заявка создана; заказ отменяется"
}

Обратите внимание что после успешного выполнения, заказ отменяется не сразу, а создается задача на его отмену.


В этой статье мы рассмотрели базовые методы интеграции вашего сервиса с Яндекс.Доставкой. Мы не стали углубляться в более сложные методы, поскольку уверены, что после настройки базовой интеграции с Яндекс.Доставкой, вам будет легко разобраться с более сложными вариантами. В каждой транспортной компании существуют похожие методы интеграции, однако их реализация может существенно отличаться.

В следующих статьях мы подробнее расскажем о нюансах интеграции с ТК ПЭК, Деловые Линии, Байкал Сервис и другими.

Комментарии
Коммент.