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. Создать отправление
Единственный обязательный вызов интеграции.
Запрос
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 | Адрес доставки. Обязателен по смыслу, если доставляет курьер. |
deliveryType | COURIER · PVZ_PICKUP | Курьером до двери или самовывоз из пункта выдачи. По умолчанию курьер. |
pickupPointId | uuid | Пункт выдачи при самовывозе. Список пунктов выдаём вместе с ключом. |
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.
