ODMarketplace
На главную OD
Содержание
1. С чего начать2. Авторизация3. Создать отправление4. Поля запроса5. Что дальше6. Ошибки7. Правила расчётов8. Подключение
OD / ЛОГИСТИКА · API ДЛЯ ПАРТНЁРОВv1

API логистики OD

Вы передаёте нам заказ — мы доставляем его покупателю в Таджикистане и принимаем оплату при вручении. Интеграция занимает один запрос.

1. С чего начать

Вы отправляете заказ с данными клиента и составом посылки, в ответ получаете Order ID — короткий код, который показываете покупателю. С этим кодом он получает посылку у курьера или в пункте выдачи.

СредаБазовый адресДля чего
Тестоваяhttps://dev-api.odsell.com/logistics/api/v1Разработка и проверка интеграции. Заказы реальными не считаются.
Боеваяhttps://api.odsell.com/logistics/api/v1Выдаётся вместе с боевым ключом после проверки интеграции.

Начинайте с тестовой: она работает так же, как боевая, включая выдачу Order ID. Переключение — только смена адреса и ключа, код менять не придётся.

2. Авторизация

Каждый запрос несёт два заголовка. Первый общий для платформы, второй — ваш личный: по нему мы понимаем, чей это заказ.

ЗаголовокЗначение
X-API-KeyКлюч доступа к платформе.
X-Partner-TokenВаш партнёрский ключ. Не передавайте его в браузер и мобильное приложение — запрос делает ваш сервер.

Ключ утёк — скажите нам. Мы отзовём только ваш, остальные партнёры продолжат работать. Новый выдаём в тот же день.

3. Создать отправление

Единственный обязательный вызов интеграции.

POST/b2b/shipments

Запрос

curl -X POST \
  https://api.odsell.com/logistics/api/v1/b2b/shipments \
  -H "X-API-Key: <ключ платформы>" \
  -H "X-Partner-Token: <ваш ключ>" \
  -H "Content-Type: application/json" \
  -d '{
    "sellerName": "Somon.tj",
    "clientName": "Фируза Азизова",
    "clientPhone": "+992900112233",
    "clientAddress": "Душанбе, Айни 12, кв. 4",
    "deliveryType": "COURIER",
    "goodsPaid": false,
    "codAmount": "250.00",
    "items": [
      { "name": "Кроссовки", "quantity": 1, "price": "200.00" },
      { "name": "Носки", "quantity": 2 }
    ]
  }'

Ответ · 201

{
  "orderId": "WGAKZT",
  "barcode": "OD0985159694",
  "status": "CREATED"
}
  • orderId — покажите покупателю и продублируйте в SMS или письме. Это одновременно номер заказа и код получения: без него посылку не выдадут.
  • barcode — код на коробке для нашего склада. Покупателю он не нужен.

Order ID выдаётся один раз и не меняется. Повторный запрос создаёт новое отправление с новым кодом, поэтому не отправляйте заказ дважды при таймауте — сначала уточните у нас.

4. Поля запроса

Всё, чего нет в таблицах, мы игнорируем — присылать лишнее безопасно.

Заказ

ПолеТипОписание
sellerNameобяз.строка, ≤160Магазин, от чьего имени идёт заказ. Видно складу и курьеру.
clientNameобяз.строка, ≤160Кому вручаем посылку.
clientPhoneобяз.строка, ≤32Телефон получателя. По нему курьер связывается перед доставкой.
itemsобяз.массив, 1–100Состав посылки. Поля позиции — в таблице ниже.
clientAddressстрока, ≤255Адрес доставки. Обязателен по смыслу, если доставляет курьер.
deliveryTypeCOURIER · PVZ_PICKUPКурьером до двери или самовывоз из пункта выдачи. По умолчанию курьер.
pickupPointIduuidПункт выдачи при самовывозе. Список пунктов выдаём вместе с ключом.
goodsPaidда / нетТовар уже оплачен у вас. По умолчанию нет — тогда деньги за товар соберём мы.
codAmountсумма, ≥ 0Сколько взять с покупателя за товар. Присылайте строкой: «250.00».
sellerPhoneстрока, ≤32Ваш контакт на случай вопросов по отправлению.
commentстрока, ≤2000Что важно знать курьеру: этаж без лифта, звонить заранее, хрупкое.

