API V1 Legacy
Эта страница относится только к старому совместимому контракту /api/*. Новый API v2 находится в отдельной ветке сайта.

Заказы

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.

GET/api/orders

Постраничный список заказов. Нужен orders.view.

Exact/in filterso_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 filterso_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
GET/api/orders/{id}

Один заказ с вложенными offers, contact, ds, comments и расчетом резерва. Нужен orders.view.

Резервыполя ответа заказа

Если заказ перешел в статус 30 ("Нет товара"), API показывает недостающие количества без отдельного запроса. Расчет строится по эффективным складским позициям: обычные строки идут как есть, кванты и составные товары могут раскрываться в фактические позиции резерва.

reservation.readytrue, если все эффективные позиции полностью зарезервированы.
reservation.missing_totalСуммарное количество, которого не хватило для резерва заказа.
reservation.missing_itemsСписок фактических складских товаров, по которым есть недостача. Здесь могут быть компоненты составного товара или кванты.
offers[].reservation.missing_qtyСколько не хватило по конкретной строке заказа.
offers[].reservation.statusreserved, 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"
        }
      ]
    }
  ]
}
POST/api/orders

Создает заказ. Нужен 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.

PUT/api/orders/{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"
  }
}
DELETE/api/orders/{id}

Удаляет заказ. Нужен orders.delete; legacy delete разрешен admin/warehouse_manager. Удаление доступно только для заказов с o_status_id <= 10.

POST/api/orders/{id}/offers

Добавляет строки товаров в заказ. Нужен 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"
  }
]
PUT/api/orders/{order_id}/offers/{offer_id}

Обновляет строку товара в заказе. offer_id здесь это rw_order_offers.oo_id, не rw_offers.of_id.

{
  "oo_qty": 5,
  "oo_price": 45.00
}
DELETE/api/orders/{order_id}/offers/{offer_id}

Удаляет строку товара из заказа и пересчитывает остатки заказа. Заказ должен быть в редактируемом статусе.

Квантызаказы и упаковки

Строка заказа может ссылаться как на базовый товар, так и на квант. Квант хранится в rw_offers как отдельный оффер с package.kind=quant, но остатки ведутся в стандартных таблицах whc_wh_items/whc_rests.

Базовая строкаЕсли заказ пришел в базовых единицах, WMS может использовать доступные кванты и остаток в штуках при резервировании/подборе.
Строка-квантЕсли заказ пришел отдельной строкой-квантом, отгружается физический остаток этого кванта.
ОстаткиGET /api/products возвращает physical_stocks и aggregate_stocks. Для polling доступен фильтр inventoryUpdated_from.
GET/api/quant-unpackings

Список документов разукомплектации квантов. Нужен доступ stock_transfers.view. Фильтры: after_id, qu_wh_id, qu_status, from, to, per_page.

GET/api/quant-unpackings/{id}

Возвращает документ разукомплектации со строками, исходными квантами, выходными товарами и фактическими количествами проведения.

POST/api/quant-unpackings

Создает документ разукомплектации. Если передать 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 по родительскому товару.

POST/api/quant-unpackings/{id}/items

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

POST/api/quant-unpackings/{id}/conduct

Проводит документ разукомплектации. После проведения документ не редактируется; корректировка должна выполняться отдельным обратным складским документом.

GET/api/stock-movements

Журнал изменений остатков для инкрементальной выгрузки. Клиент хранит последний полученный id и запрашивает следующие движения через after_id.

PollingGET /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 - в базовой единице товара.