Заказы
API заказов rw_orders, вложенных контактов, доставки, комментариев, строк товаров и данных о резервах.
Эта страница описывает API v1 Legacy для заказов. Для нового unified контракта используйте
переключатель API v2 Unified в левом меню, Scribe documentation или OpenAPI spec.
Основные v2 routes: /api/v2/orders, /api/v2/orders/{id},
/api/v2/orders/{id}/lines.
Постраничный список заказов. Нужен orders.view.
| Exact/in filters | o_id, o_status_id, o_wh_id, o_shop_id, o_type_id, o_source_id, o_customer_type, o_company_id, o_is_cod. |
|---|---|
| LIKE filters | o_ext_id, ods_track_number, одиночный фрагмент или массив фрагментов. |
| Диапазоны | o_sum_from/to, o_date_from/to, o_date_send_from/to, created_at_from/to. |
| Сортировка | sort=-o_date,o_sum. Разрешены o_id, o_date, o_date_send, o_sum, created_at. |
| Пагинация | per_page максимум 500, по умолчанию 250. |
| Резерв | В каждом заказе возвращается reservation, а в каждой строке offers[] возвращаются reservation и reservation_items. Для статуса 30 эти поля показывают, чего не хватило для сборки. |
GET /api/orders?o_wh_id[]=2&o_status_id[]=30&ods_track_number=CDEK-123&o_date_from=2026-02-01&sort=-o_date&per_page=50
Один заказ с вложенными offers, contact, ds, comments и расчетом резерва. Нужен orders.view.
Если заказ перешел в статус 30 ("Нет товара"), API показывает недостающие количества без отдельного запроса. Расчет строится по эффективным складским позициям: обычные строки идут как есть, кванты и составные товары могут раскрываться в фактические позиции резерва.
reservation.ready | true, если все эффективные позиции полностью зарезервированы. |
|---|---|
reservation.missing_total | Суммарное количество, которого не хватило для резерва заказа. |
reservation.missing_items | Список фактических складских товаров, по которым есть недостача. Здесь могут быть компоненты составного товара или кванты. |
offers[].reservation.missing_qty | Сколько не хватило по конкретной строке заказа. |
offers[].reservation.status | reserved, partial, missing или not_required. |
offers[].reservation_items | Детализация эффективных позиций, относящихся к строке заказа. |
{
"o_id": 49060,
"o_status_id": 30,
"reservation": {
"ready": false,
"reason": "Не все товары заказа зарезервированы.",
"expected_total": 3,
"reserved_total": 1,
"unreserved_total": 3,
"missing_total": 2,
"missing_items": [
{
"offer_id": 77,
"offer_name": "Coffee 250g",
"required_qty": 3,
"reserved_qty": 1,
"unreserved_qty": 2,
"missing_qty": 2,
"source_order_offer_ids": [123],
"source": "order_offer"
}
],
"error": false
},
"offers": [
{
"oo_id": 123,
"oo_offer_id": 77,
"oo_qty": 3,
"reservation": {
"required_qty": 3,
"reserved_qty": 1,
"unreserved_qty": 2,
"missing_qty": 2,
"status": "partial"
},
"reservation_items": [
{
"offer_id": 77,
"offer_name": "Coffee 250g",
"required_qty": 3,
"reserved_qty": 1,
"missing_qty": 2,
"source": "order_offer"
}
]
}
]
}
Создает заказ. Нужен orders.create. Поля o_sum и o_cod_sum запрещены и считаются системой.
| Обязательные | o_type_id, o_shop_id, o_wh_id. |
|---|---|
| Уникальность | Если передан o_ext_id, пара o_ext_id + o_wh_id должна быть уникальной. |
| Статус | По умолчанию 10. Если передан o_status_id=105, ставится 105. |
| DS | Если объект ds передан непустым, ds.ods_ds_id обязателен для ApiShip и прямых интеграций без службы доставки по умолчанию. Для CDEK можно передать только ds.ods_source_id=cdek-15, если в этой интеграции задано ca_ds_id: NWMS подставит службу доставки из интеграции. Legacy число без префикса считается ApiShip. Тариф прямой интеграции передается в ds.ods_tariff_code; для СДЭК это tariff_code конкретного заказа. |
{
"o_type_id": 1,
"o_ext_id": "ORD-49060",
"o_shop_id": 85,
"o_wh_id": 106,
"o_is_cod": false,
"o_shipping_price": 0,
"contact": {
"oc_first_name": "John",
"oc_phone": "+15551234567",
"oc_email": "john@example.com",
"oc_full_address": "Sofia, Bulgaria"
},
"ds": {
"ods_ds_id": 1,
"ods_source_id": "cdek-15",
"ods_tariff_code": 136,
"ods_track_number": "TRACK-123",
"ods_ds_pp_id": "MSK1005",
"ods_delivery_date": "2026-03-10",
"ods_delivery_time_start": "09:00",
"ods_delivery_time_end": "18:00"
},
"comments": {
"oc_ds_text": "Leave at reception",
"oc_inner_text": "VIP client"
},
"offers": [
{
"oo_offer_id": 77,
"oo_qty": 2,
"oo_price": 39.95,
"oo_oc_price": 39.95
},
{
"oo_offer_ext_id": "EXT-88",
"oo_qty": 1,
"oo_price": 9.99
}
]
}
Строки товаров можно передать сразу при создании. Для каждой строки нужен oo_offer_id или oo_offer_ext_id.
Частичное обновление заказа, контакта, доставки и комментариев. Нужен orders.update.
- Если у заказа еще нет строки
rw_order_ds, при первом обновленииdsполеds.ods_ds_idобязательно, кроме CDEK-источника с заполненнымca_ds_id. - Основные поля заказа обновляются только если
o_status_id < 15. - Контакт и DS не обновляются в статусах 106-109.
- Габариты/вес пишутся в первое место заказа.
{
"contact": {
"oc_phone": "+359888123456"
},
"ds": {
"ods_ds_id": 1,
"ods_tariff_code": 136,
"ods_order_label": "https://example.com/label.pdf"
},
"comments": {
"oc_inner_text": "Internal note"
}
}
Удаляет заказ. Нужен orders.delete; legacy delete разрешен admin/warehouse_manager. Удаление доступно только для заказов с o_status_id <= 10.
Добавляет строки товаров в заказ. Нужен orders.update, заказ должен быть редактируемым (o_status_id <= 10).
[
{
"oo_offer_id": 77,
"oo_qty": 2,
"oo_price": 39.95,
"oo_oc_price": 39.95,
"oo_expiration_date": "2026-12-31",
"oo_batch": "LOT-2026"
}
]
Обновляет строку товара в заказе. offer_id здесь это rw_order_offers.oo_id, не rw_offers.of_id.
{
"oo_qty": 5,
"oo_price": 45.00
}
Удаляет строку товара из заказа и пересчитывает остатки заказа. Заказ должен быть в редактируемом статусе.
Строка заказа может ссылаться как на базовый товар, так и на квант. Квант хранится в rw_offers как отдельный оффер с package.kind=quant, но остатки ведутся в стандартных таблицах whc_wh_items/whc_rests.
| Базовая строка | Если заказ пришел в базовых единицах, WMS может использовать доступные кванты и остаток в штуках при резервировании/подборе. |
|---|---|
| Строка-квант | Если заказ пришел отдельной строкой-квантом, отгружается физический остаток этого кванта. |
| Остатки | GET /api/products возвращает physical_stocks и aggregate_stocks. Для polling доступен фильтр inventoryUpdated_from. |
Список документов разукомплектации квантов. Нужен доступ stock_transfers.view. Фильтры: after_id, qu_wh_id, qu_status, from, to, per_page.
Возвращает документ разукомплектации со строками, исходными квантами, выходными товарами и фактическими количествами проведения.
Создает документ разукомплектации. Если передать conduct=true, документ будет сразу проведен. Проведение уменьшает остаток исходного кванта и увеличивает остаток его непосредственного родителя.
{
"qu_wh_id": 2,
"qu_date": "2026-07-05",
"qu_ext_id": "UNPACK-1001",
"conduct": true,
"items": [
{
"source_offer_id": 501,
"source_qty": 2,
"source_place_id": 10,
"target_place_id": 10,
"batch": "LOT-2026",
"expiration_date": "2027-01-01"
}
]
}
Для кванта с кратностью 5 такая строка создаст движение -2 по кванту и +10 по родительскому товару.
Добавляет строку в новый документ разукомплектации. Документ должен быть в статусе 1.
Проводит документ разукомплектации. После проведения документ не редактируется; корректировка должна выполняться отдельным обратным складским документом.
Журнал изменений остатков для инкрементальной выгрузки. Клиент хранит последний полученный id и запрашивает следующие движения через after_id.
| Polling | GET /api/stock-movements?after_id=12345&per_page=500, обрабатывать строго по возрастанию id. |
|---|---|
| Фильтры | sm_offer_id, sm_base_offer_id, sm_wh_id, sm_doc_type, sm_doc_id, movement_type, from, to. |
| Разукомплектация | movement_type=quant_unpacking, sm_doc_type=8. В журнал попадают две строки: минус по кванту и плюс по родителю. |
| Количество | quantity_delta выражено в физической единице оффера, base_quantity_delta - в базовой единице товара. |