Подключение по схеме DBS
Пошаговое руководство - создание локаций, полигонов, работа с заказами.
DBS (Delivery by Seller) – схема, при которой продавец самостоятельно управляет логистикой: создаёт склады, определяет полигоны доставки, обрабатывает заказы.
Введение
Участники
| Мерчант | Продавец — собирает заказ на своём складе и доставляет покупателю курьером, в ПВЗ или через внешнюю службу доставки. |
|---|---|
| API | DBS Seller API — REST-интерфейс (POST JSON). |
| Витрина | Бэкенд маркетплейса — принимает заказы, назначает склад (location_id), передаёт адрес и тип доставки. Покупатель выбирает слот доставки на витрине. Слоты настраиваются на витрине по данным от мерчанта; в API это сейчас не вынесено. Слоты не связаны с полигонами доставки. |
Константы примеров
| Склад DBS | location_id: "wh-msk-dbs-01" |
|---|---|
| Полигон | polygon_id: "poly-msk-center-01" — зона курьерской доставки по Москве |
| Дата доставки | 2026-06-15, слот 10:00–14:00 (выбран покупателем на витрине) |
| Заказы | ORD-DBS-2026-301 (смартфон, курьер), ORD-DBS-2026-302 (чайник, ПВЗ) |
В DBS нет отгрузок и грузомест — жизненный цикл строится вокруг одного заказа и его статусов. Один заказ DBS в API — один товар (
offer_id,product_id).
Сценарий 0: Подготовка инфраструктуры DBS
До поступления заказов мерчант настраивает склад, зоны доставки (полигоны) и тарифы. Полигон описывает только зону и стоимость доставки — не слоты. Слоты настраиваются на витрине по данным от мерчанта; в API это сейчас не вынесено. Слоты не связаны с полигонами доставки.
Диаграмма последовательности
Пошаговое описание
- Создание склада. POST
/v1/location/create— локация с типомWAREHOUSE. В ответе —location_id(например,wh-msk-dbs-01). Статус локации отслеживается черезlocation/list. - Полигон доставки. POST
/v1/polygon/create— контур зоны (coordinates) и тарифы (delivery_options: цена, вес, НДС, тип доставки). Полигон задаёт зону и стоимость доставки, не слоты. Полигон создаётся в статусеDRAFT; активация — на стороне витрины (polygon/list). - Привязка к складу. POST
/v1/polygon/bind— связатьpolygon_idиlocation_id. - Остатки и цены. POST
/v1/product/stock/updateи POST/v1/product/price/update— актуальные данные по товарам на складе. Без остатков заказ на витрине не оформится. Текущие значения можно читать через POST/v1/product/stock/infoи POST/v1/product/price/info. - Обновление опций (при необходимости). POST
/v1/polygon/delivery-options/update— изменение тарифов без пересоздания полигона; POST/v1/polygon/coordinates/update— корректировка границ зоны. Удаление полигона — POST/v1/polygon/delete; архивация склада — POST/v1/location/archive.
Слоты настраиваются на витрине по данным от мерчанта; в API это сейчас не вынесено. Слоты не связаны с полигонами доставки. Покупатель выбирает интервал на витрине при оформлении заказа.
JSON-примеры
Шаг 1 — POST /v1/location/create
{
"locations": [{
"merchant_location_id": "wh-msk-dbs-01",
"location_types": ["WAREHOUSE"],
"name": "Склад DBS Москва",
"address_tail": "125009, г. Москва, ул. Тверская, д. 1"
}]
}
Шаг 2 — POST /v1/polygon/create (фрагмент)
{
"polygons": [{
"name": "Москва — центр",
"location_id": "wh-msk-dbs-01",
"coordinates": [[[37.61, 55.75], [37.65, 55.78]]],
"delivery_options": [{
"weight_from": 0,
"weight_to": 30,
"price": 299,
"vat": "VAT_22",
"delivery_time_minutes": 240,
"delivery_types": [{ "delivery_type": "COURIER" }]
}]
}]
}
Шаг 3 — POST /v1/polygon/bind
{
"polygon_id": "poly-msk-center-01",
"location_id": "wh-msk-dbs-01"
}
Шаг 4 — POST /v1/product/stock/update
{
"stocks": [{
"offer_id": "PHONE-001",
"product_id": "PRD-PHONE-01",
"location_id": "wh-msk-dbs-01",
"count": 50
}]
}
В теле stock/update массив называется
stocks(неitems). Достаточно указатьoffer_idилиproduct_id; если переданы оба, приоритет уoffer_id. Максимум 200 элементов в запросе.
Цены загружаются отдельным вызовом POST /v1/product/price/update (поля currency, items — см. спецификацию метода).
Сценарий 1: Курьерская доставка — полный happy path
Мерчант получает заказ ORD-DBS-2026-301 в статусе NEW с типом доставки COURIER. Слот доставки покупатель уже выбрал на витрине при оформлении. Мерчант подтверждает заказ, при необходимости корректирует слот или адрес, передаёт данные экземпляра (IMEI), упаковывает и передаёт курьеру. Код вручения (handover-code/set) — опционально: по договорённости витрины и мерчанта, мерчант может передать код покупателю или витрине. Заказ ведётся через DELIVERING до DELIVERED.
Диаграмма последовательности
Пошаговое описание
- Опрос обновлений. POST
/v1/order/dbs/status/list— периодический запрос изменений статусов (filter.status,filter.updated_at,cursor). Ответ:order_updates[]сmerchant_order_id,status,updated_at. - Карточка заказа. POST
/v1/order/dbs/list— детали:delivery(типCOURIER,address_tail),requirements,customer, цены,item_type(PRODUCT/SERVICE), опциональноactionsиhandover_code. Для курьерской доставкиaddress_tail— полная строка адреса (индекс, город, населённый пункт, улица, дом, квартира), например:125009, г. Москва, ул. Тверская, д. 10, кв. 5. ДляSERVICEможет быть заполненlinked_merchant_order_ids. - Подтверждение. POST
/v1/order/dbs/status/update→ CONFIRMED,changed_by: "MERCHANT",changed_at(RFC3339). - Слот доставки при необходимости. Первичный выбор слота — на витрине покупателем. POST
/v1/order/dbs/timeslot/setпозволяет мерчанту обновить интервал (delivery_date_begin,delivery_date_end,changed_by), если это согласовано с клиентом. Слоты настраиваются на витрине по данным от мерчанта; в API это сейчас не вынесено. Слоты не связаны с полигонами доставки. - Экземпляр товара. POST
/v1/order/dbs/exemplar/set— один объектexemplar:marksсmark_type: "imei"приrequirements.requires_imei: true. - Упаковка. POST
/v1/order/dbs/status/update→ PACKED. На складе заказ собран и готов к передаче курьеру. - Код вручения опционально. POST
/v1/order/dbs/handover-code/set— мерчант регистрирует код в API. По договорённости витрины и мерчанта, мерчант может передать код покупателю или витрине. Курьер получает код от мерчанта своими средствами, не через API. Шаг не обязателен в happy path. - В доставке. POST
/v1/order/dbs/status/update→ DELIVERING — курьер выехал. - Доставлен. POST
/v1/order/dbs/status/update→ DELIVERED — покупатель получил заказ. При использовании кода вручения сверка происходит на стороне мерчанта/курьера.
Слот и дату доставки можно изменить, если это согласовано с клиентом (
timeslot/set); адрес — по договорённости витрины и мерчанта (delivery-address/set).
Порядок работы на складе
┌─────────────────────────────────────────────────────────────┐
│ 0. Слот выбран покупателем на витрине (до поступления NEW) │
│ 1. Заказ NEW — status/list + list │
│ 2. status/update → CONFIRMED │
│ 3. (опц.) timeslot/set — корректировка слота мерчантом │
│ 4. exemplar/set → IMEI / маркировка по requirements │
│ 5. СБОРКА и УПАКОВКА на складе wh-msk-dbs-01 │
│ 6. status/update → PACKED │
│ 7. (опц.) handover-code/set → код в API; по договорённости │
│ витрины и мерчанта — покупателю или витрине; курьеру — │
│ напрямую от мерчанта, не через API │
│ 8. Передача заказа курьеру │
│ 9. status/update → DELIVERING │
│ 10. status/update → DELIVERED │
└─────────────────────────────────────────────────────────────┘
Правило: exemplar/set до PACKED; timeslot/set — при корректировке слота; handover-code/set — опционально, после PACKED; по договорённости витрины и мерчанта мерчант может передать код покупателю или витрине; курьеру — не через API.
Слоты настраиваются на витрине по данным от мерчанта; в API это сейчас не вынесено. Слоты не связаны с полигонами доставки.
JSON-примеры
Шаг 1 — POST /v1/order/dbs/status/list
{
"cursor": "",
"filter": {
"status": ["NEW"],
"updated_at": "2026-06-14T00:00:00+03:00"
}
}
{
"order_updates": [{
"merchant_order_id": "ORD-DBS-2026-301",
"client_order_id": "CLT-80001",
"status": "NEW",
"updated_at": "2026-06-14T11:20:00+03:00"
}],
"next_cursor": ""
}
Шаг 2 — POST /v1/order/dbs/list
{
"cursor": "",
"filter": {
"merchant_order_id": ["ORD-DBS-2026-301"],
"status": ["NEW"]
}
}
{
"orders": [{
"merchant_order_id": "ORD-DBS-2026-301",
"client_order_id": "CLT-80001",
"location_id": "wh-msk-dbs-01",
"status": "NEW",
"item_type": "PRODUCT",
"delivery": {
"delivery_type": "COURIER",
"address_tail": "125009, г. Москва, ул. Тверская, д. 10, кв. 5"
},
"product_id": "PRD-PHONE-01",
"offer_id": "PHONE-001",
"requirements": {
"requires_imei": true,
"requires_mandatory_mark": false
},
"actions": [{ "type": "cancel", "enabled": true }]
}],
"next_cursor": "",
"total": 1
}
Шаг 3 — POST /v1/order/dbs/status/update (CONFIRMED)
{
"merchant_order_id": "ORD-DBS-2026-301",
"status": "CONFIRMED",
"changed_at": "2026-06-14T11:25:00+03:00",
"changed_by": "MERCHANT"
}
Шаг 4 — POST /v1/order/dbs/timeslot/set (корректировка мерчантом)
Покупатель уже выбрал слот на витрине при оформлении. Ниже — два примера, как мерчант обновляет интервал через API после согласования с клиентом (например, перенос на другой день или другое доступное окно). Поля delivery_date_begin и delivery_date_end — RFC3339 с часовым поясом адреса доставки.
Москва (UTC+3) — курьер, адрес 125009, г. Москва, ул. Тверская, д. 10, кв. 5
Покупатель выбрал на витрине слот 10:00–14:00 на 15.06.2026; мерчант переносит доставку на вечернее окно 14:00–18:00 того же дня.
{
"merchant_order_id": "ORD-DBS-2026-301",
"delivery_date_begin": "2026-06-15T14:00:00+03:00",
"delivery_date_end": "2026-06-15T18:00:00+03:00",
"changed_by": "MERCHANT"
}
Новосибирск (UTC+7) — курьер, адрес 630099, г. Новосибирск, ул. Красный проспект, д. 25, кв. 12
Склад wh-nsk-dbs-01. Покупатель выбрал на витрине слот 10:00–14:00; мерчант согласовал с клиентом перенос на следующий день, окно 14:00–18:00 по местному времени.
{
"merchant_order_id": "ORD-DBS-2026-305",
"delivery_date_begin": "2026-06-16T14:00:00+07:00",
"delivery_date_end": "2026-06-16T18:00:00+07:00",
"changed_by": "MERCHANT"
}
Шаг 5 — POST /v1/order/dbs/exemplar/set
{
"merchant_order_id": "ORD-DBS-2026-301",
"product_id": "PRD-PHONE-01",
"offer_id": "PHONE-001",
"exemplar": {
"exemplar_id": 1,
"marks": [{
"mark": "35693803564341",
"mark_type": "imei"
}],
"weight": 0.22
}
}
Шаг 7 (опционально) — POST /v1/order/dbs/handover-code/set
По договорённости витрины и мерчанта, мерчант может передать код покупателю или витрине (вне API). Курьеру код сообщается мерчантом напрямую.
{
"handover_codes": [{
"merchant_order_id": "ORD-DBS-2026-301",
"code": "482917"
}]
}
Шаг 6, 8–9 — смена статусов
{
"merchant_order_id": "ORD-DBS-2026-301",
"status": "PACKED",
"changed_at": "2026-06-15T08:30:00+03:00",
"changed_by": "MERCHANT"
}
{
"merchant_order_id": "ORD-DBS-2026-301",
"status": "DELIVERING",
"changed_at": "2026-06-15T09:00:00+03:00",
"changed_by": "MERCHANT"
}
{
"merchant_order_id": "ORD-DBS-2026-301",
"status": "DELIVERED",
"changed_at": "2026-06-15T11:45:00+03:00",
"changed_by": "MERCHANT"
}
Сценарий 2: Доставка в ПВЗ / самовывоз
Заказ ORD-DBS-2026-302 с delivery_type: "PICKUP_POINT". После PACKED мерчант передаёт заказ в пункт выдачи и выставляет READY_FOR_PICKUP вместо DELIVERING. Финальный статус — DELIVERED при выдаче покупателю. Если покупатель не забрал заказ, мерчант может перевести его в CANCELLED.
- Шаги 1–2 как в сценарии 1 — опрос и карточка; в
delivery—delivery_type: "PICKUP_POINT",provider_location_idпункта выдачи. - POST
/v1/order/dbs/status/update→CONFIRMED→PACKED. Корректировка слота черезtimeslot/setдля ПВЗ обычно не требуется. - Мерчант доставляет посылку в ПВЗ (вне API).
- POST
/v1/order/dbs/status/update→READY_FOR_PICKUP— заказ ожидает покупателя в пункте. - После выдачи — POST
/v1/order/dbs/status/update→DELIVERED. - Если покупатель не забрал заказ в срок — POST
/v1/order/dbs/status/update→CANCELLED(изREADY_FOR_PICKUP).
Для
CLICK_AND_COLLECT(самовывоз с точки продавца) цепочка аналогична:PACKED→READY_FOR_PICKUP→DELIVEREDилиCANCELLED, если покупатель не забрал заказ. Код вручения (handover-code/set) — опционально: по договорённости витрины и мерчанта, мерчант может передать код покупателю или витрине.
Сценарий 3: Отмена заказа
Отмена в DBS реализуется двумя путями. Запрос покупателя идёт через витрину → заявка в cancellation/*, которую мерчант одобряет или отклоняет. Если отменяет мерчант — он меняет статус заказа напрямую через POST /v1/order/dbs/status/update → CANCELLED.
Путь A — отмена по запросу покупателя (через витрину)
- Покупатель инициирует отмену на витрине; витрина создаёт заявку.
- POST
/v1/cancellation/list—filter.status: ["NEW"] - POST
/v1/cancellation/update—status: "APPROVED_CANCEL"или"DECLINED". Полеcomment— опционально. - При одобрении заказ переходит в CANCELLED на стороне витрины.
Витрина и мерчант могут согласовать отмену без подтверждения заявки до отгрузки — условия обсуждаются при интеграции.
Путь B — отмена мерчантом
- Мерчант принимает решение об отмене (товар недоступен, ошибка и т.д.).
- POST
/v1/order/dbs/status/update—status: "CANCELLED",changed_by: "MERCHANT". - Отдельная заявка
cancellation/*не требуется.
JSON — POST /v1/cancellation/update
{
"cancellation_id": 10042,
"status": "APPROVED_CANCEL",
"comment": "Товар не собран, отмена одобрена"
}
Поле
commentвcancellation/update— необязательное. Его можно передать при отклонении заявки для пояснения покупателю.
JSON — отмена мерчантом через статус
{
"merchant_order_id": "ORD-DBS-2026-301",
"status": "CANCELLED",
"changed_at": "2026-06-14T12:00:00+03:00",
"changed_by": "MERCHANT"
}
Сценарий 4: Внешняя служба доставки (СД)
Мерчант передаёт заказ в CDEK / Boxberry и сообщает трек-номер через POST /v1/order/dbs/delivery-provider/update. Далее статусы DELIVERING / DELIVERED выставляет мерчант по данным СД (автообновление по треку в спецификации не описано).
- После
PACKED— создание отправления в личном кабинете СД. - POST
/v1/order/dbs/delivery-provider/update—provider_posting_id(трек), опциональноprovider_check_url. - POST
/v1/order/dbs/status/update→DELIVERING. - По факту вручения СД —
DELIVERED.
JSON — POST /v1/order/dbs/delivery-provider/update
{
"merchant_order_id": "ORD-DBS-2026-301",
"provider_posting_id": "11087654321000",
"provider_check_url": "https://cdek.ru/track?order=11087654321000"
}
Стоимость доставки для сверки с тарифом полигона: POST
/v1/order/dbs/delivery-cost/get— передатьclient_order_idsи/илиmerchant_order_ids.
Сценарий 5: Возврат DBS
Покупатель оформляет возврат на витрине. Мерчант опрашивает POST /v1/return/list, рассматривает заявку и меняет статус через POST /v1/return/dbs/status/set. При необходимости обновляет данные экземпляра — POST /v1/return/dbs/exemplar/update.
Типичная цепочка рассмотрения: NEW → PENDING / DELIVERY_APPROVED → DELIVERING → DELIVERED → APPROVED (или REJECT_REFUND). Другие статусы из спецификации: NEEDS_INFO, REJECT_PENDING, PARTIAL_REFUND, DELIVERY_TO_CLIENT, CANCELED, CLOSED.
JSON — POST /v1/return/dbs/status/set
{
"return_id": 5001,
"status": "DELIVERY_APPROVED"
}
{
"return_id": 5001,
"status": "APPROVED"
}
Статусы и ключевые правила
Статусы заказа DBS
| NEW | Новый заказ — поступил на склад продавца |
|---|---|
| CONFIRMED | Подтверждён продавцом, можно начинать сборку |
| PACKED | Упакован, готов к передаче в доставку / ПВЗ |
| DELIVERING | Доставляется курьером (или СД) |
| READY_FOR_PICKUP | Ожидает выдачи в ПВЗ или на точке самовывоза; при незаборе — переход в CANCELLED |
| DELIVERED | Доставлен / выдан покупателю |
| CANCELLED | Отменён — через cancellation/* (запрос покупателя) или status/update (мерчант) |
Типы доставки
| COURIER | Курьер до адреса — address_tail обязателен (полная строка: индекс, город, населённый пункт, улица, дом, квартира); цепочка через DELIVERING |
|---|---|
| PICKUP_POINT | Доставка в ПВЗ — provider_location_id; цепочка READY_FOR_PICKUP → DELIVERED или CANCELLED |
| CLICK_AND_COLLECT | Самовывоз с точки продавца — READY_FOR_PICKUP → DELIVERED или CANCELLED |
Ключевые правила интеграции
| Единица работы | Один заказ = один товар. Нет отгрузок и грузомест (в отличие от FBS). |
|---|---|
| Инфраструктура | location/create → polygon/create → polygon/bind — зоны и тарифы доставки; см. сценарий 0. Дополнительно: location/archive, polygon/delete, polygon/list |
| Остатки и цены | Запись: product/stock/update (stocks[]), product/price/update (items[]). Чтение: product/stock/info, product/price/info |
| Опрос | order/dbs/status/list для событий (filter.updated_at, status), order/dbs/list для деталей. Webhook в API нет. |
| Карточка заказа | item_type: PRODUCT или SERVICE; для услуги — linked_merchant_order_ids. Поле actions — разрешённые действия (сейчас cancel) |
| Экземпляры | exemplar/set — один объект exemplar; сверять с requirements в карточке заказа |
| Слоты | Покупатель выбирает слот на витрине. timeslot/set — обновление интервала мерчантом. Слоты настраиваются на витрине по данным от мерчанта; в API это сейчас не вынесено. Слоты не связаны с полигонами доставки |
| Адрес и слот | Слот и дату можно изменить, если это согласовано с клиентом (timeslot/set); адрес — по договорённости (delivery-address/set) |
| Код вручения | handover-code/set — опционально, тело handover_codes[] с merchant_order_id + code. По договорённости витрины и мерчанта код можно передать покупателю или витрине; курьер получает код от мерчанта напрямую, не через API |
| Трек СД | delivery-provider/update — внешний трек-номер |
| Отмена | Покупатель → витрина → cancellation/list + cancellation/update. Мерчант → status/update → CANCELLED |
| Возвраты | return/list, return/dbs/status/set, return/dbs/exemplar/update |
| State machine | Допустимые переходы в спецификации не описаны — ниже предлагаемая таблица |
| Ошибки API | HTTP 400, 401, 429, 500; тело ApiError: error_type, code, message, details |
Предлагаемая state machine заказа DBS
Рекомендация для спецификации, не официальная часть API. Таблица отражает логику сценариев из этой инструкции. Реализация витрины может отличаться до фиксации в спецификации.
Допустимые переходы
| Из | В | Кто инициирует | Условия / примечания |
|---|---|---|---|
| NEW | CONFIRMED | MERCHANT | Мерчант принял заказ в работу (status/update) |
| NEW | CANCELLED | MERCHANT | status/update → CANCELLED (отмена мерчантом) |
| NEW | CANCELLED | CLIENT / MARKET | Через cancellation/* → APPROVED_CANCEL (запрос покупателя через витрину) |
| CONFIRMED | PACKED | MERCHANT | Заказ собран; до перехода — exemplar/set по requirements |
| CONFIRMED | CANCELLED | MERCHANT | status/update → CANCELLED |
| CONFIRMED | CANCELLED | CLIENT / MARKET | Через cancellation/update → APPROVED_CANCEL |
| PACKED | DELIVERING | MERCHANT | delivery_type: COURIER или внешняя СД; опционально handover-code/set; для СД — delivery-provider/update |
| PACKED | READY_FOR_PICKUP | MERCHANT | PICKUP_POINT или CLICK_AND_COLLECT |
| PACKED | CANCELLED | MERCHANT | status/update → CANCELLED |
| DELIVERING | DELIVERED | MERCHANT | Факт вручения |
READY_FOR_PICKUP | DELIVERED | MERCHANT | Покупатель забрал заказ |
READY_FOR_PICKUP | CANCELLED | MERCHANT | Покупатель не забрал заказ (status/update) |
| DELIVERED | — | — | Терминальный статус |
| CANCELLED | — | — | Терминальный статус |
Нерекомендуемые переходы
Технически API может принять и другие смены статуса, но для корректного понимания жизненного цикла заказа мерчантом не рекомендуется пропускать этапы или смешивать ветки доставки:
| Переход | Почему не рекомендуется |
|---|---|
NEW → PACKED / DELIVERING / DELIVERED | Пропуск подтверждения и подготовки — затрудняет учёт на складе |
CONFIRMED → DELIVERING / DELIVERED | Без статуса PACKED не отражён факт сборки |
PACKED → DELIVERED (курьер) | Для COURIER ожидается промежуточный DELIVERING |
PACKED → DELIVERING при PICKUP_POINT | Для ПВЗ/самовывоза — READY_FOR_PICKUP, не DELIVERING |
Любой → из DELIVERED / CANCELLED | Терминальные статусы |
DELIVERING ↔ READY_FOR_PICKUP | Разные ветки по delivery_type |
Предусловия перед ключевыми статусами
| Целевой статус | Рекомендуемые предусловия |
|---|---|
PACKED | exemplar/set выполнен, если requirements требуют IMEI/маркировку |
DELIVERING | Статус PACKED; для внешней СД — delivery-provider/update |
READY_FOR_PICKUP | Статус PACKED; физическая передача в ПВЗ/на точку |
DELIVERED | Из DELIVERING или READY_FOR_PICKUP |
CANCELLED | Либо cancellation/update → APPROVED_CANCEL (покупатель), либо status/update → CANCELLED (мерчант); в т.ч. из READY_FOR_PICKUP при незаборе |
Полный справочник методов DBS
Все методы DBS с детальными параметрами и ответами доступны в разделе API Reference DBS.