Позиция

ПолеТипОписание
nameобяз.строка, ≤255Название товара так, как его узнает покупатель.
quantityчисло, 1–1000Количество. По умолчанию 1.
priceсумма, ≥ 0Цена за единицу — попадёт в накладную.
declaredWeightKgчисло, ≤1000Ваш ориентир по весу. На стоимость доставки не влияет: мы взвешиваем сами.

5. Что дальше

Отправление проходит эти состояния. Порядок фиксированный — каждое следующее наступает только после предыдущего.

СтатусЧто произошло
CREATEDЗаказ принят, Order ID выдан. Товар вы ещё не привезли.
AT_PVZТовар принят на складе или в пункте выдачи.
READY_FOR_DISPATCHВзвесили, замерили, наклеили этикетку. Стоимость доставки зафиксирована.
WITH_COURIERПосылка у курьера и едет к получателю.
AWAITING_PAYMENTПокупатель назвал Order ID, курьер принимает оплату.
DELIVEREDВручено, деньги получены. Отправление закрыто.

Если получатель отказался или не вышел на связь, отправление переходит в RETURNED с указанной причиной, а товар возвращается вам.

6. Ошибки

Формат ответа одинаковый для всех ошибок. Читайте detail.message — там человеческая формулировка, её можно показывать оператору как есть.

{
  "detail": {
    "message": "Неизвестный партнёрский токен",
    "code": "unauthorized"
  }
}
КодКогдаЧто делать
401Ключ платформы или партнёрский ключ неверен либо не передан.Проверьте оба заголовка. Повтор с тем же ключом не поможет.
422Не хватает обязательного поля или значение не подходит по типу.В ответе указано, какое поле. Исправьте и отправьте снова.
400Данные формально верны, но заказ так не создать — например, неизвестный тип доставки.Читайте сообщение, оно называет причину.
503Сервис временно недоступен.Повторите через минуту. Заказ при такой ошибке не создаётся.

7. Правила расчётов

Три вещи, из-за которых чаще всего возникают вопросы. Лучше знать их до запуска.

Доставку считаем по факту, а не по вашему весу

Стоимость фиксируется после того, как посылку взвесили и замерили у нас. Присланный declaredWeightKg — только ориентир для склада. Берём больший из фактического и объёмного веса, как это делает любой перевозчик.

Несколько посылок одному человеку — доставка одна

Если покупатель получает сразу несколько коробок, они объединяются в партию и доставка считается один раз по суммарному весу. Отдельно за каждую коробку покупатель не платит.

Покупатель платит при получении

При goodsPaid: false курьер соберёт стоимость доставки и сумму codAmount за товар. Если товар уже оплачен у вас, укажите goodsPaid: true — тогда с покупателя возьмут только доставку.

Заказ закрывается только вручную. Статус DELIVERED ставит сотрудник после того, как пересчитал деньги. Автоматически по времени или по факту доставки он не выставляется.

8. Подключение

Порядок такой же, как у любого перевозчика, только быстрее.

ШагЧто происходит
ЗаявкаНапишите нам название магазина и контакт технического специалиста. Ключи к тестовой среде выдаём в тот же день.
ИнтеграцияОдин запрос из вашего бэкенда. Проверьте, что Order ID сохраняется у вас и виден покупателю.
ПроверкаСоздаёте тестовое отправление, мы смотрим данные и подсказываем, если чего-то не хватает.
ЗапускМеняете адрес и ключ на боевые. Код остаётся прежним.

За ключами и списком пунктов выдачи — к вашему менеджеру OD.