Заказы
Каждая операция ниже сгенерирована из OpenAPI v2 и содержит параметры, поля запроса, поля ответа, ошибки и примеры.
Документы, партии и фактические остатки
| stocks.physical / stocks.aggregate | Массивы складских итогов: warehouse_id, warehouse_name, stockTotal, stockReserved, stockAvailable. stocks.available_by_warehouse — объект с ключами ID складов. Не воспринимайте эти три поля как одинаковую структуру. |
|---|---|
| GET /api/v2/products/{id}/stock-lots | Физически размещённый товар по партиям и датам. Резерв без конкретной партии нельзя вычитать из произвольно выбранной партии. Сверяйте единицы количества и склад в ответе. |
| accepted_lots | Фактические партии приёмки. Ожидание, фактическая приёмка и размещение — разные показатели. Их расхождение само по себе не означает ошибку API. |
| requested_lot / fulfillment_lots | В строке заказа requested_lot описывает требование, fulfillment_lots — фактический подбор; picked_quantity — подобранное количество. Несколько фактических партий нельзя сводить к одной дате. |
| movement_type / operation | Подбор может давать пару снятия резерва и физического списания. Различайте operation; не считайте обе строки двумя списаниями. Перемещения объединяются через movement_group_id; transfer_kind уточняет вид. |
| GET /api/v2/closed-boxes | Реальные закрытые короба с уникальным SSCC: balance=1, balance_unit=box. Штрихкод типа упаковки из products не является уникальным SSCC. Открытые, отгруженные и только ожидаемые короба не входят в текущий закрытый остаток. |
| acceptance_date | При создании обычной/возвратной приёмки (type_id=1/2) текущий обработчик ставит серверное now(), даже если передана acceptance_date. Изменение существующей приёмки принимает дату. Создание type_id=3 использует отдельный cross-dock сервис. created_at/updated_at — технические метки, не дата документа. |
| Lifecycle | Отмена приёмки — отдельная команда cancel с проверкой состояния; она не равна удалению. Для строк используйте /lines, а устаревшие /offers сохраняются для совместимости. Подробные ограничения смотрите у операции. |
Заказы
Получить список заказов
| operationId | listOrders |
|---|---|
| Раздел | Заказы |
| Безопасность | bearerAuth |
Возвращает заказы, видимые аутентифицированному аккаунту. Используйте описанные query parameters для фильтрации, сортировки и пагинации.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Unknown read parameters are ignored. per_page is silently capped; use meta.per_page. Date-only boundaries follow the installation's stored calendar dates; ISO timestamps are serialized in UTC. The default general API limit is 600/minute; a user-specific override may apply. Its bucket is shared by authenticated user, not by shop/domain; Retry-After is returned on throttling.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Unknown read parameters are ignored. per_page is silently capped; use meta.per_page. Date-only boundaries follow the installation's stored calendar dates; ISO timestamps are serialized in UTC. The default general API limit is 600/minute; a user-specific override may apply. Its bucket is shared by authenticated user, not by shop/domain; Retry-After is returned on throttling.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Unknown read parameters are ignored. per_page is silently capped; use meta.per_page. Date-only boundaries follow the installation's stored calendar dates; ISO timestamps are serialized in UTC. The default general API limit is 600/minute; a user-specific override may apply. Its bucket is shared by authenticated user, not by shop/domain; Retry-After is returned on throttling.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Unknown read parameters are ignored. per_page is silently capped; use meta.per_page. Date-only boundaries follow the installation's stored calendar dates; ISO timestamps are serialized in UTC. The default general API limit is 600/minute; a user-specific override may apply. Its bucket is shared by authenticated user, not by shop/domain; Retry-After is returned on throttling.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Unknown read parameters are ignored. per_page is silently capped; use meta.per_page. Date-only boundaries follow the installation's stored calendar dates; ISO timestamps are serialized in UTC. The default general API limit is 600/minute; a user-specific override may apply. Its bucket is shared by authenticated user, not by shop/domain; Retry-After is returned on throttling.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Unknown read parameters are ignored. per_page is silently capped; use meta.per_page. Date-only boundaries follow the installation's stored calendar dates; ISO timestamps are serialized in UTC. The default general API limit is 600/minute; a user-specific override may apply. Its bucket is shared by authenticated user, not by shop/domain; Retry-After is returned on throttling.
Request include=status_history to receive chronological WMS status transitions with changed_at (ISO 8601 and explicit timezone offset), source and inferred. status_history_meta reports availability and whether the last event matches the current status; surviving logs do not guarantee a complete history. send_date is the stored order date field and may come from import, manual input or integration processing; it is not a universal physical carrier-handover timestamp. Status transitions and shipment-document closure must be interpreted as separate recorded events. Dedicated picked_at, packed_at and shipped_at milestones are not exposed.
Пример HTTP-запроса (cURL)
Подставьте свой сервер и токен. ID из примера замените реальными доступными ID. Для тела запроса сохраните подходящий JSON из раздела ниже в request.json; перед отправкой замените демонстрационные значения. Заголовок Idempotency-Key использует ключ одной логической операции.
curl --globoff --request GET "${NWMS_BASE_URL}/api/v2/orders" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}"Параметры
| Имя | Где | Обязательное | Тип | Style | Explode | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|---|---|
page |
query | нет | integer:int64 |
form | true | min: 1 | Номер страницы. Этот фильтр также можно передать как filter[page], если это поддерживает Laravel query adapter. |
1 |
per_page |
query | нет | integer:int64 |
form | true | min: 1 max: 500 |
Количество записей на странице. По умолчанию 50; максимум 500. Этот фильтр также можно передать как filter[per_page], если это поддерживает Laravel query adapter. |
50 |
sort |
query | нет | string |
form | false | pattern: ^-?[A-Za-z0-9_]+(,-?[A-Za-z0-9_]+)*$ | Поля сортировки через запятую. Префикс - означает сортировку по убыванию. Допустимые поля: id, order_date, send_date, sum, created_at, updated_at. По умолчанию: -id. Этот фильтр также можно передать как filter[sort], если это поддерживает Laravel query adapter. |
"-id" |
include |
query | нет | string |
form | false | Связанные сущности через запятую. Допустимые значения: offers, contact, delivery, comments, consumables, status_history. Этот фильтр также можно передать как filter[include], если это поддерживает Laravel query adapter. |
"offers,contact,delivery,comments,consumables,status_history" |
|
id |
query | нет | integer:int64 |
form | true | min: 1 | Фильтр по id с точным совпадением. Этот фильтр также можно передать как filter[id], если это поддерживает Laravel query adapter. |
1001 |
external_id |
query | нет | string |
form | true | Фильтр по external_id с точным совпадением. Этот фильтр также можно передать как filter[external_id], если это поддерживает Laravel query adapter. |
"EXT-10045" |
|
status_id |
query | нет | integer:int64 |
form | true | min: 1 | Фильтр по status_id с точным совпадением. Этот фильтр также можно передать как filter[status_id], если это поддерживает Laravel query adapter. |
1 |
warehouse_id |
query | нет | integer:int64 |
form | true | min: 1 | Фильтр по warehouse_id с точным совпадением. Этот фильтр также можно передать как filter[warehouse_id], если это поддерживает Laravel query adapter. |
42 |
shop_id |
query | нет | integer:int64 |
form | true | min: 1 | Фильтр по shop_id с точным совпадением. Этот фильтр также можно передать как filter[shop_id], если это поддерживает Laravel query adapter. |
12 |
type_id |
query | нет | integer:int64 |
form | true | min: 1 | Фильтр по type_id с точным совпадением. Этот фильтр также можно передать как filter[type_id], если это поддерживает Laravel query adapter. |
1 |
source_id |
query | нет | integer:int64 |
form | true | min: 1 | Фильтр по source_id с точным совпадением. Этот фильтр также можно передать как filter[source_id], если это поддерживает Laravel query adapter. |
1 |
customer_type |
query | нет | integer:int64 |
form | true | min: 1 | Фильтр по customer_type с точным совпадением. Этот фильтр также можно передать как filter[customer_type], если это поддерживает Laravel query adapter. |
1 |
company_id |
query | нет | integer:int64 |
form | true | min: 1 | Фильтр по company_id с точным совпадением. Этот фильтр также можно передать как filter[company_id], если это поддерживает Laravel query adapter. |
7 |
is_cod |
query | нет | boolean |
form | true | Фильтр по is_cod с точным совпадением. Этот фильтр также можно передать как filter[is_cod], если это поддерживает Laravel query adapter. |
false |
|
order_date_from |
query | нет | string:date |
form | true | Нижняя включительная граница даты для order_date. Этот фильтр также можно передать как filter[order_date_from], если это поддерживает Laravel query adapter. |
"2026-07-14" |
|
order_date_to |
query | нет | string:date |
form | true | Верхняя включительная граница даты для order_date. Этот фильтр также можно передать как filter[order_date_to], если это поддерживает Laravel query adapter. |
"2026-07-14" |
|
send_date_from |
query | нет | string:date |
form | true | Нижняя включительная граница даты для send_date. Этот фильтр также можно передать как filter[send_date_from], если это поддерживает Laravel query adapter. |
"2026-07-14" |
|
send_date_to |
query | нет | string:date |
form | true | Верхняя включительная граница даты для send_date. Этот фильтр также можно передать как filter[send_date_to], если это поддерживает Laravel query adapter. |
"2026-07-14" |
|
created_at_from |
query | нет | string:date |
form | true | Нижняя включительная граница даты для created_at. Этот фильтр также можно передать как filter[created_at_from], если это поддерживает Laravel query adapter. |
"2026-07-14" |
|
created_at_to |
query | нет | string:date |
form | true | Верхняя включительная граница даты для created_at. Этот фильтр также можно передать как filter[created_at_to], если это поддерживает Laravel query adapter. |
"2026-07-14" |
|
updated_at_from |
query | нет | string |
form | true | pattern: ^\d{4}-\d{2}-\d{2}(?: \d{2}:\d{2}:\d{2})?$ | Lower inclusive date or date-time boundary for updated_at. The same filter may also be sent as filter[updated_at_from] where supported by the Laravel query adapter. Use YYYY-MM-DD HH:mm:ss for an exact inclusive timestamp in the application timezone; YYYY-MM-DD starts at midnight. |
"2026-07-14 10:30:00" |
updated_at_to |
query | нет | string |
form | true | pattern: ^\d{4}-\d{2}-\d{2}(?: \d{2}:\d{2}:\d{2})?$ | Upper inclusive date or date-time boundary for updated_at. The same filter may also be sent as filter[updated_at_to] where supported by the Laravel query adapter. Use YYYY-MM-DD HH:mm:ss for an exact inclusive timestamp in the application timezone; YYYY-MM-DD includes the entire day. |
"2026-07-14 10:30:00" |
sum_from |
query | нет | number:float |
form | true | Нижняя включительная числовая граница для sum. Этот фильтр также можно передать как filter[sum_from], если это поддерживает Laravel query adapter. |
48.58 |
|
sum_to |
query | нет | number:float |
form | true | Верхняя включительная числовая граница для sum. Этот фильтр также можно передать как filter[sum_to], если это поддерживает Laravel query adapter. |
48.58 |
Тело запроса
Тело запроса отсутствует.
Ответы
200 Successful response.
Successful response.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
data |
да | array<Order> |
|
|||
data[] |
нет | Order |
Исходящий складской заказ. Опциональные связанные поля присутствуют, когда контроллер их загрузил или они запрошены через include. |
|
||
data[].id |
да | integer:int64 |
readOnly | min: 1 | 1001 |
|
data[].created_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data[].updated_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data[].external_id |
нет | string | null |
"ORD-100245" |
|||
data[].domain_id |
нет | integer:int64 | null |
min: 1 | 3 |
||
data[].type_id |
нет | integer:int64 | null |
1 |
|||
data[].shop_id |
нет | integer:int64 | null |
min: 1 | 12 |
||
data[].warehouse_id |
нет | integer:int64 | null |
min: 1 | 42 |
||
data[].status_id |
нет | integer:int64 | null |
ID статуса заказа. Текущий backend хранит статусы в базе данных; значения не моделируются как закрытый enum в публичном контракте. | 20 |
||
data[].status |
нет | object | null |
|
|||
data[].status.id |
да | integer:int64 |
20 |
|||
data[].status.name |
да | string |
"Created" |
|||
data[].status.color |
нет | string | null |
"#2457c5" |
|||
data[].status.background_color |
нет | string | null |
"#eaf0ff" |
|||
data[].order_date |
нет | string:date | null |
"2026-07-14" |
|||
data[].send_date |
нет | string | null |
Stored order send date, potentially supplied by import, manual input or integration processing. It may be a date or date-time string; it is not a universal physical carrier-handover timestamp. | "2026-07-15 20:25:08" |
||
data[].source_id |
нет | integer:int64 | null |
min: 1 | 1 |
||
data[].customer_type |
нет | integer:int64 | null |
1 |
|||
data[].is_cod |
нет | boolean |
true |
|||
data[].amounts |
нет | OrderAmounts |
|
|||
data[].amounts.shipping_price |
нет | number:float | null |
8.6 |
|||
data[].amounts.shipping_cost |
нет | number:float | null |
0 |
|||
data[].amounts.sum |
нет | number:float | null |
39.98 |
|||
data[].amounts.cod_sum |
нет | number:float | null |
48.58 |
|||
data[].company_id |
нет | integer:int64 | null |
min: 1 | 7 |
||
data[].marking |
да | OrderMarking |
Marking data expected for products in the order. | |
||
data[].marking.required |
да | boolean |
Whether the order contains products that require marking data after picking. | true |
||
data[].marking.types |
да | array<string> |
Marking types required by products in the order. Currently chestny_znak; the list may gain values such as jewel_uin and imei. |
|
||
data[].marking.types[] |
нет | string |
"chestny_znak" |
|||
data[].contact |
нет | object | null |
|
|||
data[].contact.first_name |
нет | string | null |
"Ivan" |
|||
data[].contact.middle_name |
нет | string | null |
"Ivanovich" |
|||
data[].contact.last_name |
нет | string | null |
"Petrov" |
|||
data[].contact.phone |
нет | string | null |
"+359888123456" |
|||
data[].contact.email |
нет | string:email | null |
"customer@example.com" |
|||
data[].contact.country_id |
нет | integer:int64 | null |
min: 1 | 100 |
||
data[].contact.city_id |
нет | integer:int64 | null |
min: 1 | 200 |
||
data[].contact.postcode |
нет | string | null |
"1000" |
|||
data[].contact.latitude |
нет | number:float | null |
min: -90 max: 90 |
42.6977 |
||
data[].contact.longitude |
нет | number:float | null |
min: -180 max: 180 |
23.3219 |
||
data[].contact.full_address |
нет | string | null |
"1 Vitosha Boulevard, Sofia" |
|||
data[].delivery |
нет | object | null |
|
|||
data[].delivery.service_id |
нет | integer:int64 | null |
min: 1 | 1 |
||
data[].delivery.delivery_type |
да | enum | null |
enum: door, pickup_point | Normalized delivery channel derived from the configured delivery service. Null when the service type is unknown. | "door" |
|
data[].delivery.is_courier |
да | boolean |
True for door delivery; false for pickup-point delivery or an unknown service type. | true |
||
data[].delivery.status |
нет | string | null |
"created" |
|||
data[].delivery.track_number |
нет | string | null |
"CDEK-123456789" |
|||
data[].delivery.pickup_point_id |
нет | string | null |
"SOFIA-01" |
|||
data[].delivery.source_id |
нет | string | null |
"cdek-15" |
|||
data[].delivery.tariff_code |
нет | integer:int64 | null |
136 |
|||
data[].delivery.additional_services |
нет | object |
Values of additional CDEK services configured for the selected integration. Boolean true enables a code-only service; other values are sent as the CDEK parameter. |
{"TRYING_ON":true,"PART_DELIV":false,"PACKAGE_1":2} |
||
data[].delivery.label |
нет | string:uri | null |
"https://betawms.ffcdek.ru/labels/CDEK-123456789.pdf" |
|||
data[].delivery.delivery_date |
нет | string:date | null |
"2026-07-16" |
|||
data[].delivery.delivery_time_start |
нет | string:time | null |
"09:00:00Z" |
|||
data[].delivery.delivery_time_end |
нет | string:time | null |
"18:00:00Z" |
|||
data[].comments |
нет | object | null |
|
|||
data[].comments.delivery_service_text |
нет | string | null |
"Call before delivery" |
|||
data[].comments.inner_text |
нет | string | null |
"VIP customer" |
|||
data[].offers |
нет | array<OrderLineEmbedded> |
|
|||
data[].offers[] |
нет | OrderLineEmbedded |
Scalar lot fields use the actual lot only when the full line is picked from one lot; partial/multiple actual lots leave scalars null. Before picking they retain the requested lot. Requested constraints are always available in requested_lot. | |
||
data[].offers[].id |
да | integer:int64 |
readOnly | min: 1 | 7001 |
|
data[].offers[].product_id |
нет | integer:int64 | null |
min: 1 | 1201 |
||
data[].offers[].quantity |
нет | number:float | null |
min: 0 | 2 |
||
data[].offers[].estimated_price |
нет | number:float | null |
19.5 |
|||
data[].offers[].price |
нет | number:float | null |
19.99 |
|||
data[].offers[].expiration_date |
нет | string:date | null |
"2027-01-15" |
|||
data[].offers[].batch |
нет | string | null |
maxLength: 15 | "LOT-2026" |
||
data[].offers[].operation_user_id |
нет | integer:int64 | null |
min: 1 | 9 |
||
data[].offers[].product |
нет | object | null |
|
|||
data[].offers[].product.id |
да | integer:int64 |
readOnly | min: 1 | 1201 |
|
data[].offers[].product.name |
да | string |
"Coffee 250g" |
|||
data[].offers[].product.external_id |
нет | string | null |
"EXT-10045" |
|||
data[].offers[].reservation |
нет | OrderReservationLine |
Reservation totals for one order line. | |
||
data[].offers[].reservation.required_qty |
да | number:float |
3 |
|||
data[].offers[].reservation.reserved_qty |
да | number:float |
1 |
|||
data[].offers[].reservation.unreserved_qty |
да | number:float |
2 |
|||
data[].offers[].reservation.missing_qty |
да | number:float |
2 |
|||
data[].offers[].reservation.status |
да | enum |
enum: not_required, missing, partial, reserved | Reservation state calculated from the quantity required by the order and the quantity actually reserved. | "partial" |
|
data[].offers[].reservation_items |
нет | array<OrderReservationItem> |
|
|||
data[].offers[].reservation_items[] |
нет | OrderReservationItem |
Physical product or expanded component used to explain a reservation shortage. | |
||
data[].offers[].reservation_items[].offer_id |
да | integer:int64 |
min: 1 | 1201 |
||
data[].offers[].reservation_items[].offer_name |
нет | string | null |
"Coffee 250g" |
|||
data[].offers[].reservation_items[].offer_article |
нет | string | null |
"ART-001245" |
|||
data[].offers[].reservation_items[].offer_sku |
нет | string | null |
"SKU-001245" |
|||
data[].offers[].reservation_items[].required_qty |
да | number:float |
3 |
|||
data[].offers[].reservation_items[].reserved_qty |
да | number:float |
1 |
|||
data[].offers[].reservation_items[].unreserved_qty |
да | number:float |
2 |
|||
data[].offers[].reservation_items[].missing_qty |
да | number:float |
2 |
|||
data[].offers[].reservation_items[].status |
да | enum |
enum: not_required, missing, partial, reserved | Reservation state calculated from the quantity required by the order and the quantity actually reserved. | "partial" |
|
data[].offers[].reservation_items[].source_order_offer_ids |
да | array<integer:int64> |
|
|||
data[].offers[].reservation_items[].source_order_offer_ids[] |
нет | integer:int64 |
min: 1 | 7001 |
||
data[].offers[].reservation_items[].source |
да | enum |
enum: order_offer, component, quant, composite_quant | "order_offer" |
||
data[].offers[].reservation_items[].expanded_from_composite |
да | boolean |
false |
|||
data[].offers[].reservation_items[].expanded_from_quant |
да | boolean |
false |
|||
data[].offers[].reservation_items[].quant_base_offer_id |
нет | integer:int64 | null |
min: 1 | 1201 |
||
data[].offers[].reservation_items[].quant_base_multiplicity |
нет | number:float | null |
6 |
|||
data[].offers[].created_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data[].offers[].updated_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data[].offers[].production_date |
нет | string:date | null |
"2026-01-15" |
|||
data[].offers[].requested_lot |
нет | WarehouseLot |
|
|||
data[].offers[].requested_lot.batch |
да | string | null |
"LOT-2026" |
|||
data[].offers[].requested_lot.production_date |
да | string:date | null |
"2026-01-15" |
|||
data[].offers[].requested_lot.expiration_date |
да | string:date | null |
"2027-01-15" |
|||
data[].offers[].picked_quantity |
нет | number:float |
min: 0 | 2 |
||
data[].offers[].fulfillment_lots |
нет | array<OrderFulfillmentLot> |
Current active placed warehouse rows for this exact order line and product. Existing orders are included where these rows survive. This is a current picking snapshot, not a historical shipment event. | |
||
data[].offers[].fulfillment_lots[] |
нет | OrderFulfillmentLot |
|
|||
data[].offers[].fulfillment_lots[].batch |
да | string | null |
"LOT-2026" |
|||
data[].offers[].fulfillment_lots[].production_date |
да | string:date | null |
"2026-01-15" |
|||
data[].offers[].fulfillment_lots[].expiration_date |
да | string:date | null |
"2027-01-15" |
|||
data[].offers[].fulfillment_lots[].warehouse_id |
да | integer:int64 |
min: 1 | 734 |
||
data[].offers[].fulfillment_lots[].product_id |
да | integer:int64 |
min: 1 | 1201 |
||
data[].offers[].fulfillment_lots[].quantity |
да | number:float |
min: 0 | 2 |
||
data[].reservation |
нет | OrderReservation |
Reservation readiness and shortages calculated for the order. | |
||
data[].reservation.ready |
да | boolean |
false |
|||
data[].reservation.reason |
да | string | null |
"Not all order products are reserved." |
|||
data[].reservation.expected_total |
да | number:float |
3 |
|||
data[].reservation.reserved_total |
да | number:float |
1 |
|||
data[].reservation.unreserved_total |
да | number:float |
2 |
|||
data[].reservation.missing_total |
да | number:float |
2 |
|||
data[].reservation.missing_items |
да | array<OrderReservationItem> |
|
|||
data[].reservation.missing_items[] |
нет | OrderReservationItem |
Physical product or expanded component used to explain a reservation shortage. | |
||
data[].reservation.missing_items[].offer_id |
да | integer:int64 |
min: 1 | 1201 |
||
data[].reservation.missing_items[].offer_name |
нет | string | null |
"Coffee 250g" |
|||
data[].reservation.missing_items[].offer_article |
нет | string | null |
"ART-001245" |
|||
data[].reservation.missing_items[].offer_sku |
нет | string | null |
"SKU-001245" |
|||
data[].reservation.missing_items[].required_qty |
да | number:float |
3 |
|||
data[].reservation.missing_items[].reserved_qty |
да | number:float |
1 |
|||
data[].reservation.missing_items[].unreserved_qty |
да | number:float |
2 |
|||
data[].reservation.missing_items[].missing_qty |
да | number:float |
2 |
|||
data[].reservation.missing_items[].status |
да | enum |
enum: not_required, missing, partial, reserved | Reservation state calculated from the quantity required by the order and the quantity actually reserved. | "partial" |
|
data[].reservation.missing_items[].source_order_offer_ids |
да | array<integer:int64> |
|
|||
data[].reservation.missing_items[].source_order_offer_ids[] |
нет | integer:int64 |
min: 1 | 7001 |
||
data[].reservation.missing_items[].source |
да | enum |
enum: order_offer, component, quant, composite_quant | "order_offer" |
||
data[].reservation.missing_items[].expanded_from_composite |
да | boolean |
false |
|||
data[].reservation.missing_items[].expanded_from_quant |
да | boolean |
false |
|||
data[].reservation.missing_items[].quant_base_offer_id |
нет | integer:int64 | null |
min: 1 | 1201 |
||
data[].reservation.missing_items[].quant_base_multiplicity |
нет | number:float | null |
6 |
|||
data[].reservation.error |
да | boolean |
false |
|||
data[].consumables |
нет | array<OrderConsumable> |
|
|||
data[].consumables[] |
нет | OrderConsumable |
Current consumable line, not an append-only consumption event. Unplaced usage creates a commitment but does not decrease physical stockTotal; do not treat that stockTotal as remaining packaging inventory. | |
||
data[].consumables[].id |
да | integer:int64 |
min: 1 | 301 |
||
data[].consumables[].order_id |
да | integer:int64 |
min: 1 | 8101 |
||
data[].consumables[].product_id |
да | integer:int64 |
min: 1 | 1202 |
||
data[].consumables[].warehouse_id |
да | integer:int64 | null |
min: 1 | 734 |
||
data[].consumables[].place_id |
да | integer:int64 | null |
min: 1 | 501 |
||
data[].consumables[].quantity |
да | number:float |
1 |
|||
data[].consumables[].stock_location_mode |
да | enum |
enum: placed, unplaced | "unplaced" |
||
data[].consumables[].created_at |
да | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data[].consumables[].updated_at |
да | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data[].status_history |
нет | array<OrderStatusHistoryEvent> |
Present only on GET list/detail with include=status_history. Ordered chronologically, retains repeat status cycles and combines surviving audit and action-log entries. Missing history returns an empty array. | |
||
data[].status_history[] |
нет | OrderStatusHistoryEvent |
Recorded WMS status transition or explicitly inferred initial status. It does not independently confirm physical carrier handover. | |
||
data[].status_history[].status_id |
да | integer:int64 |
130 |
|||
data[].status_history[].previous_status_id |
да | integer:int64 | null |
110 |
|||
data[].status_history[].changed_at |
да | string:date-time |
Time of the WMS status transition in ISO 8601 with an explicit timezone offset. | "2026-07-14T12:00:00+03:00" |
||
data[].status_history[].source |
да | enum |
enum: audit, action_log, inferred | "action_log" |
||
data[].status_history[].inferred |
да | boolean |
True only for a reconstructed initial status at order creation; this is not a separately recorded transition. | false |
||
data[].status_history_meta |
нет | OrderStatusHistoryMeta |
|
|||
data[].status_history_meta.available |
да | boolean |
At least one event is available. This does not guarantee complete historical coverage. | true |
||
data[].status_history_meta.current_status_matches_history |
да | boolean |
The last available event has the current order status. False also when history is empty. | true |
||
links |
да | PaginationLinks |
|
|||
links.first |
да | string:uri | null |
"https://betawms.ffcdek.ru/api/v2/orders?page=1" |
|||
links.last |
да | string:uri | null |
"https://betawms.ffcdek.ru/api/v2/orders?page=2" |
|||
links.prev |
да | string:uri | null |
|
|||
links.next |
да | string:uri | null |
"https://betawms.ffcdek.ru/api/v2/orders?page=2" |
|||
meta |
да | PaginationMeta |
|
|||
meta.api_version |
да | enum |
enum: v2 | "v2" |
||
meta.current_page |
да | integer:int32 |
min: 1 | 1 |
||
meta.from |
да | integer:int32 | null |
min: 1 | 1 |
||
meta.last_page |
да | integer:int32 |
min: 1 | 2 |
||
meta.path |
да | string:uri |
"https://betawms.ffcdek.ru/api/v2/orders" |
|||
meta.per_page |
да | integer:int32 |
min: 1 | 50 |
||
meta.to |
да | integer:int32 | null |
min: 1 | 50 |
||
meta.total |
да | integer:int32 |
min: 0 | 73 |
Примеры ответа
success
{
"data": [
{
"id": 8101,
"external_id": "ORD-100245",
"domain_id": 3,
"type_id": 1,
"shop_id": 12,
"warehouse_id": 42,
"status_id": 20,
"status": {
"id": 20,
"name": "Created",
"color": "#2457c5",
"background_color": "#eaf0ff"
},
"order_date": "2026-07-14",
"send_date": "2026-07-15",
"source_id": 1,
"customer_type": 1,
"is_cod": true,
"amounts": {
"shipping_price": 8.6,
"shipping_cost": 0,
"sum": 39.98,
"cod_sum": 48.58
},
"company_id": 7,
"marking": {
"required": true,
"types": [
"chestny_znak"
]
},
"contact": {
"first_name": "Ivan",
"middle_name": null,
"last_name": "Petrov",
"phone": "+359888123456",
"email": "customer@example.com",
"country_id": 100,
"city_id": 200,
"postcode": "1000",
"latitude": 42.6977,
"longitude": 23.3219,
"full_address": "1 Vitosha Boulevard, Sofia"
},
"delivery": {
"service_id": 1,
"delivery_type": "door",
"is_courier": true,
"status": "created",
"track_number": "CDEK-123456789",
"source_id": "cdek-15",
"tariff_code": 136,
"label": "https://betawms.ffcdek.ru/labels/CDEK-123456789.pdf",
"delivery_date": "2026-07-16",
"delivery_time_start": "09:00:00Z",
"delivery_time_end": "18:00:00Z"
},
"comments": {
"delivery_service_text": "Call before delivery",
"inner_text": "VIP customer"
},
"offers": [
{
"id": 7001,
"product_id": 1201,
"quantity": 2,
"estimated_price": 19.5,
"price": 19.99,
"expiration_date": "2027-01-15",
"batch": "LOT-2026",
"operation_user_id": 9,
"product": {
"id": 1201,
"name": "Coffee 250g",
"external_id": "EXT-10045"
},
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
}
],
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z",
"status_history": [
{
"status_id": 20,
"previous_status_id": 10,
"changed_at": "2026-07-14T12:00:00+03:00",
"source": "action_log",
"inferred": false
}
],
"status_history_meta": {
"available": true,
"current_status_matches_history": true
}
}
],
"links": {
"first": "https://betawms.ffcdek.ru/api/v2/orders?page=1",
"last": "https://betawms.ffcdek.ru/api/v2/orders?page=2",
"prev": null,
"next": "https://betawms.ffcdek.ru/api/v2/orders?page=2"
},
"meta": {
"api_version": "v2",
"current_page": 1,
"from": 1,
"last_page": 2,
"path": "https://betawms.ffcdek.ru/api/v2/orders",
"per_page": 50,
"to": 50,
"total": 73
}
}
401 Требуется аутентификация
Unauthorized
Требуется аутентификация.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
AUTH_REQUIRED
{
"message": "Authentication is required.",
"error": "AUTH_REQUIRED"
}
403 Доступ запрещен
Forbidden
Аутентифицированному аккаунту запрещено выполнять это действие.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
FORBIDDEN
{
"message": "The authenticated account is not allowed to perform this action.",
"error": "FORBIDDEN"
}
429 Превышен лимит запросов
TooManyRequests
Превышен лимит запросов.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"Too Many Attempts." |
|||
error |
да | string |
"RATE_LIMITED" |
500 Внутренняя ошибка сервера
InternalServerError
Произошла непредвиденная ошибка сервера.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
INTERNAL_SERVER_ERROR
{
"message": "An unexpected server error occurred.",
"error": "INTERNAL_SERVER_ERROR"
}
Создать заказ
| operationId | createOrders |
|---|---|
| Раздел | Заказы |
| Безопасность | bearerAuth |
Creates an outbound order with public v2 fields. The order may include contact, delivery, comments, and line items. Server-side validation checks shop and warehouse visibility, rejects system-calculated totals, and applies idempotency when Idempotency-Key is provided.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Пример HTTP-запроса (cURL)
Подставьте свой сервер и токен. ID из примера замените реальными доступными ID. Для тела запроса сохраните подходящий JSON из раздела ниже в request.json; перед отправкой замените демонстрационные значения. Заголовок Idempotency-Key использует ключ одной логической операции.
curl --globoff --request POST "${NWMS_BASE_URL}/api/v2/orders" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}" \
--header "Idempotency-Key: ${NWMS_REQUEST_KEY}" \
--header "Content-Type: application/json" \
--data-binary @request.jsonПараметры
| Имя | Где | Обязательное | Тип | Style | Explode | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|---|---|
Idempotency-Key |
header | нет | string |
maxLength: 191 | Опциональный ключ идемпотентности для write-запросов API v2. Успешные ответы 2xx/3xx повторяются для того же ключа и идентичного payload в течение одного дня. Тот же ключ с другим payload возвращает 409. |
"ord-create-20260714-001" |
Тело запроса
CreateOrderRequest обязательно
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
data |
да | CreateOrderPayload |
|
|||
data.type_id |
да | integer:int64 |
1 |
|||
data.shop_id |
да | integer:int64 |
min: 1 | 12 |
||
data.warehouse_id |
да | integer:int64 |
min: 1 | 42 |
||
data.external_id |
нет | string | null |
"ORD-100245" |
|||
data.group_id |
нет | integer:int64 | null |
min: 1 | 100 |
||
data.send_date |
нет | string:date | null |
"2026-07-15" |
|||
data.source_id |
нет | integer:int64 | null |
min: 1 | 1 |
||
data.status_id |
нет | integer:int64 | null |
ID статуса заказа. Текущий backend хранит статусы в базе данных; значения не моделируются как закрытый enum в публичном контракте. | 20 |
||
data.customer_type |
нет | integer:int64 | null |
1 |
|||
data.is_cod |
нет | boolean |
true |
|||
data.company_id |
нет | integer:int64 | null |
min: 1 | 7 |
||
data.amounts |
нет | object | null |
|
|||
data.amounts.shipping_price |
нет | number:float | null |
8.6 |
|||
data.amounts.shipping_cost |
нет | number:float | null |
0 |
|||
data.amounts.sum |
нет | number:float | null |
39.98 |
|||
data.amounts.cod_sum |
нет | number:float | null |
48.58 |
|||
data.weight |
нет | object | null |
|
|||
data.weight.value |
нет | number:float | null |
min: 0 | 250 |
||
data.weight.unit |
да | enum |
enum: g | "g" |
||
data.dimensions |
нет | object | null |
|
|||
data.dimensions.x |
нет | number:float | null |
min: 0 | 105 |
||
data.dimensions.y |
нет | number:float | null |
min: 0 | 200 |
||
data.dimensions.z |
нет | number:float | null |
min: 0 | 32 |
||
data.dimensions.unit |
да | enum |
enum: mm | "mm" |
||
data.contact |
нет | object | null |
|
|||
data.contact.first_name |
нет | string | null |
"Ivan" |
|||
data.contact.middle_name |
нет | string | null |
"Ivanovich" |
|||
data.contact.last_name |
нет | string | null |
"Petrov" |
|||
data.contact.phone |
нет | string | null |
"+359888123456" |
|||
data.contact.email |
нет | string:email | null |
"customer@example.com" |
|||
data.contact.country_id |
нет | integer:int64 | null |
min: 1 | 100 |
||
data.contact.city_id |
нет | integer:int64 | null |
min: 1 | 200 |
||
data.contact.postcode |
нет | string | null |
"1000" |
|||
data.contact.latitude |
нет | number:float | null |
min: -90 max: 90 |
42.6977 |
||
data.contact.longitude |
нет | number:float | null |
min: -180 max: 180 |
23.3219 |
||
data.contact.full_address |
нет | string | null |
"1 Vitosha Boulevard, Sofia" |
|||
data.delivery |
нет | object | null |
|
|||
data.delivery.service_id |
нет | integer:int64 | null |
min: 1 | 1 |
||
data.delivery.delivery_type |
да | enum | null |
enum: door, pickup_point | Normalized delivery channel derived from the configured delivery service. Null when the service type is unknown. | "door" |
|
data.delivery.is_courier |
да | boolean |
True for door delivery; false for pickup-point delivery or an unknown service type. | true |
||
data.delivery.status |
нет | string | null |
"created" |
|||
data.delivery.track_number |
нет | string | null |
"CDEK-123456789" |
|||
data.delivery.pickup_point_id |
нет | string | null |
"SOFIA-01" |
|||
data.delivery.source_id |
нет | string | null |
"cdek-15" |
|||
data.delivery.tariff_code |
нет | integer:int64 | null |
136 |
|||
data.delivery.additional_services |
нет | object |
Values of additional CDEK services configured for the selected integration. Boolean true enables a code-only service; other values are sent as the CDEK parameter. |
{"TRYING_ON":true,"PART_DELIV":false,"PACKAGE_1":2} |
||
data.delivery.label |
нет | string:uri | null |
"https://betawms.ffcdek.ru/labels/CDEK-123456789.pdf" |
|||
data.delivery.delivery_date |
нет | string:date | null |
"2026-07-16" |
|||
data.delivery.delivery_time_start |
нет | string:time | null |
"09:00:00Z" |
|||
data.delivery.delivery_time_end |
нет | string:time | null |
"18:00:00Z" |
|||
data.comments |
нет | object | null |
|
|||
data.comments.delivery_service_text |
нет | string | null |
"Call before delivery" |
|||
data.comments.inner_text |
нет | string | null |
"VIP customer" |
|||
data.lines |
нет | array<OrderEmbeddedLineCreatePayload> |
|
|||
data.lines[] |
нет | OrderEmbeddedLineCreatePayload |
Payload строки внутри создания заказа. Товар определяется по product_id или product_external_id. |
|
||
data.lines[] |
нет | object |
|
|||
data.lines[] |
нет | object |
|
Примеры запроса
default
{
"data": {
"type_id": 1,
"shop_id": 12,
"warehouse_id": 42,
"external_id": "ORD-100245",
"send_date": "2026-07-15",
"contact": {
"first_name": "Ivan",
"last_name": "Petrov",
"phone": "+359888123456"
},
"lines": [
{
"product_id": 1201,
"quantity": 2,
"price": 19.99
}
]
}
}
Ответы
201 Created.
Created.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
data |
да | Order |
Исходящий складской заказ. Опциональные связанные поля присутствуют, когда контроллер их загрузил или они запрошены через include. |
|
||
data.id |
да | integer:int64 |
readOnly | min: 1 | 1001 |
|
data.created_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.updated_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.external_id |
нет | string | null |
"ORD-100245" |
|||
data.domain_id |
нет | integer:int64 | null |
min: 1 | 3 |
||
data.type_id |
нет | integer:int64 | null |
1 |
|||
data.shop_id |
нет | integer:int64 | null |
min: 1 | 12 |
||
data.warehouse_id |
нет | integer:int64 | null |
min: 1 | 42 |
||
data.status_id |
нет | integer:int64 | null |
ID статуса заказа. Текущий backend хранит статусы в базе данных; значения не моделируются как закрытый enum в публичном контракте. | 20 |
||
data.status |
нет | object | null |
|
|||
data.status.id |
да | integer:int64 |
20 |
|||
data.status.name |
да | string |
"Created" |
|||
data.status.color |
нет | string | null |
"#2457c5" |
|||
data.status.background_color |
нет | string | null |
"#eaf0ff" |
|||
data.order_date |
нет | string:date | null |
"2026-07-14" |
|||
data.send_date |
нет | string | null |
Stored order send date, potentially supplied by import, manual input or integration processing. It may be a date or date-time string; it is not a universal physical carrier-handover timestamp. | "2026-07-15 20:25:08" |
||
data.source_id |
нет | integer:int64 | null |
min: 1 | 1 |
||
data.customer_type |
нет | integer:int64 | null |
1 |
|||
data.is_cod |
нет | boolean |
true |
|||
data.amounts |
нет | OrderAmounts |
|
|||
data.amounts.shipping_price |
нет | number:float | null |
8.6 |
|||
data.amounts.shipping_cost |
нет | number:float | null |
0 |
|||
data.amounts.sum |
нет | number:float | null |
39.98 |
|||
data.amounts.cod_sum |
нет | number:float | null |
48.58 |
|||
data.company_id |
нет | integer:int64 | null |
min: 1 | 7 |
||
data.marking |
да | OrderMarking |
Marking data expected for products in the order. | |
||
data.marking.required |
да | boolean |
Whether the order contains products that require marking data after picking. | true |
||
data.marking.types |
да | array<string> |
Marking types required by products in the order. Currently chestny_znak; the list may gain values such as jewel_uin and imei. |
|
||
data.marking.types[] |
нет | string |
"chestny_znak" |
|||
data.contact |
нет | object | null |
|
|||
data.contact.first_name |
нет | string | null |
"Ivan" |
|||
data.contact.middle_name |
нет | string | null |
"Ivanovich" |
|||
data.contact.last_name |
нет | string | null |
"Petrov" |
|||
data.contact.phone |
нет | string | null |
"+359888123456" |
|||
data.contact.email |
нет | string:email | null |
"customer@example.com" |
|||
data.contact.country_id |
нет | integer:int64 | null |
min: 1 | 100 |
||
data.contact.city_id |
нет | integer:int64 | null |
min: 1 | 200 |
||
data.contact.postcode |
нет | string | null |
"1000" |
|||
data.contact.latitude |
нет | number:float | null |
min: -90 max: 90 |
42.6977 |
||
data.contact.longitude |
нет | number:float | null |
min: -180 max: 180 |
23.3219 |
||
data.contact.full_address |
нет | string | null |
"1 Vitosha Boulevard, Sofia" |
|||
data.delivery |
нет | object | null |
|
|||
data.delivery.service_id |
нет | integer:int64 | null |
min: 1 | 1 |
||
data.delivery.delivery_type |
да | enum | null |
enum: door, pickup_point | Normalized delivery channel derived from the configured delivery service. Null when the service type is unknown. | "door" |
|
data.delivery.is_courier |
да | boolean |
True for door delivery; false for pickup-point delivery or an unknown service type. | true |
||
data.delivery.status |
нет | string | null |
"created" |
|||
data.delivery.track_number |
нет | string | null |
"CDEK-123456789" |
|||
data.delivery.pickup_point_id |
нет | string | null |
"SOFIA-01" |
|||
data.delivery.source_id |
нет | string | null |
"cdek-15" |
|||
data.delivery.tariff_code |
нет | integer:int64 | null |
136 |
|||
data.delivery.additional_services |
нет | object |
Values of additional CDEK services configured for the selected integration. Boolean true enables a code-only service; other values are sent as the CDEK parameter. |
{"TRYING_ON":true,"PART_DELIV":false,"PACKAGE_1":2} |
||
data.delivery.label |
нет | string:uri | null |
"https://betawms.ffcdek.ru/labels/CDEK-123456789.pdf" |
|||
data.delivery.delivery_date |
нет | string:date | null |
"2026-07-16" |
|||
data.delivery.delivery_time_start |
нет | string:time | null |
"09:00:00Z" |
|||
data.delivery.delivery_time_end |
нет | string:time | null |
"18:00:00Z" |
|||
data.comments |
нет | object | null |
|
|||
data.comments.delivery_service_text |
нет | string | null |
"Call before delivery" |
|||
data.comments.inner_text |
нет | string | null |
"VIP customer" |
|||
data.offers |
нет | array<OrderLineEmbedded> |
|
|||
data.offers[] |
нет | OrderLineEmbedded |
Scalar lot fields use the actual lot only when the full line is picked from one lot; partial/multiple actual lots leave scalars null. Before picking they retain the requested lot. Requested constraints are always available in requested_lot. | |
||
data.offers[].id |
да | integer:int64 |
readOnly | min: 1 | 7001 |
|
data.offers[].product_id |
нет | integer:int64 | null |
min: 1 | 1201 |
||
data.offers[].quantity |
нет | number:float | null |
min: 0 | 2 |
||
data.offers[].estimated_price |
нет | number:float | null |
19.5 |
|||
data.offers[].price |
нет | number:float | null |
19.99 |
|||
data.offers[].expiration_date |
нет | string:date | null |
"2027-01-15" |
|||
data.offers[].batch |
нет | string | null |
maxLength: 15 | "LOT-2026" |
||
data.offers[].operation_user_id |
нет | integer:int64 | null |
min: 1 | 9 |
||
data.offers[].product |
нет | object | null |
|
|||
data.offers[].product.id |
да | integer:int64 |
readOnly | min: 1 | 1201 |
|
data.offers[].product.name |
да | string |
"Coffee 250g" |
|||
data.offers[].product.external_id |
нет | string | null |
"EXT-10045" |
|||
data.offers[].reservation |
нет | OrderReservationLine |
Reservation totals for one order line. | |
||
data.offers[].reservation.required_qty |
да | number:float |
3 |
|||
data.offers[].reservation.reserved_qty |
да | number:float |
1 |
|||
data.offers[].reservation.unreserved_qty |
да | number:float |
2 |
|||
data.offers[].reservation.missing_qty |
да | number:float |
2 |
|||
data.offers[].reservation.status |
да | enum |
enum: not_required, missing, partial, reserved | Reservation state calculated from the quantity required by the order and the quantity actually reserved. | "partial" |
|
data.offers[].reservation_items |
нет | array<OrderReservationItem> |
|
|||
data.offers[].reservation_items[] |
нет | OrderReservationItem |
Physical product or expanded component used to explain a reservation shortage. | |
||
data.offers[].reservation_items[].offer_id |
да | integer:int64 |
min: 1 | 1201 |
||
data.offers[].reservation_items[].offer_name |
нет | string | null |
"Coffee 250g" |
|||
data.offers[].reservation_items[].offer_article |
нет | string | null |
"ART-001245" |
|||
data.offers[].reservation_items[].offer_sku |
нет | string | null |
"SKU-001245" |
|||
data.offers[].reservation_items[].required_qty |
да | number:float |
3 |
|||
data.offers[].reservation_items[].reserved_qty |
да | number:float |
1 |
|||
data.offers[].reservation_items[].unreserved_qty |
да | number:float |
2 |
|||
data.offers[].reservation_items[].missing_qty |
да | number:float |
2 |
|||
data.offers[].reservation_items[].status |
да | enum |
enum: not_required, missing, partial, reserved | Reservation state calculated from the quantity required by the order and the quantity actually reserved. | "partial" |
|
data.offers[].reservation_items[].source_order_offer_ids |
да | array<integer:int64> |
|
|||
data.offers[].reservation_items[].source_order_offer_ids[] |
нет | integer:int64 |
min: 1 | 7001 |
||
data.offers[].reservation_items[].source |
да | enum |
enum: order_offer, component, quant, composite_quant | "order_offer" |
||
data.offers[].reservation_items[].expanded_from_composite |
да | boolean |
false |
|||
data.offers[].reservation_items[].expanded_from_quant |
да | boolean |
false |
|||
data.offers[].reservation_items[].quant_base_offer_id |
нет | integer:int64 | null |
min: 1 | 1201 |
||
data.offers[].reservation_items[].quant_base_multiplicity |
нет | number:float | null |
6 |
|||
data.offers[].created_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.offers[].updated_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.offers[].production_date |
нет | string:date | null |
"2026-01-15" |
|||
data.offers[].requested_lot |
нет | WarehouseLot |
|
|||
data.offers[].requested_lot.batch |
да | string | null |
"LOT-2026" |
|||
data.offers[].requested_lot.production_date |
да | string:date | null |
"2026-01-15" |
|||
data.offers[].requested_lot.expiration_date |
да | string:date | null |
"2027-01-15" |
|||
data.offers[].picked_quantity |
нет | number:float |
min: 0 | 2 |
||
data.offers[].fulfillment_lots |
нет | array<OrderFulfillmentLot> |
Current active placed warehouse rows for this exact order line and product. Existing orders are included where these rows survive. This is a current picking snapshot, not a historical shipment event. | |
||
data.offers[].fulfillment_lots[] |
нет | OrderFulfillmentLot |
|
|||
data.offers[].fulfillment_lots[].batch |
да | string | null |
"LOT-2026" |
|||
data.offers[].fulfillment_lots[].production_date |
да | string:date | null |
"2026-01-15" |
|||
data.offers[].fulfillment_lots[].expiration_date |
да | string:date | null |
"2027-01-15" |
|||
data.offers[].fulfillment_lots[].warehouse_id |
да | integer:int64 |
min: 1 | 734 |
||
data.offers[].fulfillment_lots[].product_id |
да | integer:int64 |
min: 1 | 1201 |
||
data.offers[].fulfillment_lots[].quantity |
да | number:float |
min: 0 | 2 |
||
data.reservation |
нет | OrderReservation |
Reservation readiness and shortages calculated for the order. | |
||
data.reservation.ready |
да | boolean |
false |
|||
data.reservation.reason |
да | string | null |
"Not all order products are reserved." |
|||
data.reservation.expected_total |
да | number:float |
3 |
|||
data.reservation.reserved_total |
да | number:float |
1 |
|||
data.reservation.unreserved_total |
да | number:float |
2 |
|||
data.reservation.missing_total |
да | number:float |
2 |
|||
data.reservation.missing_items |
да | array<OrderReservationItem> |
|
|||
data.reservation.missing_items[] |
нет | OrderReservationItem |
Physical product or expanded component used to explain a reservation shortage. | |
||
data.reservation.missing_items[].offer_id |
да | integer:int64 |
min: 1 | 1201 |
||
data.reservation.missing_items[].offer_name |
нет | string | null |
"Coffee 250g" |
|||
data.reservation.missing_items[].offer_article |
нет | string | null |
"ART-001245" |
|||
data.reservation.missing_items[].offer_sku |
нет | string | null |
"SKU-001245" |
|||
data.reservation.missing_items[].required_qty |
да | number:float |
3 |
|||
data.reservation.missing_items[].reserved_qty |
да | number:float |
1 |
|||
data.reservation.missing_items[].unreserved_qty |
да | number:float |
2 |
|||
data.reservation.missing_items[].missing_qty |
да | number:float |
2 |
|||
data.reservation.missing_items[].status |
да | enum |
enum: not_required, missing, partial, reserved | Reservation state calculated from the quantity required by the order and the quantity actually reserved. | "partial" |
|
data.reservation.missing_items[].source_order_offer_ids |
да | array<integer:int64> |
|
|||
data.reservation.missing_items[].source_order_offer_ids[] |
нет | integer:int64 |
min: 1 | 7001 |
||
data.reservation.missing_items[].source |
да | enum |
enum: order_offer, component, quant, composite_quant | "order_offer" |
||
data.reservation.missing_items[].expanded_from_composite |
да | boolean |
false |
|||
data.reservation.missing_items[].expanded_from_quant |
да | boolean |
false |
|||
data.reservation.missing_items[].quant_base_offer_id |
нет | integer:int64 | null |
min: 1 | 1201 |
||
data.reservation.missing_items[].quant_base_multiplicity |
нет | number:float | null |
6 |
|||
data.reservation.error |
да | boolean |
false |
|||
data.consumables |
нет | array<OrderConsumable> |
|
|||
data.consumables[] |
нет | OrderConsumable |
Current consumable line, not an append-only consumption event. Unplaced usage creates a commitment but does not decrease physical stockTotal; do not treat that stockTotal as remaining packaging inventory. | |
||
data.consumables[].id |
да | integer:int64 |
min: 1 | 301 |
||
data.consumables[].order_id |
да | integer:int64 |
min: 1 | 8101 |
||
data.consumables[].product_id |
да | integer:int64 |
min: 1 | 1202 |
||
data.consumables[].warehouse_id |
да | integer:int64 | null |
min: 1 | 734 |
||
data.consumables[].place_id |
да | integer:int64 | null |
min: 1 | 501 |
||
data.consumables[].quantity |
да | number:float |
1 |
|||
data.consumables[].stock_location_mode |
да | enum |
enum: placed, unplaced | "unplaced" |
||
data.consumables[].created_at |
да | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.consumables[].updated_at |
да | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.status_history |
нет | array<OrderStatusHistoryEvent> |
Present only on GET list/detail with include=status_history. Ordered chronologically, retains repeat status cycles and combines surviving audit and action-log entries. Missing history returns an empty array. | |
||
data.status_history[] |
нет | OrderStatusHistoryEvent |
Recorded WMS status transition or explicitly inferred initial status. It does not independently confirm physical carrier handover. | |
||
data.status_history[].status_id |
да | integer:int64 |
130 |
|||
data.status_history[].previous_status_id |
да | integer:int64 | null |
110 |
|||
data.status_history[].changed_at |
да | string:date-time |
Time of the WMS status transition in ISO 8601 with an explicit timezone offset. | "2026-07-14T12:00:00+03:00" |
||
data.status_history[].source |
да | enum |
enum: audit, action_log, inferred | "action_log" |
||
data.status_history[].inferred |
да | boolean |
True only for a reconstructed initial status at order creation; this is not a separately recorded transition. | false |
||
data.status_history_meta |
нет | OrderStatusHistoryMeta |
|
|||
data.status_history_meta.available |
да | boolean |
At least one event is available. This does not guarantee complete historical coverage. | true |
||
data.status_history_meta.current_status_matches_history |
да | boolean |
The last available event has the current order status. False also when history is empty. | true |
||
meta |
да | ResponseMeta |
|
|||
meta.api_version |
да | enum |
enum: v2 | "v2" |
||
meta.deleted |
нет | boolean |
true |
|||
meta.id |
нет | integer:int64 | null |
min: 1 | 1001 |
||
meta.command_replayed |
нет | boolean |
True when an idempotent cross-dock command returned the original successful result. | false |
||
meta.crossdock_configuration |
нет | object | null |
|
|||
meta.crossdock_configuration.physical_warehouse_id |
да | integer:int64 |
min: 1 | 42 |
||
meta.crossdock_configuration.enabled |
да | boolean |
true |
|||
meta.crossdock_configuration.process_version |
да | string |
"direct_order_v1" |
Примеры ответа
success
{
"data": {
"id": 8101,
"external_id": "ORD-100245",
"domain_id": 3,
"type_id": 1,
"shop_id": 12,
"warehouse_id": 42,
"status_id": 20,
"status": {
"id": 20,
"name": "Created",
"color": "#2457c5",
"background_color": "#eaf0ff"
},
"order_date": "2026-07-14",
"send_date": "2026-07-15",
"source_id": 1,
"customer_type": 1,
"is_cod": true,
"amounts": {
"shipping_price": 8.6,
"shipping_cost": 0,
"sum": 39.98,
"cod_sum": 48.58
},
"company_id": 7,
"marking": {
"required": true,
"types": [
"chestny_znak"
]
},
"contact": {
"first_name": "Ivan",
"middle_name": null,
"last_name": "Petrov",
"phone": "+359888123456",
"email": "customer@example.com",
"country_id": 100,
"city_id": 200,
"postcode": "1000",
"latitude": 42.6977,
"longitude": 23.3219,
"full_address": "1 Vitosha Boulevard, Sofia"
},
"delivery": {
"service_id": 1,
"delivery_type": "door",
"is_courier": true,
"status": "created",
"track_number": "CDEK-123456789",
"source_id": "cdek-15",
"tariff_code": 136,
"label": "https://betawms.ffcdek.ru/labels/CDEK-123456789.pdf",
"delivery_date": "2026-07-16",
"delivery_time_start": "09:00:00Z",
"delivery_time_end": "18:00:00Z"
},
"comments": {
"delivery_service_text": "Call before delivery",
"inner_text": "VIP customer"
},
"offers": [
{
"id": 7001,
"product_id": 1201,
"quantity": 2,
"estimated_price": 19.5,
"price": 19.99,
"expiration_date": "2027-01-15",
"batch": "LOT-2026",
"operation_user_id": 9,
"product": {
"id": 1201,
"name": "Coffee 250g",
"external_id": "EXT-10045"
},
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
}
],
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
},
"meta": {
"api_version": "v2"
}
}
400 Некорректный запрос
BadRequest
Некорректный запрос.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
BAD_REQUEST
{
"message": "Bad request.",
"error": "BAD_REQUEST"
}
401 Требуется аутентификация
Unauthorized
Требуется аутентификация.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
AUTH_REQUIRED
{
"message": "Authentication is required.",
"error": "AUTH_REQUIRED"
}
403 Доступ запрещен
Forbidden
Аутентифицированному аккаунту запрещено выполнять это действие.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
FORBIDDEN
{
"message": "The authenticated account is not allowed to perform this action.",
"error": "FORBIDDEN"
}
409 Конфликт
Conflict
Запрос конфликтует с текущим состоянием ресурса или ключа идемпотентности.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
idempotencyConflict
{
"message": "The idempotency key is already used with a different payload.",
"error": "IDEMPOTENCY_KEY_CONFLICT"
}
422 Ошибка валидации
ValidationError
Ошибка валидации.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The given data was invalid." |
|||
error |
нет | string |
"VALIDATION_ERROR" |
|||
errors |
да | object |
{"warehouse_id":["The selected warehouse is invalid."]} |
Примеры ответа
validationError
{
"message": "The given data was invalid.",
"error": "VALIDATION_ERROR",
"errors": {
"warehouse_id": [
"The selected warehouse is invalid."
]
}
}
429 Превышен лимит запросов
TooManyRequests
Превышен лимит запросов.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"Too Many Attempts." |
|||
error |
да | string |
"RATE_LIMITED" |
500 Внутренняя ошибка сервера
InternalServerError
Произошла непредвиденная ошибка сервера.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
INTERNAL_SERVER_ERROR
{
"message": "An unexpected server error occurred.",
"error": "INTERNAL_SERVER_ERROR"
}
Получить заказ
| operationId | getOrders |
|---|---|
| Раздел | Заказы |
| Безопасность | bearerAuth |
Возвращает один ресурс: заказ, если он существует и видим аутентифицированному аккаунту.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Request include=status_history to receive chronological WMS status transitions with changed_at (ISO 8601 and explicit timezone offset), source and inferred. status_history_meta reports availability and whether the last event matches the current status; surviving logs do not guarantee a complete history. send_date is the stored order date field and may come from import, manual input or integration processing; it is not a universal physical carrier-handover timestamp. Status transitions and shipment-document closure must be interpreted as separate recorded events. Dedicated picked_at, packed_at and shipped_at milestones are not exposed.
Пример HTTP-запроса (cURL)
Подставьте свой сервер и токен. ID из примера замените реальными доступными ID. Для тела запроса сохраните подходящий JSON из раздела ниже в request.json; перед отправкой замените демонстрационные значения. Заголовок Idempotency-Key использует ключ одной логической операции.
curl --globoff --request GET "${NWMS_BASE_URL}/api/v2/orders/1001" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}"Параметры
| Имя | Где | Обязательное | Тип | Style | Explode | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|---|---|
id |
path | да | integer:int64 |
min: 1 | ID заказа. | 1001 |
||
include |
query | нет | string |
form | false | Add status_history for recorded WMS status transitions; the other detail relations remain included by default. The same filter may also be sent as filter[include] where supported by the Laravel query adapter. |
"status_history" |
Тело запроса
Тело запроса отсутствует.
Ответы
200 Successful response.
Successful response.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
data |
да | Order |
Исходящий складской заказ. Опциональные связанные поля присутствуют, когда контроллер их загрузил или они запрошены через include. |
|
||
data.id |
да | integer:int64 |
readOnly | min: 1 | 1001 |
|
data.created_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.updated_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.external_id |
нет | string | null |
"ORD-100245" |
|||
data.domain_id |
нет | integer:int64 | null |
min: 1 | 3 |
||
data.type_id |
нет | integer:int64 | null |
1 |
|||
data.shop_id |
нет | integer:int64 | null |
min: 1 | 12 |
||
data.warehouse_id |
нет | integer:int64 | null |
min: 1 | 42 |
||
data.status_id |
нет | integer:int64 | null |
ID статуса заказа. Текущий backend хранит статусы в базе данных; значения не моделируются как закрытый enum в публичном контракте. | 20 |
||
data.status |
нет | object | null |
|
|||
data.status.id |
да | integer:int64 |
20 |
|||
data.status.name |
да | string |
"Created" |
|||
data.status.color |
нет | string | null |
"#2457c5" |
|||
data.status.background_color |
нет | string | null |
"#eaf0ff" |
|||
data.order_date |
нет | string:date | null |
"2026-07-14" |
|||
data.send_date |
нет | string | null |
Stored order send date, potentially supplied by import, manual input or integration processing. It may be a date or date-time string; it is not a universal physical carrier-handover timestamp. | "2026-07-15 20:25:08" |
||
data.source_id |
нет | integer:int64 | null |
min: 1 | 1 |
||
data.customer_type |
нет | integer:int64 | null |
1 |
|||
data.is_cod |
нет | boolean |
true |
|||
data.amounts |
нет | OrderAmounts |
|
|||
data.amounts.shipping_price |
нет | number:float | null |
8.6 |
|||
data.amounts.shipping_cost |
нет | number:float | null |
0 |
|||
data.amounts.sum |
нет | number:float | null |
39.98 |
|||
data.amounts.cod_sum |
нет | number:float | null |
48.58 |
|||
data.company_id |
нет | integer:int64 | null |
min: 1 | 7 |
||
data.marking |
да | OrderMarking |
Marking data expected for products in the order. | |
||
data.marking.required |
да | boolean |
Whether the order contains products that require marking data after picking. | true |
||
data.marking.types |
да | array<string> |
Marking types required by products in the order. Currently chestny_znak; the list may gain values such as jewel_uin and imei. |
|
||
data.marking.types[] |
нет | string |
"chestny_znak" |
|||
data.contact |
нет | object | null |
|
|||
data.contact.first_name |
нет | string | null |
"Ivan" |
|||
data.contact.middle_name |
нет | string | null |
"Ivanovich" |
|||
data.contact.last_name |
нет | string | null |
"Petrov" |
|||
data.contact.phone |
нет | string | null |
"+359888123456" |
|||
data.contact.email |
нет | string:email | null |
"customer@example.com" |
|||
data.contact.country_id |
нет | integer:int64 | null |
min: 1 | 100 |
||
data.contact.city_id |
нет | integer:int64 | null |
min: 1 | 200 |
||
data.contact.postcode |
нет | string | null |
"1000" |
|||
data.contact.latitude |
нет | number:float | null |
min: -90 max: 90 |
42.6977 |
||
data.contact.longitude |
нет | number:float | null |
min: -180 max: 180 |
23.3219 |
||
data.contact.full_address |
нет | string | null |
"1 Vitosha Boulevard, Sofia" |
|||
data.delivery |
нет | object | null |
|
|||
data.delivery.service_id |
нет | integer:int64 | null |
min: 1 | 1 |
||
data.delivery.delivery_type |
да | enum | null |
enum: door, pickup_point | Normalized delivery channel derived from the configured delivery service. Null when the service type is unknown. | "door" |
|
data.delivery.is_courier |
да | boolean |
True for door delivery; false for pickup-point delivery or an unknown service type. | true |
||
data.delivery.status |
нет | string | null |
"created" |
|||
data.delivery.track_number |
нет | string | null |
"CDEK-123456789" |
|||
data.delivery.pickup_point_id |
нет | string | null |
"SOFIA-01" |
|||
data.delivery.source_id |
нет | string | null |
"cdek-15" |
|||
data.delivery.tariff_code |
нет | integer:int64 | null |
136 |
|||
data.delivery.additional_services |
нет | object |
Values of additional CDEK services configured for the selected integration. Boolean true enables a code-only service; other values are sent as the CDEK parameter. |
{"TRYING_ON":true,"PART_DELIV":false,"PACKAGE_1":2} |
||
data.delivery.label |
нет | string:uri | null |
"https://betawms.ffcdek.ru/labels/CDEK-123456789.pdf" |
|||
data.delivery.delivery_date |
нет | string:date | null |
"2026-07-16" |
|||
data.delivery.delivery_time_start |
нет | string:time | null |
"09:00:00Z" |
|||
data.delivery.delivery_time_end |
нет | string:time | null |
"18:00:00Z" |
|||
data.comments |
нет | object | null |
|
|||
data.comments.delivery_service_text |
нет | string | null |
"Call before delivery" |
|||
data.comments.inner_text |
нет | string | null |
"VIP customer" |
|||
data.offers |
нет | array<OrderLineEmbedded> |
|
|||
data.offers[] |
нет | OrderLineEmbedded |
Scalar lot fields use the actual lot only when the full line is picked from one lot; partial/multiple actual lots leave scalars null. Before picking they retain the requested lot. Requested constraints are always available in requested_lot. | |
||
data.offers[].id |
да | integer:int64 |
readOnly | min: 1 | 7001 |
|
data.offers[].product_id |
нет | integer:int64 | null |
min: 1 | 1201 |
||
data.offers[].quantity |
нет | number:float | null |
min: 0 | 2 |
||
data.offers[].estimated_price |
нет | number:float | null |
19.5 |
|||
data.offers[].price |
нет | number:float | null |
19.99 |
|||
data.offers[].expiration_date |
нет | string:date | null |
"2027-01-15" |
|||
data.offers[].batch |
нет | string | null |
maxLength: 15 | "LOT-2026" |
||
data.offers[].operation_user_id |
нет | integer:int64 | null |
min: 1 | 9 |
||
data.offers[].product |
нет | object | null |
|
|||
data.offers[].product.id |
да | integer:int64 |
readOnly | min: 1 | 1201 |
|
data.offers[].product.name |
да | string |
"Coffee 250g" |
|||
data.offers[].product.external_id |
нет | string | null |
"EXT-10045" |
|||
data.offers[].reservation |
нет | OrderReservationLine |
Reservation totals for one order line. | |
||
data.offers[].reservation.required_qty |
да | number:float |
3 |
|||
data.offers[].reservation.reserved_qty |
да | number:float |
1 |
|||
data.offers[].reservation.unreserved_qty |
да | number:float |
2 |
|||
data.offers[].reservation.missing_qty |
да | number:float |
2 |
|||
data.offers[].reservation.status |
да | enum |
enum: not_required, missing, partial, reserved | Reservation state calculated from the quantity required by the order and the quantity actually reserved. | "partial" |
|
data.offers[].reservation_items |
нет | array<OrderReservationItem> |
|
|||
data.offers[].reservation_items[] |
нет | OrderReservationItem |
Physical product or expanded component used to explain a reservation shortage. | |
||
data.offers[].reservation_items[].offer_id |
да | integer:int64 |
min: 1 | 1201 |
||
data.offers[].reservation_items[].offer_name |
нет | string | null |
"Coffee 250g" |
|||
data.offers[].reservation_items[].offer_article |
нет | string | null |
"ART-001245" |
|||
data.offers[].reservation_items[].offer_sku |
нет | string | null |
"SKU-001245" |
|||
data.offers[].reservation_items[].required_qty |
да | number:float |
3 |
|||
data.offers[].reservation_items[].reserved_qty |
да | number:float |
1 |
|||
data.offers[].reservation_items[].unreserved_qty |
да | number:float |
2 |
|||
data.offers[].reservation_items[].missing_qty |
да | number:float |
2 |
|||
data.offers[].reservation_items[].status |
да | enum |
enum: not_required, missing, partial, reserved | Reservation state calculated from the quantity required by the order and the quantity actually reserved. | "partial" |
|
data.offers[].reservation_items[].source_order_offer_ids |
да | array<integer:int64> |
|
|||
data.offers[].reservation_items[].source_order_offer_ids[] |
нет | integer:int64 |
min: 1 | 7001 |
||
data.offers[].reservation_items[].source |
да | enum |
enum: order_offer, component, quant, composite_quant | "order_offer" |
||
data.offers[].reservation_items[].expanded_from_composite |
да | boolean |
false |
|||
data.offers[].reservation_items[].expanded_from_quant |
да | boolean |
false |
|||
data.offers[].reservation_items[].quant_base_offer_id |
нет | integer:int64 | null |
min: 1 | 1201 |
||
data.offers[].reservation_items[].quant_base_multiplicity |
нет | number:float | null |
6 |
|||
data.offers[].created_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.offers[].updated_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.offers[].production_date |
нет | string:date | null |
"2026-01-15" |
|||
data.offers[].requested_lot |
нет | WarehouseLot |
|
|||
data.offers[].requested_lot.batch |
да | string | null |
"LOT-2026" |
|||
data.offers[].requested_lot.production_date |
да | string:date | null |
"2026-01-15" |
|||
data.offers[].requested_lot.expiration_date |
да | string:date | null |
"2027-01-15" |
|||
data.offers[].picked_quantity |
нет | number:float |
min: 0 | 2 |
||
data.offers[].fulfillment_lots |
нет | array<OrderFulfillmentLot> |
Current active placed warehouse rows for this exact order line and product. Existing orders are included where these rows survive. This is a current picking snapshot, not a historical shipment event. | |
||
data.offers[].fulfillment_lots[] |
нет | OrderFulfillmentLot |
|
|||
data.offers[].fulfillment_lots[].batch |
да | string | null |
"LOT-2026" |
|||
data.offers[].fulfillment_lots[].production_date |
да | string:date | null |
"2026-01-15" |
|||
data.offers[].fulfillment_lots[].expiration_date |
да | string:date | null |
"2027-01-15" |
|||
data.offers[].fulfillment_lots[].warehouse_id |
да | integer:int64 |
min: 1 | 734 |
||
data.offers[].fulfillment_lots[].product_id |
да | integer:int64 |
min: 1 | 1201 |
||
data.offers[].fulfillment_lots[].quantity |
да | number:float |
min: 0 | 2 |
||
data.reservation |
нет | OrderReservation |
Reservation readiness and shortages calculated for the order. | |
||
data.reservation.ready |
да | boolean |
false |
|||
data.reservation.reason |
да | string | null |
"Not all order products are reserved." |
|||
data.reservation.expected_total |
да | number:float |
3 |
|||
data.reservation.reserved_total |
да | number:float |
1 |
|||
data.reservation.unreserved_total |
да | number:float |
2 |
|||
data.reservation.missing_total |
да | number:float |
2 |
|||
data.reservation.missing_items |
да | array<OrderReservationItem> |
|
|||
data.reservation.missing_items[] |
нет | OrderReservationItem |
Physical product or expanded component used to explain a reservation shortage. | |
||
data.reservation.missing_items[].offer_id |
да | integer:int64 |
min: 1 | 1201 |
||
data.reservation.missing_items[].offer_name |
нет | string | null |
"Coffee 250g" |
|||
data.reservation.missing_items[].offer_article |
нет | string | null |
"ART-001245" |
|||
data.reservation.missing_items[].offer_sku |
нет | string | null |
"SKU-001245" |
|||
data.reservation.missing_items[].required_qty |
да | number:float |
3 |
|||
data.reservation.missing_items[].reserved_qty |
да | number:float |
1 |
|||
data.reservation.missing_items[].unreserved_qty |
да | number:float |
2 |
|||
data.reservation.missing_items[].missing_qty |
да | number:float |
2 |
|||
data.reservation.missing_items[].status |
да | enum |
enum: not_required, missing, partial, reserved | Reservation state calculated from the quantity required by the order and the quantity actually reserved. | "partial" |
|
data.reservation.missing_items[].source_order_offer_ids |
да | array<integer:int64> |
|
|||
data.reservation.missing_items[].source_order_offer_ids[] |
нет | integer:int64 |
min: 1 | 7001 |
||
data.reservation.missing_items[].source |
да | enum |
enum: order_offer, component, quant, composite_quant | "order_offer" |
||
data.reservation.missing_items[].expanded_from_composite |
да | boolean |
false |
|||
data.reservation.missing_items[].expanded_from_quant |
да | boolean |
false |
|||
data.reservation.missing_items[].quant_base_offer_id |
нет | integer:int64 | null |
min: 1 | 1201 |
||
data.reservation.missing_items[].quant_base_multiplicity |
нет | number:float | null |
6 |
|||
data.reservation.error |
да | boolean |
false |
|||
data.consumables |
нет | array<OrderConsumable> |
|
|||
data.consumables[] |
нет | OrderConsumable |
Current consumable line, not an append-only consumption event. Unplaced usage creates a commitment but does not decrease physical stockTotal; do not treat that stockTotal as remaining packaging inventory. | |
||
data.consumables[].id |
да | integer:int64 |
min: 1 | 301 |
||
data.consumables[].order_id |
да | integer:int64 |
min: 1 | 8101 |
||
data.consumables[].product_id |
да | integer:int64 |
min: 1 | 1202 |
||
data.consumables[].warehouse_id |
да | integer:int64 | null |
min: 1 | 734 |
||
data.consumables[].place_id |
да | integer:int64 | null |
min: 1 | 501 |
||
data.consumables[].quantity |
да | number:float |
1 |
|||
data.consumables[].stock_location_mode |
да | enum |
enum: placed, unplaced | "unplaced" |
||
data.consumables[].created_at |
да | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.consumables[].updated_at |
да | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.status_history |
нет | array<OrderStatusHistoryEvent> |
Present only on GET list/detail with include=status_history. Ordered chronologically, retains repeat status cycles and combines surviving audit and action-log entries. Missing history returns an empty array. | |
||
data.status_history[] |
нет | OrderStatusHistoryEvent |
Recorded WMS status transition or explicitly inferred initial status. It does not independently confirm physical carrier handover. | |
||
data.status_history[].status_id |
да | integer:int64 |
130 |
|||
data.status_history[].previous_status_id |
да | integer:int64 | null |
110 |
|||
data.status_history[].changed_at |
да | string:date-time |
Time of the WMS status transition in ISO 8601 with an explicit timezone offset. | "2026-07-14T12:00:00+03:00" |
||
data.status_history[].source |
да | enum |
enum: audit, action_log, inferred | "action_log" |
||
data.status_history[].inferred |
да | boolean |
True only for a reconstructed initial status at order creation; this is not a separately recorded transition. | false |
||
data.status_history_meta |
нет | OrderStatusHistoryMeta |
|
|||
data.status_history_meta.available |
да | boolean |
At least one event is available. This does not guarantee complete historical coverage. | true |
||
data.status_history_meta.current_status_matches_history |
да | boolean |
The last available event has the current order status. False also when history is empty. | true |
||
meta |
да | ResponseMeta |
|
|||
meta.api_version |
да | enum |
enum: v2 | "v2" |
||
meta.deleted |
нет | boolean |
true |
|||
meta.id |
нет | integer:int64 | null |
min: 1 | 1001 |
||
meta.command_replayed |
нет | boolean |
True when an idempotent cross-dock command returned the original successful result. | false |
||
meta.crossdock_configuration |
нет | object | null |
|
|||
meta.crossdock_configuration.physical_warehouse_id |
да | integer:int64 |
min: 1 | 42 |
||
meta.crossdock_configuration.enabled |
да | boolean |
true |
|||
meta.crossdock_configuration.process_version |
да | string |
"direct_order_v1" |
Примеры ответа
success
{
"data": {
"id": 8101,
"external_id": "ORD-100245",
"domain_id": 3,
"type_id": 1,
"shop_id": 12,
"warehouse_id": 42,
"status_id": 20,
"status": {
"id": 20,
"name": "Created",
"color": "#2457c5",
"background_color": "#eaf0ff"
},
"order_date": "2026-07-14",
"send_date": "2026-07-15",
"source_id": 1,
"customer_type": 1,
"is_cod": true,
"amounts": {
"shipping_price": 8.6,
"shipping_cost": 0,
"sum": 39.98,
"cod_sum": 48.58
},
"company_id": 7,
"marking": {
"required": true,
"types": [
"chestny_znak"
]
},
"contact": {
"first_name": "Ivan",
"middle_name": null,
"last_name": "Petrov",
"phone": "+359888123456",
"email": "customer@example.com",
"country_id": 100,
"city_id": 200,
"postcode": "1000",
"latitude": 42.6977,
"longitude": 23.3219,
"full_address": "1 Vitosha Boulevard, Sofia"
},
"delivery": {
"service_id": 1,
"delivery_type": "door",
"is_courier": true,
"status": "created",
"track_number": "CDEK-123456789",
"source_id": "cdek-15",
"tariff_code": 136,
"label": "https://betawms.ffcdek.ru/labels/CDEK-123456789.pdf",
"delivery_date": "2026-07-16",
"delivery_time_start": "09:00:00Z",
"delivery_time_end": "18:00:00Z"
},
"comments": {
"delivery_service_text": "Call before delivery",
"inner_text": "VIP customer"
},
"offers": [
{
"id": 7001,
"product_id": 1201,
"quantity": 2,
"estimated_price": 19.5,
"price": 19.99,
"expiration_date": "2027-01-15",
"batch": "LOT-2026",
"operation_user_id": 9,
"product": {
"id": 1201,
"name": "Coffee 250g",
"external_id": "EXT-10045"
},
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
}
],
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z",
"status_history": [
{
"status_id": 20,
"previous_status_id": 10,
"changed_at": "2026-07-14T12:00:00+03:00",
"source": "action_log",
"inferred": false
}
],
"status_history_meta": {
"available": true,
"current_status_matches_history": true
}
},
"meta": {
"api_version": "v2"
}
}
401 Требуется аутентификация
Unauthorized
Требуется аутентификация.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
AUTH_REQUIRED
{
"message": "Authentication is required.",
"error": "AUTH_REQUIRED"
}
403 Доступ запрещен
Forbidden
Аутентифицированному аккаунту запрещено выполнять это действие.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
FORBIDDEN
{
"message": "The authenticated account is not allowed to perform this action.",
"error": "FORBIDDEN"
}
404 Не найдено
NotFound
Запрошенный ресурс не найден или находится вне области доступа аккаунта.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
NOT_FOUND
{
"message": "The requested resource was not found or is outside the authenticated account scope.",
"error": "NOT_FOUND"
}
429 Превышен лимит запросов
TooManyRequests
Превышен лимит запросов.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"Too Many Attempts." |
|||
error |
да | string |
"RATE_LIMITED" |
500 Внутренняя ошибка сервера
InternalServerError
Произошла непредвиденная ошибка сервера.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
INTERNAL_SERVER_ERROR
{
"message": "An unexpected server error occurred.",
"error": "INTERNAL_SERVER_ERROR"
}
Обновить заказ
| operationId | replaceOrders |
|---|---|
| Раздел | Заказы |
| Безопасность | bearerAuth |
Replaces editable order fields before the lifecycle reaches a locked status. Contact, delivery, comments, dimensions, and selected header fields may be changed; system totals remain server-calculated.
Текущее поведение backend является legacy-семантикой частичного обновления: пропущенные поля не изменяются.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Пример HTTP-запроса (cURL)
Подставьте свой сервер и токен. ID из примера замените реальными доступными ID. Для тела запроса сохраните подходящий JSON из раздела ниже в request.json; перед отправкой замените демонстрационные значения. Заголовок Idempotency-Key использует ключ одной логической операции.
curl --globoff --request PUT "${NWMS_BASE_URL}/api/v2/orders/1001" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}" \
--header "Idempotency-Key: ${NWMS_REQUEST_KEY}" \
--header "Content-Type: application/json" \
--data-binary @request.jsonПараметры
| Имя | Где | Обязательное | Тип | Style | Explode | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|---|---|
id |
path | да | integer:int64 |
min: 1 | ID заказа. | 1001 |
||
Idempotency-Key |
header | нет | string |
maxLength: 191 | Опциональный ключ идемпотентности для write-запросов API v2. Успешные ответы 2xx/3xx повторяются для того же ключа и идентичного payload в течение одного дня. Тот же ключ с другим payload возвращает 409. |
"ord-create-20260714-001" |
Тело запроса
ReplaceOrderRequest обязательно
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
data |
да | ReplaceOrderPayload |
Legacy PUT payload. Текущий backend применяет семантику частичного обновления и оставляет пропущенные поля без изменений. | |
||
data.external_id |
нет | string | null |
"ORD-100245" |
|||
data.send_date |
нет | string:date | null |
"2026-07-16" |
|||
data.status_id |
нет | integer:int64 | null |
ID статуса заказа. Текущий backend хранит статусы в базе данных; значения не моделируются как закрытый enum в публичном контракте. | 20 |
||
data.is_cod |
нет | boolean |
true |
|||
data.amounts |
нет | object | null |
|
|||
data.amounts.shipping_price |
нет | number:float | null |
8.6 |
|||
data.amounts.shipping_cost |
нет | number:float | null |
0 |
|||
data.amounts.sum |
нет | number:float | null |
39.98 |
|||
data.amounts.cod_sum |
нет | number:float | null |
48.58 |
|||
data.weight |
нет | object | null |
|
|||
data.weight.value |
нет | number:float | null |
min: 0 | 250 |
||
data.weight.unit |
да | enum |
enum: g | "g" |
||
data.dimensions |
нет | object | null |
|
|||
data.dimensions.x |
нет | number:float | null |
min: 0 | 105 |
||
data.dimensions.y |
нет | number:float | null |
min: 0 | 200 |
||
data.dimensions.z |
нет | number:float | null |
min: 0 | 32 |
||
data.dimensions.unit |
да | enum |
enum: mm | "mm" |
||
data.contact |
нет | object | null |
|
|||
data.contact.first_name |
нет | string | null |
"Ivan" |
|||
data.contact.middle_name |
нет | string | null |
"Ivanovich" |
|||
data.contact.last_name |
нет | string | null |
"Petrov" |
|||
data.contact.phone |
нет | string | null |
"+359888123456" |
|||
data.contact.email |
нет | string:email | null |
"customer@example.com" |
|||
data.contact.country_id |
нет | integer:int64 | null |
min: 1 | 100 |
||
data.contact.city_id |
нет | integer:int64 | null |
min: 1 | 200 |
||
data.contact.postcode |
нет | string | null |
"1000" |
|||
data.contact.latitude |
нет | number:float | null |
min: -90 max: 90 |
42.6977 |
||
data.contact.longitude |
нет | number:float | null |
min: -180 max: 180 |
23.3219 |
||
data.contact.full_address |
нет | string | null |
"1 Vitosha Boulevard, Sofia" |
|||
data.delivery |
нет | object | null |
|
|||
data.delivery.service_id |
нет | integer:int64 | null |
min: 1 | 1 |
||
data.delivery.delivery_type |
да | enum | null |
enum: door, pickup_point | Normalized delivery channel derived from the configured delivery service. Null when the service type is unknown. | "door" |
|
data.delivery.is_courier |
да | boolean |
True for door delivery; false for pickup-point delivery or an unknown service type. | true |
||
data.delivery.status |
нет | string | null |
"created" |
|||
data.delivery.track_number |
нет | string | null |
"CDEK-123456789" |
|||
data.delivery.pickup_point_id |
нет | string | null |
"SOFIA-01" |
|||
data.delivery.source_id |
нет | string | null |
"cdek-15" |
|||
data.delivery.tariff_code |
нет | integer:int64 | null |
136 |
|||
data.delivery.additional_services |
нет | object |
Values of additional CDEK services configured for the selected integration. Boolean true enables a code-only service; other values are sent as the CDEK parameter. |
{"TRYING_ON":true,"PART_DELIV":false,"PACKAGE_1":2} |
||
data.delivery.label |
нет | string:uri | null |
"https://betawms.ffcdek.ru/labels/CDEK-123456789.pdf" |
|||
data.delivery.delivery_date |
нет | string:date | null |
"2026-07-16" |
|||
data.delivery.delivery_time_start |
нет | string:time | null |
"09:00:00Z" |
|||
data.delivery.delivery_time_end |
нет | string:time | null |
"18:00:00Z" |
|||
data.comments |
нет | object | null |
|
|||
data.comments.delivery_service_text |
нет | string | null |
"Call before delivery" |
|||
data.comments.inner_text |
нет | string | null |
"VIP customer" |
Примеры запроса
default
{
"data": {
"send_date": "2026-07-16",
"comments": {
"inner_text": "Priority shipment"
}
}
}
Ответы
200 Successful response.
Successful response.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
data |
да | Order |
Исходящий складской заказ. Опциональные связанные поля присутствуют, когда контроллер их загрузил или они запрошены через include. |
|
||
data.id |
да | integer:int64 |
readOnly | min: 1 | 1001 |
|
data.created_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.updated_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.external_id |
нет | string | null |
"ORD-100245" |
|||
data.domain_id |
нет | integer:int64 | null |
min: 1 | 3 |
||
data.type_id |
нет | integer:int64 | null |
1 |
|||
data.shop_id |
нет | integer:int64 | null |
min: 1 | 12 |
||
data.warehouse_id |
нет | integer:int64 | null |
min: 1 | 42 |
||
data.status_id |
нет | integer:int64 | null |
ID статуса заказа. Текущий backend хранит статусы в базе данных; значения не моделируются как закрытый enum в публичном контракте. | 20 |
||
data.status |
нет | object | null |
|
|||
data.status.id |
да | integer:int64 |
20 |
|||
data.status.name |
да | string |
"Created" |
|||
data.status.color |
нет | string | null |
"#2457c5" |
|||
data.status.background_color |
нет | string | null |
"#eaf0ff" |
|||
data.order_date |
нет | string:date | null |
"2026-07-14" |
|||
data.send_date |
нет | string | null |
Stored order send date, potentially supplied by import, manual input or integration processing. It may be a date or date-time string; it is not a universal physical carrier-handover timestamp. | "2026-07-15 20:25:08" |
||
data.source_id |
нет | integer:int64 | null |
min: 1 | 1 |
||
data.customer_type |
нет | integer:int64 | null |
1 |
|||
data.is_cod |
нет | boolean |
true |
|||
data.amounts |
нет | OrderAmounts |
|
|||
data.amounts.shipping_price |
нет | number:float | null |
8.6 |
|||
data.amounts.shipping_cost |
нет | number:float | null |
0 |
|||
data.amounts.sum |
нет | number:float | null |
39.98 |
|||
data.amounts.cod_sum |
нет | number:float | null |
48.58 |
|||
data.company_id |
нет | integer:int64 | null |
min: 1 | 7 |
||
data.marking |
да | OrderMarking |
Marking data expected for products in the order. | |
||
data.marking.required |
да | boolean |
Whether the order contains products that require marking data after picking. | true |
||
data.marking.types |
да | array<string> |
Marking types required by products in the order. Currently chestny_znak; the list may gain values such as jewel_uin and imei. |
|
||
data.marking.types[] |
нет | string |
"chestny_znak" |
|||
data.contact |
нет | object | null |
|
|||
data.contact.first_name |
нет | string | null |
"Ivan" |
|||
data.contact.middle_name |
нет | string | null |
"Ivanovich" |
|||
data.contact.last_name |
нет | string | null |
"Petrov" |
|||
data.contact.phone |
нет | string | null |
"+359888123456" |
|||
data.contact.email |
нет | string:email | null |
"customer@example.com" |
|||
data.contact.country_id |
нет | integer:int64 | null |
min: 1 | 100 |
||
data.contact.city_id |
нет | integer:int64 | null |
min: 1 | 200 |
||
data.contact.postcode |
нет | string | null |
"1000" |
|||
data.contact.latitude |
нет | number:float | null |
min: -90 max: 90 |
42.6977 |
||
data.contact.longitude |
нет | number:float | null |
min: -180 max: 180 |
23.3219 |
||
data.contact.full_address |
нет | string | null |
"1 Vitosha Boulevard, Sofia" |
|||
data.delivery |
нет | object | null |
|
|||
data.delivery.service_id |
нет | integer:int64 | null |
min: 1 | 1 |
||
data.delivery.delivery_type |
да | enum | null |
enum: door, pickup_point | Normalized delivery channel derived from the configured delivery service. Null when the service type is unknown. | "door" |
|
data.delivery.is_courier |
да | boolean |
True for door delivery; false for pickup-point delivery or an unknown service type. | true |
||
data.delivery.status |
нет | string | null |
"created" |
|||
data.delivery.track_number |
нет | string | null |
"CDEK-123456789" |
|||
data.delivery.pickup_point_id |
нет | string | null |
"SOFIA-01" |
|||
data.delivery.source_id |
нет | string | null |
"cdek-15" |
|||
data.delivery.tariff_code |
нет | integer:int64 | null |
136 |
|||
data.delivery.additional_services |
нет | object |
Values of additional CDEK services configured for the selected integration. Boolean true enables a code-only service; other values are sent as the CDEK parameter. |
{"TRYING_ON":true,"PART_DELIV":false,"PACKAGE_1":2} |
||
data.delivery.label |
нет | string:uri | null |
"https://betawms.ffcdek.ru/labels/CDEK-123456789.pdf" |
|||
data.delivery.delivery_date |
нет | string:date | null |
"2026-07-16" |
|||
data.delivery.delivery_time_start |
нет | string:time | null |
"09:00:00Z" |
|||
data.delivery.delivery_time_end |
нет | string:time | null |
"18:00:00Z" |
|||
data.comments |
нет | object | null |
|
|||
data.comments.delivery_service_text |
нет | string | null |
"Call before delivery" |
|||
data.comments.inner_text |
нет | string | null |
"VIP customer" |
|||
data.offers |
нет | array<OrderLineEmbedded> |
|
|||
data.offers[] |
нет | OrderLineEmbedded |
Scalar lot fields use the actual lot only when the full line is picked from one lot; partial/multiple actual lots leave scalars null. Before picking they retain the requested lot. Requested constraints are always available in requested_lot. | |
||
data.offers[].id |
да | integer:int64 |
readOnly | min: 1 | 7001 |
|
data.offers[].product_id |
нет | integer:int64 | null |
min: 1 | 1201 |
||
data.offers[].quantity |
нет | number:float | null |
min: 0 | 2 |
||
data.offers[].estimated_price |
нет | number:float | null |
19.5 |
|||
data.offers[].price |
нет | number:float | null |
19.99 |
|||
data.offers[].expiration_date |
нет | string:date | null |
"2027-01-15" |
|||
data.offers[].batch |
нет | string | null |
maxLength: 15 | "LOT-2026" |
||
data.offers[].operation_user_id |
нет | integer:int64 | null |
min: 1 | 9 |
||
data.offers[].product |
нет | object | null |
|
|||
data.offers[].product.id |
да | integer:int64 |
readOnly | min: 1 | 1201 |
|
data.offers[].product.name |
да | string |
"Coffee 250g" |
|||
data.offers[].product.external_id |
нет | string | null |
"EXT-10045" |
|||
data.offers[].reservation |
нет | OrderReservationLine |
Reservation totals for one order line. | |
||
data.offers[].reservation.required_qty |
да | number:float |
3 |
|||
data.offers[].reservation.reserved_qty |
да | number:float |
1 |
|||
data.offers[].reservation.unreserved_qty |
да | number:float |
2 |
|||
data.offers[].reservation.missing_qty |
да | number:float |
2 |
|||
data.offers[].reservation.status |
да | enum |
enum: not_required, missing, partial, reserved | Reservation state calculated from the quantity required by the order and the quantity actually reserved. | "partial" |
|
data.offers[].reservation_items |
нет | array<OrderReservationItem> |
|
|||
data.offers[].reservation_items[] |
нет | OrderReservationItem |
Physical product or expanded component used to explain a reservation shortage. | |
||
data.offers[].reservation_items[].offer_id |
да | integer:int64 |
min: 1 | 1201 |
||
data.offers[].reservation_items[].offer_name |
нет | string | null |
"Coffee 250g" |
|||
data.offers[].reservation_items[].offer_article |
нет | string | null |
"ART-001245" |
|||
data.offers[].reservation_items[].offer_sku |
нет | string | null |
"SKU-001245" |
|||
data.offers[].reservation_items[].required_qty |
да | number:float |
3 |
|||
data.offers[].reservation_items[].reserved_qty |
да | number:float |
1 |
|||
data.offers[].reservation_items[].unreserved_qty |
да | number:float |
2 |
|||
data.offers[].reservation_items[].missing_qty |
да | number:float |
2 |
|||
data.offers[].reservation_items[].status |
да | enum |
enum: not_required, missing, partial, reserved | Reservation state calculated from the quantity required by the order and the quantity actually reserved. | "partial" |
|
data.offers[].reservation_items[].source_order_offer_ids |
да | array<integer:int64> |
|
|||
data.offers[].reservation_items[].source_order_offer_ids[] |
нет | integer:int64 |
min: 1 | 7001 |
||
data.offers[].reservation_items[].source |
да | enum |
enum: order_offer, component, quant, composite_quant | "order_offer" |
||
data.offers[].reservation_items[].expanded_from_composite |
да | boolean |
false |
|||
data.offers[].reservation_items[].expanded_from_quant |
да | boolean |
false |
|||
data.offers[].reservation_items[].quant_base_offer_id |
нет | integer:int64 | null |
min: 1 | 1201 |
||
data.offers[].reservation_items[].quant_base_multiplicity |
нет | number:float | null |
6 |
|||
data.offers[].created_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.offers[].updated_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.offers[].production_date |
нет | string:date | null |
"2026-01-15" |
|||
data.offers[].requested_lot |
нет | WarehouseLot |
|
|||
data.offers[].requested_lot.batch |
да | string | null |
"LOT-2026" |
|||
data.offers[].requested_lot.production_date |
да | string:date | null |
"2026-01-15" |
|||
data.offers[].requested_lot.expiration_date |
да | string:date | null |
"2027-01-15" |
|||
data.offers[].picked_quantity |
нет | number:float |
min: 0 | 2 |
||
data.offers[].fulfillment_lots |
нет | array<OrderFulfillmentLot> |
Current active placed warehouse rows for this exact order line and product. Existing orders are included where these rows survive. This is a current picking snapshot, not a historical shipment event. | |
||
data.offers[].fulfillment_lots[] |
нет | OrderFulfillmentLot |
|
|||
data.offers[].fulfillment_lots[].batch |
да | string | null |
"LOT-2026" |
|||
data.offers[].fulfillment_lots[].production_date |
да | string:date | null |
"2026-01-15" |
|||
data.offers[].fulfillment_lots[].expiration_date |
да | string:date | null |
"2027-01-15" |
|||
data.offers[].fulfillment_lots[].warehouse_id |
да | integer:int64 |
min: 1 | 734 |
||
data.offers[].fulfillment_lots[].product_id |
да | integer:int64 |
min: 1 | 1201 |
||
data.offers[].fulfillment_lots[].quantity |
да | number:float |
min: 0 | 2 |
||
data.reservation |
нет | OrderReservation |
Reservation readiness and shortages calculated for the order. | |
||
data.reservation.ready |
да | boolean |
false |
|||
data.reservation.reason |
да | string | null |
"Not all order products are reserved." |
|||
data.reservation.expected_total |
да | number:float |
3 |
|||
data.reservation.reserved_total |
да | number:float |
1 |
|||
data.reservation.unreserved_total |
да | number:float |
2 |
|||
data.reservation.missing_total |
да | number:float |
2 |
|||
data.reservation.missing_items |
да | array<OrderReservationItem> |
|
|||
data.reservation.missing_items[] |
нет | OrderReservationItem |
Physical product or expanded component used to explain a reservation shortage. | |
||
data.reservation.missing_items[].offer_id |
да | integer:int64 |
min: 1 | 1201 |
||
data.reservation.missing_items[].offer_name |
нет | string | null |
"Coffee 250g" |
|||
data.reservation.missing_items[].offer_article |
нет | string | null |
"ART-001245" |
|||
data.reservation.missing_items[].offer_sku |
нет | string | null |
"SKU-001245" |
|||
data.reservation.missing_items[].required_qty |
да | number:float |
3 |
|||
data.reservation.missing_items[].reserved_qty |
да | number:float |
1 |
|||
data.reservation.missing_items[].unreserved_qty |
да | number:float |
2 |
|||
data.reservation.missing_items[].missing_qty |
да | number:float |
2 |
|||
data.reservation.missing_items[].status |
да | enum |
enum: not_required, missing, partial, reserved | Reservation state calculated from the quantity required by the order and the quantity actually reserved. | "partial" |
|
data.reservation.missing_items[].source_order_offer_ids |
да | array<integer:int64> |
|
|||
data.reservation.missing_items[].source_order_offer_ids[] |
нет | integer:int64 |
min: 1 | 7001 |
||
data.reservation.missing_items[].source |
да | enum |
enum: order_offer, component, quant, composite_quant | "order_offer" |
||
data.reservation.missing_items[].expanded_from_composite |
да | boolean |
false |
|||
data.reservation.missing_items[].expanded_from_quant |
да | boolean |
false |
|||
data.reservation.missing_items[].quant_base_offer_id |
нет | integer:int64 | null |
min: 1 | 1201 |
||
data.reservation.missing_items[].quant_base_multiplicity |
нет | number:float | null |
6 |
|||
data.reservation.error |
да | boolean |
false |
|||
data.consumables |
нет | array<OrderConsumable> |
|
|||
data.consumables[] |
нет | OrderConsumable |
Current consumable line, not an append-only consumption event. Unplaced usage creates a commitment but does not decrease physical stockTotal; do not treat that stockTotal as remaining packaging inventory. | |
||
data.consumables[].id |
да | integer:int64 |
min: 1 | 301 |
||
data.consumables[].order_id |
да | integer:int64 |
min: 1 | 8101 |
||
data.consumables[].product_id |
да | integer:int64 |
min: 1 | 1202 |
||
data.consumables[].warehouse_id |
да | integer:int64 | null |
min: 1 | 734 |
||
data.consumables[].place_id |
да | integer:int64 | null |
min: 1 | 501 |
||
data.consumables[].quantity |
да | number:float |
1 |
|||
data.consumables[].stock_location_mode |
да | enum |
enum: placed, unplaced | "unplaced" |
||
data.consumables[].created_at |
да | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.consumables[].updated_at |
да | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.status_history |
нет | array<OrderStatusHistoryEvent> |
Present only on GET list/detail with include=status_history. Ordered chronologically, retains repeat status cycles and combines surviving audit and action-log entries. Missing history returns an empty array. | |
||
data.status_history[] |
нет | OrderStatusHistoryEvent |
Recorded WMS status transition or explicitly inferred initial status. It does not independently confirm physical carrier handover. | |
||
data.status_history[].status_id |
да | integer:int64 |
130 |
|||
data.status_history[].previous_status_id |
да | integer:int64 | null |
110 |
|||
data.status_history[].changed_at |
да | string:date-time |
Time of the WMS status transition in ISO 8601 with an explicit timezone offset. | "2026-07-14T12:00:00+03:00" |
||
data.status_history[].source |
да | enum |
enum: audit, action_log, inferred | "action_log" |
||
data.status_history[].inferred |
да | boolean |
True only for a reconstructed initial status at order creation; this is not a separately recorded transition. | false |
||
data.status_history_meta |
нет | OrderStatusHistoryMeta |
|
|||
data.status_history_meta.available |
да | boolean |
At least one event is available. This does not guarantee complete historical coverage. | true |
||
data.status_history_meta.current_status_matches_history |
да | boolean |
The last available event has the current order status. False also when history is empty. | true |
||
meta |
да | ResponseMeta |
|
|||
meta.api_version |
да | enum |
enum: v2 | "v2" |
||
meta.deleted |
нет | boolean |
true |
|||
meta.id |
нет | integer:int64 | null |
min: 1 | 1001 |
||
meta.command_replayed |
нет | boolean |
True when an idempotent cross-dock command returned the original successful result. | false |
||
meta.crossdock_configuration |
нет | object | null |
|
|||
meta.crossdock_configuration.physical_warehouse_id |
да | integer:int64 |
min: 1 | 42 |
||
meta.crossdock_configuration.enabled |
да | boolean |
true |
|||
meta.crossdock_configuration.process_version |
да | string |
"direct_order_v1" |
Примеры ответа
success
{
"data": {
"id": 8101,
"external_id": "ORD-100245",
"domain_id": 3,
"type_id": 1,
"shop_id": 12,
"warehouse_id": 42,
"status_id": 20,
"status": {
"id": 20,
"name": "Created",
"color": "#2457c5",
"background_color": "#eaf0ff"
},
"order_date": "2026-07-14",
"send_date": "2026-07-15",
"source_id": 1,
"customer_type": 1,
"is_cod": true,
"amounts": {
"shipping_price": 8.6,
"shipping_cost": 0,
"sum": 39.98,
"cod_sum": 48.58
},
"company_id": 7,
"marking": {
"required": true,
"types": [
"chestny_znak"
]
},
"contact": {
"first_name": "Ivan",
"middle_name": null,
"last_name": "Petrov",
"phone": "+359888123456",
"email": "customer@example.com",
"country_id": 100,
"city_id": 200,
"postcode": "1000",
"latitude": 42.6977,
"longitude": 23.3219,
"full_address": "1 Vitosha Boulevard, Sofia"
},
"delivery": {
"service_id": 1,
"delivery_type": "door",
"is_courier": true,
"status": "created",
"track_number": "CDEK-123456789",
"source_id": "cdek-15",
"tariff_code": 136,
"label": "https://betawms.ffcdek.ru/labels/CDEK-123456789.pdf",
"delivery_date": "2026-07-16",
"delivery_time_start": "09:00:00Z",
"delivery_time_end": "18:00:00Z"
},
"comments": {
"delivery_service_text": "Call before delivery",
"inner_text": "VIP customer"
},
"offers": [
{
"id": 7001,
"product_id": 1201,
"quantity": 2,
"estimated_price": 19.5,
"price": 19.99,
"expiration_date": "2027-01-15",
"batch": "LOT-2026",
"operation_user_id": 9,
"product": {
"id": 1201,
"name": "Coffee 250g",
"external_id": "EXT-10045"
},
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
}
],
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
},
"meta": {
"api_version": "v2"
}
}
400 Некорректный запрос
BadRequest
Некорректный запрос.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
BAD_REQUEST
{
"message": "Bad request.",
"error": "BAD_REQUEST"
}
401 Требуется аутентификация
Unauthorized
Требуется аутентификация.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
AUTH_REQUIRED
{
"message": "Authentication is required.",
"error": "AUTH_REQUIRED"
}
403 Доступ запрещен
Forbidden
Аутентифицированному аккаунту запрещено выполнять это действие.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
FORBIDDEN
{
"message": "The authenticated account is not allowed to perform this action.",
"error": "FORBIDDEN"
}
404 Не найдено
NotFound
Запрошенный ресурс не найден или находится вне области доступа аккаунта.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
NOT_FOUND
{
"message": "The requested resource was not found or is outside the authenticated account scope.",
"error": "NOT_FOUND"
}
409 Конфликт
Conflict
Запрос конфликтует с текущим состоянием ресурса или ключа идемпотентности.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
idempotencyConflict
{
"message": "The idempotency key is already used with a different payload.",
"error": "IDEMPOTENCY_KEY_CONFLICT"
}
422 Ошибка валидации
ValidationError
Ошибка валидации.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The given data was invalid." |
|||
error |
нет | string |
"VALIDATION_ERROR" |
|||
errors |
да | object |
{"warehouse_id":["The selected warehouse is invalid."]} |
Примеры ответа
validationError
{
"message": "The given data was invalid.",
"error": "VALIDATION_ERROR",
"errors": {
"warehouse_id": [
"The selected warehouse is invalid."
]
}
}
429 Превышен лимит запросов
TooManyRequests
Превышен лимит запросов.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"Too Many Attempts." |
|||
error |
да | string |
"RATE_LIMITED" |
500 Внутренняя ошибка сервера
InternalServerError
Произошла непредвиденная ошибка сервера.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
INTERNAL_SERVER_ERROR
{
"message": "An unexpected server error occurred.",
"error": "INTERNAL_SERVER_ERROR"
}
Обновить заказ
| operationId | patchOrders |
|---|---|
| Раздел | Заказы |
| Безопасность | bearerAuth |
Partially updates editable order fields. Omitted fields are left unchanged and the same lifecycle, data-scope, and idempotency rules as PUT /api/v2/orders/{id} apply.
Текущее поведение backend является legacy-семантикой частичного обновления: пропущенные поля не изменяются.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Пример HTTP-запроса (cURL)
Подставьте свой сервер и токен. ID из примера замените реальными доступными ID. Для тела запроса сохраните подходящий JSON из раздела ниже в request.json; перед отправкой замените демонстрационные значения. Заголовок Idempotency-Key использует ключ одной логической операции.
curl --globoff --request PATCH "${NWMS_BASE_URL}/api/v2/orders/1001" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}" \
--header "Idempotency-Key: ${NWMS_REQUEST_KEY}" \
--header "Content-Type: application/json" \
--data-binary @request.jsonПараметры
| Имя | Где | Обязательное | Тип | Style | Explode | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|---|---|
id |
path | да | integer:int64 |
min: 1 | ID заказа. | 1001 |
||
Idempotency-Key |
header | нет | string |
maxLength: 191 | Опциональный ключ идемпотентности для write-запросов API v2. Успешные ответы 2xx/3xx повторяются для того же ключа и идентичного payload в течение одного дня. Тот же ключ с другим payload возвращает 409. |
"ord-create-20260714-001" |
Тело запроса
PatchOrderRequest обязательно
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
data |
да | PatchOrderPayload |
Payload частичного обновления заказа. Пропущенные поля не изменяются. | |
||
data.external_id |
нет | string | null |
"ORD-100245" |
|||
data.send_date |
нет | string:date | null |
"2026-07-16" |
|||
data.status_id |
нет | integer:int64 | null |
ID статуса заказа. Текущий backend хранит статусы в базе данных; значения не моделируются как закрытый enum в публичном контракте. | 20 |
||
data.is_cod |
нет | boolean |
true |
|||
data.amounts |
нет | object | null |
|
|||
data.amounts.shipping_price |
нет | number:float | null |
8.6 |
|||
data.amounts.shipping_cost |
нет | number:float | null |
0 |
|||
data.amounts.sum |
нет | number:float | null |
39.98 |
|||
data.amounts.cod_sum |
нет | number:float | null |
48.58 |
|||
data.weight |
нет | object | null |
|
|||
data.weight.value |
нет | number:float | null |
min: 0 | 250 |
||
data.weight.unit |
да | enum |
enum: g | "g" |
||
data.dimensions |
нет | object | null |
|
|||
data.dimensions.x |
нет | number:float | null |
min: 0 | 105 |
||
data.dimensions.y |
нет | number:float | null |
min: 0 | 200 |
||
data.dimensions.z |
нет | number:float | null |
min: 0 | 32 |
||
data.dimensions.unit |
да | enum |
enum: mm | "mm" |
||
data.contact |
нет | object | null |
|
|||
data.contact.first_name |
нет | string | null |
"Ivan" |
|||
data.contact.middle_name |
нет | string | null |
"Ivanovich" |
|||
data.contact.last_name |
нет | string | null |
"Petrov" |
|||
data.contact.phone |
нет | string | null |
"+359888123456" |
|||
data.contact.email |
нет | string:email | null |
"customer@example.com" |
|||
data.contact.country_id |
нет | integer:int64 | null |
min: 1 | 100 |
||
data.contact.city_id |
нет | integer:int64 | null |
min: 1 | 200 |
||
data.contact.postcode |
нет | string | null |
"1000" |
|||
data.contact.latitude |
нет | number:float | null |
min: -90 max: 90 |
42.6977 |
||
data.contact.longitude |
нет | number:float | null |
min: -180 max: 180 |
23.3219 |
||
data.contact.full_address |
нет | string | null |
"1 Vitosha Boulevard, Sofia" |
|||
data.delivery |
нет | object | null |
|
|||
data.delivery.service_id |
нет | integer:int64 | null |
min: 1 | 1 |
||
data.delivery.delivery_type |
да | enum | null |
enum: door, pickup_point | Normalized delivery channel derived from the configured delivery service. Null when the service type is unknown. | "door" |
|
data.delivery.is_courier |
да | boolean |
True for door delivery; false for pickup-point delivery or an unknown service type. | true |
||
data.delivery.status |
нет | string | null |
"created" |
|||
data.delivery.track_number |
нет | string | null |
"CDEK-123456789" |
|||
data.delivery.pickup_point_id |
нет | string | null |
"SOFIA-01" |
|||
data.delivery.source_id |
нет | string | null |
"cdek-15" |
|||
data.delivery.tariff_code |
нет | integer:int64 | null |
136 |
|||
data.delivery.additional_services |
нет | object |
Values of additional CDEK services configured for the selected integration. Boolean true enables a code-only service; other values are sent as the CDEK parameter. |
{"TRYING_ON":true,"PART_DELIV":false,"PACKAGE_1":2} |
||
data.delivery.label |
нет | string:uri | null |
"https://betawms.ffcdek.ru/labels/CDEK-123456789.pdf" |
|||
data.delivery.delivery_date |
нет | string:date | null |
"2026-07-16" |
|||
data.delivery.delivery_time_start |
нет | string:time | null |
"09:00:00Z" |
|||
data.delivery.delivery_time_end |
нет | string:time | null |
"18:00:00Z" |
|||
data.comments |
нет | object | null |
|
|||
data.comments.delivery_service_text |
нет | string | null |
"Call before delivery" |
|||
data.comments.inner_text |
нет | string | null |
"VIP customer" |
Примеры запроса
default
{
"data": {
"send_date": "2026-07-16"
}
}
Ответы
200 Successful response.
Successful response.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
data |
да | Order |
Исходящий складской заказ. Опциональные связанные поля присутствуют, когда контроллер их загрузил или они запрошены через include. |
|
||
data.id |
да | integer:int64 |
readOnly | min: 1 | 1001 |
|
data.created_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.updated_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.external_id |
нет | string | null |
"ORD-100245" |
|||
data.domain_id |
нет | integer:int64 | null |
min: 1 | 3 |
||
data.type_id |
нет | integer:int64 | null |
1 |
|||
data.shop_id |
нет | integer:int64 | null |
min: 1 | 12 |
||
data.warehouse_id |
нет | integer:int64 | null |
min: 1 | 42 |
||
data.status_id |
нет | integer:int64 | null |
ID статуса заказа. Текущий backend хранит статусы в базе данных; значения не моделируются как закрытый enum в публичном контракте. | 20 |
||
data.status |
нет | object | null |
|
|||
data.status.id |
да | integer:int64 |
20 |
|||
data.status.name |
да | string |
"Created" |
|||
data.status.color |
нет | string | null |
"#2457c5" |
|||
data.status.background_color |
нет | string | null |
"#eaf0ff" |
|||
data.order_date |
нет | string:date | null |
"2026-07-14" |
|||
data.send_date |
нет | string | null |
Stored order send date, potentially supplied by import, manual input or integration processing. It may be a date or date-time string; it is not a universal physical carrier-handover timestamp. | "2026-07-15 20:25:08" |
||
data.source_id |
нет | integer:int64 | null |
min: 1 | 1 |
||
data.customer_type |
нет | integer:int64 | null |
1 |
|||
data.is_cod |
нет | boolean |
true |
|||
data.amounts |
нет | OrderAmounts |
|
|||
data.amounts.shipping_price |
нет | number:float | null |
8.6 |
|||
data.amounts.shipping_cost |
нет | number:float | null |
0 |
|||
data.amounts.sum |
нет | number:float | null |
39.98 |
|||
data.amounts.cod_sum |
нет | number:float | null |
48.58 |
|||
data.company_id |
нет | integer:int64 | null |
min: 1 | 7 |
||
data.marking |
да | OrderMarking |
Marking data expected for products in the order. | |
||
data.marking.required |
да | boolean |
Whether the order contains products that require marking data after picking. | true |
||
data.marking.types |
да | array<string> |
Marking types required by products in the order. Currently chestny_znak; the list may gain values such as jewel_uin and imei. |
|
||
data.marking.types[] |
нет | string |
"chestny_znak" |
|||
data.contact |
нет | object | null |
|
|||
data.contact.first_name |
нет | string | null |
"Ivan" |
|||
data.contact.middle_name |
нет | string | null |
"Ivanovich" |
|||
data.contact.last_name |
нет | string | null |
"Petrov" |
|||
data.contact.phone |
нет | string | null |
"+359888123456" |
|||
data.contact.email |
нет | string:email | null |
"customer@example.com" |
|||
data.contact.country_id |
нет | integer:int64 | null |
min: 1 | 100 |
||
data.contact.city_id |
нет | integer:int64 | null |
min: 1 | 200 |
||
data.contact.postcode |
нет | string | null |
"1000" |
|||
data.contact.latitude |
нет | number:float | null |
min: -90 max: 90 |
42.6977 |
||
data.contact.longitude |
нет | number:float | null |
min: -180 max: 180 |
23.3219 |
||
data.contact.full_address |
нет | string | null |
"1 Vitosha Boulevard, Sofia" |
|||
data.delivery |
нет | object | null |
|
|||
data.delivery.service_id |
нет | integer:int64 | null |
min: 1 | 1 |
||
data.delivery.delivery_type |
да | enum | null |
enum: door, pickup_point | Normalized delivery channel derived from the configured delivery service. Null when the service type is unknown. | "door" |
|
data.delivery.is_courier |
да | boolean |
True for door delivery; false for pickup-point delivery or an unknown service type. | true |
||
data.delivery.status |
нет | string | null |
"created" |
|||
data.delivery.track_number |
нет | string | null |
"CDEK-123456789" |
|||
data.delivery.pickup_point_id |
нет | string | null |
"SOFIA-01" |
|||
data.delivery.source_id |
нет | string | null |
"cdek-15" |
|||
data.delivery.tariff_code |
нет | integer:int64 | null |
136 |
|||
data.delivery.additional_services |
нет | object |
Values of additional CDEK services configured for the selected integration. Boolean true enables a code-only service; other values are sent as the CDEK parameter. |
{"TRYING_ON":true,"PART_DELIV":false,"PACKAGE_1":2} |
||
data.delivery.label |
нет | string:uri | null |
"https://betawms.ffcdek.ru/labels/CDEK-123456789.pdf" |
|||
data.delivery.delivery_date |
нет | string:date | null |
"2026-07-16" |
|||
data.delivery.delivery_time_start |
нет | string:time | null |
"09:00:00Z" |
|||
data.delivery.delivery_time_end |
нет | string:time | null |
"18:00:00Z" |
|||
data.comments |
нет | object | null |
|
|||
data.comments.delivery_service_text |
нет | string | null |
"Call before delivery" |
|||
data.comments.inner_text |
нет | string | null |
"VIP customer" |
|||
data.offers |
нет | array<OrderLineEmbedded> |
|
|||
data.offers[] |
нет | OrderLineEmbedded |
Scalar lot fields use the actual lot only when the full line is picked from one lot; partial/multiple actual lots leave scalars null. Before picking they retain the requested lot. Requested constraints are always available in requested_lot. | |
||
data.offers[].id |
да | integer:int64 |
readOnly | min: 1 | 7001 |
|
data.offers[].product_id |
нет | integer:int64 | null |
min: 1 | 1201 |
||
data.offers[].quantity |
нет | number:float | null |
min: 0 | 2 |
||
data.offers[].estimated_price |
нет | number:float | null |
19.5 |
|||
data.offers[].price |
нет | number:float | null |
19.99 |
|||
data.offers[].expiration_date |
нет | string:date | null |
"2027-01-15" |
|||
data.offers[].batch |
нет | string | null |
maxLength: 15 | "LOT-2026" |
||
data.offers[].operation_user_id |
нет | integer:int64 | null |
min: 1 | 9 |
||
data.offers[].product |
нет | object | null |
|
|||
data.offers[].product.id |
да | integer:int64 |
readOnly | min: 1 | 1201 |
|
data.offers[].product.name |
да | string |
"Coffee 250g" |
|||
data.offers[].product.external_id |
нет | string | null |
"EXT-10045" |
|||
data.offers[].reservation |
нет | OrderReservationLine |
Reservation totals for one order line. | |
||
data.offers[].reservation.required_qty |
да | number:float |
3 |
|||
data.offers[].reservation.reserved_qty |
да | number:float |
1 |
|||
data.offers[].reservation.unreserved_qty |
да | number:float |
2 |
|||
data.offers[].reservation.missing_qty |
да | number:float |
2 |
|||
data.offers[].reservation.status |
да | enum |
enum: not_required, missing, partial, reserved | Reservation state calculated from the quantity required by the order and the quantity actually reserved. | "partial" |
|
data.offers[].reservation_items |
нет | array<OrderReservationItem> |
|
|||
data.offers[].reservation_items[] |
нет | OrderReservationItem |
Physical product or expanded component used to explain a reservation shortage. | |
||
data.offers[].reservation_items[].offer_id |
да | integer:int64 |
min: 1 | 1201 |
||
data.offers[].reservation_items[].offer_name |
нет | string | null |
"Coffee 250g" |
|||
data.offers[].reservation_items[].offer_article |
нет | string | null |
"ART-001245" |
|||
data.offers[].reservation_items[].offer_sku |
нет | string | null |
"SKU-001245" |
|||
data.offers[].reservation_items[].required_qty |
да | number:float |
3 |
|||
data.offers[].reservation_items[].reserved_qty |
да | number:float |
1 |
|||
data.offers[].reservation_items[].unreserved_qty |
да | number:float |
2 |
|||
data.offers[].reservation_items[].missing_qty |
да | number:float |
2 |
|||
data.offers[].reservation_items[].status |
да | enum |
enum: not_required, missing, partial, reserved | Reservation state calculated from the quantity required by the order and the quantity actually reserved. | "partial" |
|
data.offers[].reservation_items[].source_order_offer_ids |
да | array<integer:int64> |
|
|||
data.offers[].reservation_items[].source_order_offer_ids[] |
нет | integer:int64 |
min: 1 | 7001 |
||
data.offers[].reservation_items[].source |
да | enum |
enum: order_offer, component, quant, composite_quant | "order_offer" |
||
data.offers[].reservation_items[].expanded_from_composite |
да | boolean |
false |
|||
data.offers[].reservation_items[].expanded_from_quant |
да | boolean |
false |
|||
data.offers[].reservation_items[].quant_base_offer_id |
нет | integer:int64 | null |
min: 1 | 1201 |
||
data.offers[].reservation_items[].quant_base_multiplicity |
нет | number:float | null |
6 |
|||
data.offers[].created_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.offers[].updated_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.offers[].production_date |
нет | string:date | null |
"2026-01-15" |
|||
data.offers[].requested_lot |
нет | WarehouseLot |
|
|||
data.offers[].requested_lot.batch |
да | string | null |
"LOT-2026" |
|||
data.offers[].requested_lot.production_date |
да | string:date | null |
"2026-01-15" |
|||
data.offers[].requested_lot.expiration_date |
да | string:date | null |
"2027-01-15" |
|||
data.offers[].picked_quantity |
нет | number:float |
min: 0 | 2 |
||
data.offers[].fulfillment_lots |
нет | array<OrderFulfillmentLot> |
Current active placed warehouse rows for this exact order line and product. Existing orders are included where these rows survive. This is a current picking snapshot, not a historical shipment event. | |
||
data.offers[].fulfillment_lots[] |
нет | OrderFulfillmentLot |
|
|||
data.offers[].fulfillment_lots[].batch |
да | string | null |
"LOT-2026" |
|||
data.offers[].fulfillment_lots[].production_date |
да | string:date | null |
"2026-01-15" |
|||
data.offers[].fulfillment_lots[].expiration_date |
да | string:date | null |
"2027-01-15" |
|||
data.offers[].fulfillment_lots[].warehouse_id |
да | integer:int64 |
min: 1 | 734 |
||
data.offers[].fulfillment_lots[].product_id |
да | integer:int64 |
min: 1 | 1201 |
||
data.offers[].fulfillment_lots[].quantity |
да | number:float |
min: 0 | 2 |
||
data.reservation |
нет | OrderReservation |
Reservation readiness and shortages calculated for the order. | |
||
data.reservation.ready |
да | boolean |
false |
|||
data.reservation.reason |
да | string | null |
"Not all order products are reserved." |
|||
data.reservation.expected_total |
да | number:float |
3 |
|||
data.reservation.reserved_total |
да | number:float |
1 |
|||
data.reservation.unreserved_total |
да | number:float |
2 |
|||
data.reservation.missing_total |
да | number:float |
2 |
|||
data.reservation.missing_items |
да | array<OrderReservationItem> |
|
|||
data.reservation.missing_items[] |
нет | OrderReservationItem |
Physical product or expanded component used to explain a reservation shortage. | |
||
data.reservation.missing_items[].offer_id |
да | integer:int64 |
min: 1 | 1201 |
||
data.reservation.missing_items[].offer_name |
нет | string | null |
"Coffee 250g" |
|||
data.reservation.missing_items[].offer_article |
нет | string | null |
"ART-001245" |
|||
data.reservation.missing_items[].offer_sku |
нет | string | null |
"SKU-001245" |
|||
data.reservation.missing_items[].required_qty |
да | number:float |
3 |
|||
data.reservation.missing_items[].reserved_qty |
да | number:float |
1 |
|||
data.reservation.missing_items[].unreserved_qty |
да | number:float |
2 |
|||
data.reservation.missing_items[].missing_qty |
да | number:float |
2 |
|||
data.reservation.missing_items[].status |
да | enum |
enum: not_required, missing, partial, reserved | Reservation state calculated from the quantity required by the order and the quantity actually reserved. | "partial" |
|
data.reservation.missing_items[].source_order_offer_ids |
да | array<integer:int64> |
|
|||
data.reservation.missing_items[].source_order_offer_ids[] |
нет | integer:int64 |
min: 1 | 7001 |
||
data.reservation.missing_items[].source |
да | enum |
enum: order_offer, component, quant, composite_quant | "order_offer" |
||
data.reservation.missing_items[].expanded_from_composite |
да | boolean |
false |
|||
data.reservation.missing_items[].expanded_from_quant |
да | boolean |
false |
|||
data.reservation.missing_items[].quant_base_offer_id |
нет | integer:int64 | null |
min: 1 | 1201 |
||
data.reservation.missing_items[].quant_base_multiplicity |
нет | number:float | null |
6 |
|||
data.reservation.error |
да | boolean |
false |
|||
data.consumables |
нет | array<OrderConsumable> |
|
|||
data.consumables[] |
нет | OrderConsumable |
Current consumable line, not an append-only consumption event. Unplaced usage creates a commitment but does not decrease physical stockTotal; do not treat that stockTotal as remaining packaging inventory. | |
||
data.consumables[].id |
да | integer:int64 |
min: 1 | 301 |
||
data.consumables[].order_id |
да | integer:int64 |
min: 1 | 8101 |
||
data.consumables[].product_id |
да | integer:int64 |
min: 1 | 1202 |
||
data.consumables[].warehouse_id |
да | integer:int64 | null |
min: 1 | 734 |
||
data.consumables[].place_id |
да | integer:int64 | null |
min: 1 | 501 |
||
data.consumables[].quantity |
да | number:float |
1 |
|||
data.consumables[].stock_location_mode |
да | enum |
enum: placed, unplaced | "unplaced" |
||
data.consumables[].created_at |
да | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.consumables[].updated_at |
да | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.status_history |
нет | array<OrderStatusHistoryEvent> |
Present only on GET list/detail with include=status_history. Ordered chronologically, retains repeat status cycles and combines surviving audit and action-log entries. Missing history returns an empty array. | |
||
data.status_history[] |
нет | OrderStatusHistoryEvent |
Recorded WMS status transition or explicitly inferred initial status. It does not independently confirm physical carrier handover. | |
||
data.status_history[].status_id |
да | integer:int64 |
130 |
|||
data.status_history[].previous_status_id |
да | integer:int64 | null |
110 |
|||
data.status_history[].changed_at |
да | string:date-time |
Time of the WMS status transition in ISO 8601 with an explicit timezone offset. | "2026-07-14T12:00:00+03:00" |
||
data.status_history[].source |
да | enum |
enum: audit, action_log, inferred | "action_log" |
||
data.status_history[].inferred |
да | boolean |
True only for a reconstructed initial status at order creation; this is not a separately recorded transition. | false |
||
data.status_history_meta |
нет | OrderStatusHistoryMeta |
|
|||
data.status_history_meta.available |
да | boolean |
At least one event is available. This does not guarantee complete historical coverage. | true |
||
data.status_history_meta.current_status_matches_history |
да | boolean |
The last available event has the current order status. False also when history is empty. | true |
||
meta |
да | ResponseMeta |
|
|||
meta.api_version |
да | enum |
enum: v2 | "v2" |
||
meta.deleted |
нет | boolean |
true |
|||
meta.id |
нет | integer:int64 | null |
min: 1 | 1001 |
||
meta.command_replayed |
нет | boolean |
True when an idempotent cross-dock command returned the original successful result. | false |
||
meta.crossdock_configuration |
нет | object | null |
|
|||
meta.crossdock_configuration.physical_warehouse_id |
да | integer:int64 |
min: 1 | 42 |
||
meta.crossdock_configuration.enabled |
да | boolean |
true |
|||
meta.crossdock_configuration.process_version |
да | string |
"direct_order_v1" |
Примеры ответа
success
{
"data": {
"id": 8101,
"external_id": "ORD-100245",
"domain_id": 3,
"type_id": 1,
"shop_id": 12,
"warehouse_id": 42,
"status_id": 20,
"status": {
"id": 20,
"name": "Created",
"color": "#2457c5",
"background_color": "#eaf0ff"
},
"order_date": "2026-07-14",
"send_date": "2026-07-15",
"source_id": 1,
"customer_type": 1,
"is_cod": true,
"amounts": {
"shipping_price": 8.6,
"shipping_cost": 0,
"sum": 39.98,
"cod_sum": 48.58
},
"company_id": 7,
"marking": {
"required": true,
"types": [
"chestny_znak"
]
},
"contact": {
"first_name": "Ivan",
"middle_name": null,
"last_name": "Petrov",
"phone": "+359888123456",
"email": "customer@example.com",
"country_id": 100,
"city_id": 200,
"postcode": "1000",
"latitude": 42.6977,
"longitude": 23.3219,
"full_address": "1 Vitosha Boulevard, Sofia"
},
"delivery": {
"service_id": 1,
"delivery_type": "door",
"is_courier": true,
"status": "created",
"track_number": "CDEK-123456789",
"source_id": "cdek-15",
"tariff_code": 136,
"label": "https://betawms.ffcdek.ru/labels/CDEK-123456789.pdf",
"delivery_date": "2026-07-16",
"delivery_time_start": "09:00:00Z",
"delivery_time_end": "18:00:00Z"
},
"comments": {
"delivery_service_text": "Call before delivery",
"inner_text": "VIP customer"
},
"offers": [
{
"id": 7001,
"product_id": 1201,
"quantity": 2,
"estimated_price": 19.5,
"price": 19.99,
"expiration_date": "2027-01-15",
"batch": "LOT-2026",
"operation_user_id": 9,
"product": {
"id": 1201,
"name": "Coffee 250g",
"external_id": "EXT-10045"
},
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
}
],
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
},
"meta": {
"api_version": "v2"
}
}
400 Некорректный запрос
BadRequest
Некорректный запрос.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
BAD_REQUEST
{
"message": "Bad request.",
"error": "BAD_REQUEST"
}
401 Требуется аутентификация
Unauthorized
Требуется аутентификация.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
AUTH_REQUIRED
{
"message": "Authentication is required.",
"error": "AUTH_REQUIRED"
}
403 Доступ запрещен
Forbidden
Аутентифицированному аккаунту запрещено выполнять это действие.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
FORBIDDEN
{
"message": "The authenticated account is not allowed to perform this action.",
"error": "FORBIDDEN"
}
404 Не найдено
NotFound
Запрошенный ресурс не найден или находится вне области доступа аккаунта.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
NOT_FOUND
{
"message": "The requested resource was not found or is outside the authenticated account scope.",
"error": "NOT_FOUND"
}
409 Конфликт
Conflict
Запрос конфликтует с текущим состоянием ресурса или ключа идемпотентности.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
idempotencyConflict
{
"message": "The idempotency key is already used with a different payload.",
"error": "IDEMPOTENCY_KEY_CONFLICT"
}
422 Ошибка валидации
ValidationError
Ошибка валидации.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The given data was invalid." |
|||
error |
нет | string |
"VALIDATION_ERROR" |
|||
errors |
да | object |
{"warehouse_id":["The selected warehouse is invalid."]} |
Примеры ответа
validationError
{
"message": "The given data was invalid.",
"error": "VALIDATION_ERROR",
"errors": {
"warehouse_id": [
"The selected warehouse is invalid."
]
}
}
429 Превышен лимит запросов
TooManyRequests
Превышен лимит запросов.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"Too Many Attempts." |
|||
error |
да | string |
"RATE_LIMITED" |
500 Внутренняя ошибка сервера
InternalServerError
Произошла непредвиденная ошибка сервера.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
INTERNAL_SERVER_ERROR
{
"message": "An unexpected server error occurred.",
"error": "INTERNAL_SERVER_ERROR"
}
Удалить заказ
| operationId | deleteOrders |
|---|---|
| Раздел | Заказы |
| Безопасность | bearerAuth |
Deletes the resource when the authenticated account has permission and the current lifecycle state allows deletion. If deletion is blocked by related records or document state, the API returns a validation error.
Пример HTTP-запроса (cURL)
Подставьте свой сервер и токен. ID из примера замените реальными доступными ID. Для тела запроса сохраните подходящий JSON из раздела ниже в request.json; перед отправкой замените демонстрационные значения. Заголовок Idempotency-Key использует ключ одной логической операции.
curl --globoff --request DELETE "${NWMS_BASE_URL}/api/v2/orders/1001" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}" \
--header "Idempotency-Key: ${NWMS_REQUEST_KEY}"Параметры
| Имя | Где | Обязательное | Тип | Style | Explode | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|---|---|
id |
path | да | integer:int64 |
min: 1 | ID заказа. | 1001 |
||
Idempotency-Key |
header | нет | string |
maxLength: 191 | Опциональный ключ идемпотентности для write-запросов API v2. Успешные ответы 2xx/3xx повторяются для того же ключа и идентичного payload в течение одного дня. Тот же ключ с другим payload возвращает 409. |
"ord-create-20260714-001" |
Тело запроса
Тело запроса отсутствует.
Ответы
200 Successful response.
Successful response.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
data |
да | object | null |
|
|||
meta |
да | object |
|
|||
meta.api_version |
да | enum |
enum: v2 | "v2" |
||
meta.deleted |
да | boolean |
true |
|||
meta.id |
да | integer:int64 |
min: 1 | 1001 |
Примеры ответа
success
{
"data": null,
"meta": {
"api_version": "v2",
"deleted": true,
"id": 1001
}
}
400 Некорректный запрос
BadRequest
Некорректный запрос.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
BAD_REQUEST
{
"message": "Bad request.",
"error": "BAD_REQUEST"
}
401 Требуется аутентификация
Unauthorized
Требуется аутентификация.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
AUTH_REQUIRED
{
"message": "Authentication is required.",
"error": "AUTH_REQUIRED"
}
403 Доступ запрещен
Forbidden
Аутентифицированному аккаунту запрещено выполнять это действие.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
FORBIDDEN
{
"message": "The authenticated account is not allowed to perform this action.",
"error": "FORBIDDEN"
}
404 Не найдено
NotFound
Запрошенный ресурс не найден или находится вне области доступа аккаунта.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
NOT_FOUND
{
"message": "The requested resource was not found or is outside the authenticated account scope.",
"error": "NOT_FOUND"
}
409 Конфликт
Conflict
Запрос конфликтует с текущим состоянием ресурса или ключа идемпотентности.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
idempotencyConflict
{
"message": "The idempotency key is already used with a different payload.",
"error": "IDEMPOTENCY_KEY_CONFLICT"
}
422 Ошибка валидации
ValidationError
Ошибка валидации.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The given data was invalid." |
|||
error |
нет | string |
"VALIDATION_ERROR" |
|||
errors |
да | object |
{"warehouse_id":["The selected warehouse is invalid."]} |
Примеры ответа
validationError
{
"message": "The given data was invalid.",
"error": "VALIDATION_ERROR",
"errors": {
"warehouse_id": [
"The selected warehouse is invalid."
]
}
}
429 Превышен лимит запросов
TooManyRequests
Превышен лимит запросов.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"Too Many Attempts." |
|||
error |
да | string |
"RATE_LIMITED" |
500 Внутренняя ошибка сервера
InternalServerError
Произошла непредвиденная ошибка сервера.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
INTERNAL_SERVER_ERROR
{
"message": "An unexpected server error occurred.",
"error": "INTERNAL_SERVER_ERROR"
}
Export Ozon and Wildberries interaction history for one order
| operationId | getOrderIntegrationEvents |
|---|---|
| Раздел | Заказы |
| Безопасность | bearerAuth |
Streams one JSON document with all retained order-related records, without the UI history limit.
Includes new HTTP attempts, legacy diagnostics and WB inbox versions, latest operation states and the current order payload.
This is not a paginated response. Dates are UTC. Read the complete document and verify export_complete.
coverage.complete is false because historical data may be missing, truncated, masked or expired.
Credentials, contact and marking data are masked. Binary responses contain metadata and SHA256 only. JSON and text responses are not truncated.
Shared bodies are omitted unless all referenced orders are visible. Unknown membership is fail-closed.
Application-internal and external marketplace activity without a captured HTTP call is not guaranteed.
Пример HTTP-запроса (cURL)
Подставьте свой сервер и токен. ID из примера замените реальными доступными ID. Для тела запроса сохраните подходящий JSON из раздела ниже в request.json; перед отправкой замените демонстрационные значения. Заголовок Idempotency-Key использует ключ одной логической операции.
curl --globoff --request GET "${NWMS_BASE_URL}/api/v2/orders/1001/integration-events" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}"Параметры
| Имя | Где | Обязательное | Тип | Style | Explode | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|---|---|
id |
path | да | integer:int64 |
min: 1 | ID заказа. | 1001 |
||
download |
query | нет | boolean |
Return the same JSON as a downloadable attachment. | |
Тело запроса
Тело запроса отсутствует.
Ответы
200 Streamed history. Check export_complete even when HTTP status is 200.
Streamed history. Check export_complete even when HTTP status is 200.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
meta |
да | object |
Schema version, UTC timezone, order/integration identifiers and coverage limitations. | |
||
events |
да | array<object> |
|
|||
events[] |
нет | object |
Source-qualified id, source, provider, account_id, at, HTTP details or snapshot, masked request/response and omission reason. | |
||
event_count |
да | integer |
min: 0 | |
||
export_complete |
да | boolean |
All retained readable sources were exported; not a guarantee of historical coverage. | |
||
export_error |
да | string | null |
journal_read_failed if streaming was interrupted by a storage/read error. | |
401 Требуется аутентификация
Authentication required.
Тело ответа отсутствует.
403 Доступ запрещен
Order/log access denied.
Тело ответа отсутствует.
404 Не найдено
Order not visible or no Ozon/Wildberries link exists.
Тело ответа отсутствует.
Создать заказ
| operationId | createOrdersLines |
|---|---|
| Раздел | Заказы |
| Безопасность | bearerAuth |
Adds one or more product lines to an editable order. Products are resolved by product_id or product_external_id within the caller visible scope.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Пример HTTP-запроса (cURL)
Подставьте свой сервер и токен. ID из примера замените реальными доступными ID. Для тела запроса сохраните подходящий JSON из раздела ниже в request.json; перед отправкой замените демонстрационные значения. Заголовок Idempotency-Key использует ключ одной логической операции.
curl --globoff --request POST "${NWMS_BASE_URL}/api/v2/orders/1001/lines" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}" \
--header "Idempotency-Key: ${NWMS_REQUEST_KEY}" \
--header "Content-Type: application/json" \
--data-binary @request.jsonПараметры
| Имя | Где | Обязательное | Тип | Style | Explode | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|---|---|
id |
path | да | integer:int64 |
min: 1 | ID заказа. | 1001 |
||
Idempotency-Key |
header | нет | string |
maxLength: 191 | Опциональный ключ идемпотентности для write-запросов API v2. Успешные ответы 2xx/3xx повторяются для того же ключа и идентичного payload в течение одного дня. Тот же ключ с другим payload возвращает 409. |
"ord-create-20260714-001" |
Тело запроса
AddOrderLinesRequest обязательно
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
data |
да | object |
|
|||
data.lines |
да | array<OrderLineCreatePayload> |
minItems: 1 | |
||
data.lines[] |
нет | OrderLineCreatePayload |
Payload строки для /orders/{id}/lines. Backend-валидация требует product_id для этого endpoint. |
|
||
data.lines[].product_id |
да | integer:int64 |
min: 1 | 1201 |
||
data.lines[].quantity |
да | number:float |
min: 0.01 | 2 |
||
data.lines[].estimated_price |
нет | number:float | null |
19.5 |
|||
data.lines[].price |
нет | number:float | null |
19.99 |
|||
data.lines[].expiration_date |
нет | string:date | null |
"2027-01-15" |
|||
data.lines[].batch |
нет | string | null |
maxLength: 15 | "LOT-2026" |
||
data.lines[].operation_user_id |
нет | integer:int64 | null |
min: 1 | 9 |
Примеры запроса
default
{
"data": {
"lines": [
{
"product_id": 1201,
"quantity": 2,
"price": 19.99
}
]
}
}
Ответы
201 Created.
Created.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
data |
да | array<OrderLine> |
|
|||
data[] |
нет | OrderLine |
Scalar lot fields use the actual lot only when the full line is picked from one lot; partial/multiple actual lots leave scalars null. Before picking they retain the requested lot. Requested constraints are always available in requested_lot. | |
||
data[].id |
да | integer:int64 |
readOnly | min: 1 | 1001 |
|
data[].created_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data[].updated_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data[].order_id |
нет | integer:int64 | null |
min: 1 | 8101 |
||
data[].product_id |
нет | integer:int64 | null |
min: 1 | 1201 |
||
data[].quantity |
нет | number:float | null |
min: 0 | 2 |
||
data[].estimated_price |
нет | number:float | null |
19.5 |
|||
data[].price |
нет | number:float | null |
19.99 |
|||
data[].expiration_date |
нет | string:date | null |
"2027-01-15" |
|||
data[].batch |
нет | string | null |
maxLength: 15 | "LOT-2026" |
||
data[].operation_user_id |
нет | integer:int64 | null |
min: 1 | 9 |
||
data[].product |
нет | object | null |
|
|||
data[].product.id |
да | integer:int64 |
readOnly | min: 1 | 1201 |
|
data[].product.name |
да | string |
"Coffee 250g" |
|||
data[].product.external_id |
нет | string | null |
"EXT-10045" |
|||
data[].production_date |
нет | string:date | null |
"2026-01-15" |
|||
data[].requested_lot |
нет | WarehouseLot |
|
|||
data[].requested_lot.batch |
да | string | null |
"LOT-2026" |
|||
data[].requested_lot.production_date |
да | string:date | null |
"2026-01-15" |
|||
data[].requested_lot.expiration_date |
да | string:date | null |
"2027-01-15" |
|||
data[].picked_quantity |
нет | number:float |
min: 0 | 2 |
||
data[].fulfillment_lots |
нет | array<OrderFulfillmentLot> |
Current active placed warehouse rows for this exact order line and product. Existing orders are included where these rows survive. This is a current picking snapshot, not a historical shipment event. | |
||
data[].fulfillment_lots[] |
нет | OrderFulfillmentLot |
|
|||
data[].fulfillment_lots[].batch |
да | string | null |
"LOT-2026" |
|||
data[].fulfillment_lots[].production_date |
да | string:date | null |
"2026-01-15" |
|||
data[].fulfillment_lots[].expiration_date |
да | string:date | null |
"2027-01-15" |
|||
data[].fulfillment_lots[].warehouse_id |
да | integer:int64 |
min: 1 | 734 |
||
data[].fulfillment_lots[].product_id |
да | integer:int64 |
min: 1 | 1201 |
||
data[].fulfillment_lots[].quantity |
да | number:float |
min: 0 | 2 |
||
meta |
да | ResponseMeta |
|
|||
meta.api_version |
да | enum |
enum: v2 | "v2" |
||
meta.deleted |
нет | boolean |
true |
|||
meta.id |
нет | integer:int64 | null |
min: 1 | 1001 |
||
meta.command_replayed |
нет | boolean |
True when an idempotent cross-dock command returned the original successful result. | false |
||
meta.crossdock_configuration |
нет | object | null |
|
|||
meta.crossdock_configuration.physical_warehouse_id |
да | integer:int64 |
min: 1 | 42 |
||
meta.crossdock_configuration.enabled |
да | boolean |
true |
|||
meta.crossdock_configuration.process_version |
да | string |
"direct_order_v1" |
Примеры ответа
success
{
"data": [
{
"id": 7001,
"order_id": 8101,
"product_id": 1201,
"quantity": 2,
"estimated_price": 19.5,
"price": 19.99,
"expiration_date": "2027-01-15",
"batch": "LOT-2026",
"operation_user_id": 9,
"product": {
"id": 1201,
"name": "Coffee 250g",
"external_id": "EXT-10045"
},
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
}
],
"meta": {
"api_version": "v2"
}
}
400 Некорректный запрос
BadRequest
Некорректный запрос.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
BAD_REQUEST
{
"message": "Bad request.",
"error": "BAD_REQUEST"
}
401 Требуется аутентификация
Unauthorized
Требуется аутентификация.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
AUTH_REQUIRED
{
"message": "Authentication is required.",
"error": "AUTH_REQUIRED"
}
403 Доступ запрещен
Forbidden
Аутентифицированному аккаунту запрещено выполнять это действие.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
FORBIDDEN
{
"message": "The authenticated account is not allowed to perform this action.",
"error": "FORBIDDEN"
}
404 Не найдено
NotFound
Запрошенный ресурс не найден или находится вне области доступа аккаунта.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
NOT_FOUND
{
"message": "The requested resource was not found or is outside the authenticated account scope.",
"error": "NOT_FOUND"
}
409 Конфликт
Conflict
Запрос конфликтует с текущим состоянием ресурса или ключа идемпотентности.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
idempotencyConflict
{
"message": "The idempotency key is already used with a different payload.",
"error": "IDEMPOTENCY_KEY_CONFLICT"
}
422 Ошибка валидации
ValidationError
Ошибка валидации.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The given data was invalid." |
|||
error |
нет | string |
"VALIDATION_ERROR" |
|||
errors |
да | object |
{"warehouse_id":["The selected warehouse is invalid."]} |
Примеры ответа
validationError
{
"message": "The given data was invalid.",
"error": "VALIDATION_ERROR",
"errors": {
"warehouse_id": [
"The selected warehouse is invalid."
]
}
}
429 Превышен лимит запросов
TooManyRequests
Превышен лимит запросов.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"Too Many Attempts." |
|||
error |
да | string |
"RATE_LIMITED" |
500 Внутренняя ошибка сервера
InternalServerError
Произошла непредвиденная ошибка сервера.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
INTERNAL_SERVER_ERROR
{
"message": "An unexpected server error occurred.",
"error": "INTERNAL_SERVER_ERROR"
}
Обновить заказ
| operationId | replaceOrdersLines |
|---|---|
| Раздел | Заказы |
| Безопасность | bearerAuth |
Update order. Запрос использует описанную payload-схему, проверяет видимость tenant и возвращает нормализованный API envelope.
Текущее поведение backend является legacy-семантикой частичного обновления: пропущенные поля не изменяются.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Пример HTTP-запроса (cURL)
Подставьте свой сервер и токен. ID из примера замените реальными доступными ID. Для тела запроса сохраните подходящий JSON из раздела ниже в request.json; перед отправкой замените демонстрационные значения. Заголовок Idempotency-Key использует ключ одной логической операции.
curl --globoff --request PUT "${NWMS_BASE_URL}/api/v2/orders/1001/lines/1001" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}" \
--header "Idempotency-Key: ${NWMS_REQUEST_KEY}" \
--header "Content-Type: application/json" \
--data-binary @request.jsonПараметры
| Имя | Где | Обязательное | Тип | Style | Explode | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|---|---|
id |
path | да | integer:int64 |
min: 1 | ID заказа. | 1001 |
||
lineId |
path | да | integer:int64 |
min: 1 | ID строки документа. | 1001 |
||
Idempotency-Key |
header | нет | string |
maxLength: 191 | Опциональный ключ идемпотентности для write-запросов API v2. Успешные ответы 2xx/3xx повторяются для того же ключа и идентичного payload в течение одного дня. Тот же ключ с другим payload возвращает 409. |
"ord-create-20260714-001" |
Тело запроса
ReplaceOrderLineRequest обязательно
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
data |
да | OrderLineReplacePayload |
Legacy PUT payload строки. Текущий backend обрабатывает PUT как частичное обновление. | |
||
data.quantity |
нет | number:float | null |
min: 0.01 | 2 |
||
data.estimated_price |
нет | number:float | null |
19.5 |
|||
data.price |
нет | number:float | null |
19.99 |
|||
data.expiration_date |
нет | string:date | null |
"2027-01-15" |
|||
data.batch |
нет | string | null |
maxLength: 15 | "LOT-2026" |
||
data.operation_user_id |
нет | integer:int64 | null |
min: 1 | 9 |
Примеры запроса
default
{
"data": {
"quantity": 3,
"batch": "LOT-2026"
}
}
Ответы
200 Successful response.
Successful response.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
data |
да | OrderLine |
Scalar lot fields use the actual lot only when the full line is picked from one lot; partial/multiple actual lots leave scalars null. Before picking they retain the requested lot. Requested constraints are always available in requested_lot. | |
||
data.id |
да | integer:int64 |
readOnly | min: 1 | 1001 |
|
data.created_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.updated_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.order_id |
нет | integer:int64 | null |
min: 1 | 8101 |
||
data.product_id |
нет | integer:int64 | null |
min: 1 | 1201 |
||
data.quantity |
нет | number:float | null |
min: 0 | 2 |
||
data.estimated_price |
нет | number:float | null |
19.5 |
|||
data.price |
нет | number:float | null |
19.99 |
|||
data.expiration_date |
нет | string:date | null |
"2027-01-15" |
|||
data.batch |
нет | string | null |
maxLength: 15 | "LOT-2026" |
||
data.operation_user_id |
нет | integer:int64 | null |
min: 1 | 9 |
||
data.product |
нет | object | null |
|
|||
data.product.id |
да | integer:int64 |
readOnly | min: 1 | 1201 |
|
data.product.name |
да | string |
"Coffee 250g" |
|||
data.product.external_id |
нет | string | null |
"EXT-10045" |
|||
data.production_date |
нет | string:date | null |
"2026-01-15" |
|||
data.requested_lot |
нет | WarehouseLot |
|
|||
data.requested_lot.batch |
да | string | null |
"LOT-2026" |
|||
data.requested_lot.production_date |
да | string:date | null |
"2026-01-15" |
|||
data.requested_lot.expiration_date |
да | string:date | null |
"2027-01-15" |
|||
data.picked_quantity |
нет | number:float |
min: 0 | 2 |
||
data.fulfillment_lots |
нет | array<OrderFulfillmentLot> |
Current active placed warehouse rows for this exact order line and product. Existing orders are included where these rows survive. This is a current picking snapshot, not a historical shipment event. | |
||
data.fulfillment_lots[] |
нет | OrderFulfillmentLot |
|
|||
data.fulfillment_lots[].batch |
да | string | null |
"LOT-2026" |
|||
data.fulfillment_lots[].production_date |
да | string:date | null |
"2026-01-15" |
|||
data.fulfillment_lots[].expiration_date |
да | string:date | null |
"2027-01-15" |
|||
data.fulfillment_lots[].warehouse_id |
да | integer:int64 |
min: 1 | 734 |
||
data.fulfillment_lots[].product_id |
да | integer:int64 |
min: 1 | 1201 |
||
data.fulfillment_lots[].quantity |
да | number:float |
min: 0 | 2 |
||
meta |
да | ResponseMeta |
|
|||
meta.api_version |
да | enum |
enum: v2 | "v2" |
||
meta.deleted |
нет | boolean |
true |
|||
meta.id |
нет | integer:int64 | null |
min: 1 | 1001 |
||
meta.command_replayed |
нет | boolean |
True when an idempotent cross-dock command returned the original successful result. | false |
||
meta.crossdock_configuration |
нет | object | null |
|
|||
meta.crossdock_configuration.physical_warehouse_id |
да | integer:int64 |
min: 1 | 42 |
||
meta.crossdock_configuration.enabled |
да | boolean |
true |
|||
meta.crossdock_configuration.process_version |
да | string |
"direct_order_v1" |
Примеры ответа
success
{
"data": {
"id": 7001,
"order_id": 8101,
"product_id": 1201,
"quantity": 2,
"estimated_price": 19.5,
"price": 19.99,
"expiration_date": "2027-01-15",
"batch": "LOT-2026",
"operation_user_id": 9,
"product": {
"id": 1201,
"name": "Coffee 250g",
"external_id": "EXT-10045"
},
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
},
"meta": {
"api_version": "v2"
}
}
400 Некорректный запрос
BadRequest
Некорректный запрос.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
BAD_REQUEST
{
"message": "Bad request.",
"error": "BAD_REQUEST"
}
401 Требуется аутентификация
Unauthorized
Требуется аутентификация.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
AUTH_REQUIRED
{
"message": "Authentication is required.",
"error": "AUTH_REQUIRED"
}
403 Доступ запрещен
Forbidden
Аутентифицированному аккаунту запрещено выполнять это действие.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
FORBIDDEN
{
"message": "The authenticated account is not allowed to perform this action.",
"error": "FORBIDDEN"
}
404 Не найдено
NotFound
Запрошенный ресурс не найден или находится вне области доступа аккаунта.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
NOT_FOUND
{
"message": "The requested resource was not found or is outside the authenticated account scope.",
"error": "NOT_FOUND"
}
409 Конфликт
Conflict
Запрос конфликтует с текущим состоянием ресурса или ключа идемпотентности.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
idempotencyConflict
{
"message": "The idempotency key is already used with a different payload.",
"error": "IDEMPOTENCY_KEY_CONFLICT"
}
422 Ошибка валидации
ValidationError
Ошибка валидации.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The given data was invalid." |
|||
error |
нет | string |
"VALIDATION_ERROR" |
|||
errors |
да | object |
{"warehouse_id":["The selected warehouse is invalid."]} |
Примеры ответа
validationError
{
"message": "The given data was invalid.",
"error": "VALIDATION_ERROR",
"errors": {
"warehouse_id": [
"The selected warehouse is invalid."
]
}
}
429 Превышен лимит запросов
TooManyRequests
Превышен лимит запросов.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"Too Many Attempts." |
|||
error |
да | string |
"RATE_LIMITED" |
500 Внутренняя ошибка сервера
InternalServerError
Произошла непредвиденная ошибка сервера.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
INTERNAL_SERVER_ERROR
{
"message": "An unexpected server error occurred.",
"error": "INTERNAL_SERVER_ERROR"
}
Обновить заказ
| operationId | patchOrdersLines |
|---|---|
| Раздел | Заказы |
| Безопасность | bearerAuth |
Update order. Запрос использует описанную payload-схему, проверяет видимость tenant и возвращает нормализованный API envelope.
Текущее поведение backend является legacy-семантикой частичного обновления: пропущенные поля не изменяются.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Пример HTTP-запроса (cURL)
Подставьте свой сервер и токен. ID из примера замените реальными доступными ID. Для тела запроса сохраните подходящий JSON из раздела ниже в request.json; перед отправкой замените демонстрационные значения. Заголовок Idempotency-Key использует ключ одной логической операции.
curl --globoff --request PATCH "${NWMS_BASE_URL}/api/v2/orders/1001/lines/1001" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}" \
--header "Idempotency-Key: ${NWMS_REQUEST_KEY}" \
--header "Content-Type: application/json" \
--data-binary @request.jsonПараметры
| Имя | Где | Обязательное | Тип | Style | Explode | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|---|---|
id |
path | да | integer:int64 |
min: 1 | ID заказа. | 1001 |
||
lineId |
path | да | integer:int64 |
min: 1 | ID строки документа. | 1001 |
||
Idempotency-Key |
header | нет | string |
maxLength: 191 | Опциональный ключ идемпотентности для write-запросов API v2. Успешные ответы 2xx/3xx повторяются для того же ключа и идентичного payload в течение одного дня. Тот же ключ с другим payload возвращает 409. |
"ord-create-20260714-001" |
Тело запроса
PatchOrderLineRequest обязательно
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
data |
да | OrderLinePatchPayload |
Редактируемые поля строки заказа. ID строки берется из path и не должен повторяться в body. | |
||
data.quantity |
нет | number:float | null |
min: 0.01 | 2 |
||
data.estimated_price |
нет | number:float | null |
19.5 |
|||
data.price |
нет | number:float | null |
19.99 |
|||
data.expiration_date |
нет | string:date | null |
"2027-01-15" |
|||
data.batch |
нет | string | null |
maxLength: 15 | "LOT-2026" |
||
data.operation_user_id |
нет | integer:int64 | null |
min: 1 | 9 |
Примеры запроса
default
{
"data": {
"quantity": 3
}
}
Ответы
200 Successful response.
Successful response.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
data |
да | OrderLine |
Scalar lot fields use the actual lot only when the full line is picked from one lot; partial/multiple actual lots leave scalars null. Before picking they retain the requested lot. Requested constraints are always available in requested_lot. | |
||
data.id |
да | integer:int64 |
readOnly | min: 1 | 1001 |
|
data.created_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.updated_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.order_id |
нет | integer:int64 | null |
min: 1 | 8101 |
||
data.product_id |
нет | integer:int64 | null |
min: 1 | 1201 |
||
data.quantity |
нет | number:float | null |
min: 0 | 2 |
||
data.estimated_price |
нет | number:float | null |
19.5 |
|||
data.price |
нет | number:float | null |
19.99 |
|||
data.expiration_date |
нет | string:date | null |
"2027-01-15" |
|||
data.batch |
нет | string | null |
maxLength: 15 | "LOT-2026" |
||
data.operation_user_id |
нет | integer:int64 | null |
min: 1 | 9 |
||
data.product |
нет | object | null |
|
|||
data.product.id |
да | integer:int64 |
readOnly | min: 1 | 1201 |
|
data.product.name |
да | string |
"Coffee 250g" |
|||
data.product.external_id |
нет | string | null |
"EXT-10045" |
|||
data.production_date |
нет | string:date | null |
"2026-01-15" |
|||
data.requested_lot |
нет | WarehouseLot |
|
|||
data.requested_lot.batch |
да | string | null |
"LOT-2026" |
|||
data.requested_lot.production_date |
да | string:date | null |
"2026-01-15" |
|||
data.requested_lot.expiration_date |
да | string:date | null |
"2027-01-15" |
|||
data.picked_quantity |
нет | number:float |
min: 0 | 2 |
||
data.fulfillment_lots |
нет | array<OrderFulfillmentLot> |
Current active placed warehouse rows for this exact order line and product. Existing orders are included where these rows survive. This is a current picking snapshot, not a historical shipment event. | |
||
data.fulfillment_lots[] |
нет | OrderFulfillmentLot |
|
|||
data.fulfillment_lots[].batch |
да | string | null |
"LOT-2026" |
|||
data.fulfillment_lots[].production_date |
да | string:date | null |
"2026-01-15" |
|||
data.fulfillment_lots[].expiration_date |
да | string:date | null |
"2027-01-15" |
|||
data.fulfillment_lots[].warehouse_id |
да | integer:int64 |
min: 1 | 734 |
||
data.fulfillment_lots[].product_id |
да | integer:int64 |
min: 1 | 1201 |
||
data.fulfillment_lots[].quantity |
да | number:float |
min: 0 | 2 |
||
meta |
да | ResponseMeta |
|
|||
meta.api_version |
да | enum |
enum: v2 | "v2" |
||
meta.deleted |
нет | boolean |
true |
|||
meta.id |
нет | integer:int64 | null |
min: 1 | 1001 |
||
meta.command_replayed |
нет | boolean |
True when an idempotent cross-dock command returned the original successful result. | false |
||
meta.crossdock_configuration |
нет | object | null |
|
|||
meta.crossdock_configuration.physical_warehouse_id |
да | integer:int64 |
min: 1 | 42 |
||
meta.crossdock_configuration.enabled |
да | boolean |
true |
|||
meta.crossdock_configuration.process_version |
да | string |
"direct_order_v1" |
Примеры ответа
success
{
"data": {
"id": 7001,
"order_id": 8101,
"product_id": 1201,
"quantity": 2,
"estimated_price": 19.5,
"price": 19.99,
"expiration_date": "2027-01-15",
"batch": "LOT-2026",
"operation_user_id": 9,
"product": {
"id": 1201,
"name": "Coffee 250g",
"external_id": "EXT-10045"
},
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
},
"meta": {
"api_version": "v2"
}
}
400 Некорректный запрос
BadRequest
Некорректный запрос.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
BAD_REQUEST
{
"message": "Bad request.",
"error": "BAD_REQUEST"
}
401 Требуется аутентификация
Unauthorized
Требуется аутентификация.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
AUTH_REQUIRED
{
"message": "Authentication is required.",
"error": "AUTH_REQUIRED"
}
403 Доступ запрещен
Forbidden
Аутентифицированному аккаунту запрещено выполнять это действие.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
FORBIDDEN
{
"message": "The authenticated account is not allowed to perform this action.",
"error": "FORBIDDEN"
}
404 Не найдено
NotFound
Запрошенный ресурс не найден или находится вне области доступа аккаунта.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
NOT_FOUND
{
"message": "The requested resource was not found or is outside the authenticated account scope.",
"error": "NOT_FOUND"
}
409 Конфликт
Conflict
Запрос конфликтует с текущим состоянием ресурса или ключа идемпотентности.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
idempotencyConflict
{
"message": "The idempotency key is already used with a different payload.",
"error": "IDEMPOTENCY_KEY_CONFLICT"
}
422 Ошибка валидации
ValidationError
Ошибка валидации.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The given data was invalid." |
|||
error |
нет | string |
"VALIDATION_ERROR" |
|||
errors |
да | object |
{"warehouse_id":["The selected warehouse is invalid."]} |
Примеры ответа
validationError
{
"message": "The given data was invalid.",
"error": "VALIDATION_ERROR",
"errors": {
"warehouse_id": [
"The selected warehouse is invalid."
]
}
}
429 Превышен лимит запросов
TooManyRequests
Превышен лимит запросов.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"Too Many Attempts." |
|||
error |
да | string |
"RATE_LIMITED" |
500 Внутренняя ошибка сервера
InternalServerError
Произошла непредвиденная ошибка сервера.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
INTERNAL_SERVER_ERROR
{
"message": "An unexpected server error occurred.",
"error": "INTERNAL_SERVER_ERROR"
}
Удалить заказ
| operationId | deleteOrdersLines |
|---|---|
| Раздел | Заказы |
| Безопасность | bearerAuth |
Deletes the resource when the authenticated account has permission and the current lifecycle state allows deletion. If deletion is blocked by related records or document state, the API returns a validation error.
Пример HTTP-запроса (cURL)
Подставьте свой сервер и токен. ID из примера замените реальными доступными ID. Для тела запроса сохраните подходящий JSON из раздела ниже в request.json; перед отправкой замените демонстрационные значения. Заголовок Idempotency-Key использует ключ одной логической операции.
curl --globoff --request DELETE "${NWMS_BASE_URL}/api/v2/orders/1001/lines/1001" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}" \
--header "Idempotency-Key: ${NWMS_REQUEST_KEY}"Параметры
| Имя | Где | Обязательное | Тип | Style | Explode | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|---|---|
id |
path | да | integer:int64 |
min: 1 | ID заказа. | 1001 |
||
lineId |
path | да | integer:int64 |
min: 1 | ID строки документа. | 1001 |
||
Idempotency-Key |
header | нет | string |
maxLength: 191 | Опциональный ключ идемпотентности для write-запросов API v2. Успешные ответы 2xx/3xx повторяются для того же ключа и идентичного payload в течение одного дня. Тот же ключ с другим payload возвращает 409. |
"ord-create-20260714-001" |
Тело запроса
Тело запроса отсутствует.
Ответы
200 Successful response.
Successful response.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
data |
да | object | null |
|
|||
meta |
да | object |
|
|||
meta.api_version |
да | enum |
enum: v2 | "v2" |
||
meta.deleted |
да | boolean |
true |
|||
meta.id |
да | integer:int64 |
min: 1 | 1001 |
Примеры ответа
success
{
"data": null,
"meta": {
"api_version": "v2",
"deleted": true,
"id": 1001
}
}
400 Некорректный запрос
BadRequest
Некорректный запрос.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
BAD_REQUEST
{
"message": "Bad request.",
"error": "BAD_REQUEST"
}
401 Требуется аутентификация
Unauthorized
Требуется аутентификация.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
AUTH_REQUIRED
{
"message": "Authentication is required.",
"error": "AUTH_REQUIRED"
}
403 Доступ запрещен
Forbidden
Аутентифицированному аккаунту запрещено выполнять это действие.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
FORBIDDEN
{
"message": "The authenticated account is not allowed to perform this action.",
"error": "FORBIDDEN"
}
404 Не найдено
NotFound
Запрошенный ресурс не найден или находится вне области доступа аккаунта.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
NOT_FOUND
{
"message": "The requested resource was not found or is outside the authenticated account scope.",
"error": "NOT_FOUND"
}
409 Конфликт
Conflict
Запрос конфликтует с текущим состоянием ресурса или ключа идемпотентности.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
idempotencyConflict
{
"message": "The idempotency key is already used with a different payload.",
"error": "IDEMPOTENCY_KEY_CONFLICT"
}
422 Ошибка валидации
ValidationError
Ошибка валидации.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The given data was invalid." |
|||
error |
нет | string |
"VALIDATION_ERROR" |
|||
errors |
да | object |
{"warehouse_id":["The selected warehouse is invalid."]} |
Примеры ответа
validationError
{
"message": "The given data was invalid.",
"error": "VALIDATION_ERROR",
"errors": {
"warehouse_id": [
"The selected warehouse is invalid."
]
}
}
429 Превышен лимит запросов
TooManyRequests
Превышен лимит запросов.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"Too Many Attempts." |
|||
error |
да | string |
"RATE_LIMITED" |
500 Внутренняя ошибка сервера
InternalServerError
Произошла непредвиденная ошибка сервера.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
INTERNAL_SERVER_ERROR
{
"message": "An unexpected server error occurred.",
"error": "INTERNAL_SERVER_ERROR"
}
Создать заказ
| operationId | createOrdersOffers |
|---|---|
| Раздел | Заказы |
| Безопасность | bearerAuth |
Compatibility alias for adding order lines. Prefer /lines in new integrations; behavior and validation are identical.
Этот маршрут /offers является совместимым alias для /lines; в новых интеграциях используйте маршрут /lines.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Пример HTTP-запроса (cURL)
Подставьте свой сервер и токен. ID из примера замените реальными доступными ID. Для тела запроса сохраните подходящий JSON из раздела ниже в request.json; перед отправкой замените демонстрационные значения. Заголовок Idempotency-Key использует ключ одной логической операции.
curl --globoff --request POST "${NWMS_BASE_URL}/api/v2/orders/1001/offers" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}" \
--header "Idempotency-Key: ${NWMS_REQUEST_KEY}" \
--header "Content-Type: application/json" \
--data-binary @request.jsonПараметры
| Имя | Где | Обязательное | Тип | Style | Explode | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|---|---|
id |
path | да | integer:int64 |
min: 1 | ID заказа. | 1001 |
||
Idempotency-Key |
header | нет | string |
maxLength: 191 | Опциональный ключ идемпотентности для write-запросов API v2. Успешные ответы 2xx/3xx повторяются для того же ключа и идентичного payload в течение одного дня. Тот же ключ с другим payload возвращает 409. |
"ord-create-20260714-001" |
Тело запроса
AddOrderLinesRequest обязательно
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
data |
да | object |
|
|||
data.lines |
да | array<OrderLineCreatePayload> |
minItems: 1 | |
||
data.lines[] |
нет | OrderLineCreatePayload |
Payload строки для /orders/{id}/lines. Backend-валидация требует product_id для этого endpoint. |
|
||
data.lines[].product_id |
да | integer:int64 |
min: 1 | 1201 |
||
data.lines[].quantity |
да | number:float |
min: 0.01 | 2 |
||
data.lines[].estimated_price |
нет | number:float | null |
19.5 |
|||
data.lines[].price |
нет | number:float | null |
19.99 |
|||
data.lines[].expiration_date |
нет | string:date | null |
"2027-01-15" |
|||
data.lines[].batch |
нет | string | null |
maxLength: 15 | "LOT-2026" |
||
data.lines[].operation_user_id |
нет | integer:int64 | null |
min: 1 | 9 |
Примеры запроса
default
{
"data": {
"lines": [
{
"product_id": 1201,
"quantity": 2,
"price": 19.99
}
]
}
}
Ответы
201 Created.
Created.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
data |
да | array<OrderLine> |
|
|||
data[] |
нет | OrderLine |
Scalar lot fields use the actual lot only when the full line is picked from one lot; partial/multiple actual lots leave scalars null. Before picking they retain the requested lot. Requested constraints are always available in requested_lot. | |
||
data[].id |
да | integer:int64 |
readOnly | min: 1 | 1001 |
|
data[].created_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data[].updated_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data[].order_id |
нет | integer:int64 | null |
min: 1 | 8101 |
||
data[].product_id |
нет | integer:int64 | null |
min: 1 | 1201 |
||
data[].quantity |
нет | number:float | null |
min: 0 | 2 |
||
data[].estimated_price |
нет | number:float | null |
19.5 |
|||
data[].price |
нет | number:float | null |
19.99 |
|||
data[].expiration_date |
нет | string:date | null |
"2027-01-15" |
|||
data[].batch |
нет | string | null |
maxLength: 15 | "LOT-2026" |
||
data[].operation_user_id |
нет | integer:int64 | null |
min: 1 | 9 |
||
data[].product |
нет | object | null |
|
|||
data[].product.id |
да | integer:int64 |
readOnly | min: 1 | 1201 |
|
data[].product.name |
да | string |
"Coffee 250g" |
|||
data[].product.external_id |
нет | string | null |
"EXT-10045" |
|||
data[].production_date |
нет | string:date | null |
"2026-01-15" |
|||
data[].requested_lot |
нет | WarehouseLot |
|
|||
data[].requested_lot.batch |
да | string | null |
"LOT-2026" |
|||
data[].requested_lot.production_date |
да | string:date | null |
"2026-01-15" |
|||
data[].requested_lot.expiration_date |
да | string:date | null |
"2027-01-15" |
|||
data[].picked_quantity |
нет | number:float |
min: 0 | 2 |
||
data[].fulfillment_lots |
нет | array<OrderFulfillmentLot> |
Current active placed warehouse rows for this exact order line and product. Existing orders are included where these rows survive. This is a current picking snapshot, not a historical shipment event. | |
||
data[].fulfillment_lots[] |
нет | OrderFulfillmentLot |
|
|||
data[].fulfillment_lots[].batch |
да | string | null |
"LOT-2026" |
|||
data[].fulfillment_lots[].production_date |
да | string:date | null |
"2026-01-15" |
|||
data[].fulfillment_lots[].expiration_date |
да | string:date | null |
"2027-01-15" |
|||
data[].fulfillment_lots[].warehouse_id |
да | integer:int64 |
min: 1 | 734 |
||
data[].fulfillment_lots[].product_id |
да | integer:int64 |
min: 1 | 1201 |
||
data[].fulfillment_lots[].quantity |
да | number:float |
min: 0 | 2 |
||
meta |
да | ResponseMeta |
|
|||
meta.api_version |
да | enum |
enum: v2 | "v2" |
||
meta.deleted |
нет | boolean |
true |
|||
meta.id |
нет | integer:int64 | null |
min: 1 | 1001 |
||
meta.command_replayed |
нет | boolean |
True when an idempotent cross-dock command returned the original successful result. | false |
||
meta.crossdock_configuration |
нет | object | null |
|
|||
meta.crossdock_configuration.physical_warehouse_id |
да | integer:int64 |
min: 1 | 42 |
||
meta.crossdock_configuration.enabled |
да | boolean |
true |
|||
meta.crossdock_configuration.process_version |
да | string |
"direct_order_v1" |
Примеры ответа
success
{
"data": [
{
"id": 7001,
"order_id": 8101,
"product_id": 1201,
"quantity": 2,
"estimated_price": 19.5,
"price": 19.99,
"expiration_date": "2027-01-15",
"batch": "LOT-2026",
"operation_user_id": 9,
"product": {
"id": 1201,
"name": "Coffee 250g",
"external_id": "EXT-10045"
},
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
}
],
"meta": {
"api_version": "v2"
}
}
400 Некорректный запрос
BadRequest
Некорректный запрос.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
BAD_REQUEST
{
"message": "Bad request.",
"error": "BAD_REQUEST"
}
401 Требуется аутентификация
Unauthorized
Требуется аутентификация.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
AUTH_REQUIRED
{
"message": "Authentication is required.",
"error": "AUTH_REQUIRED"
}
403 Доступ запрещен
Forbidden
Аутентифицированному аккаунту запрещено выполнять это действие.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
FORBIDDEN
{
"message": "The authenticated account is not allowed to perform this action.",
"error": "FORBIDDEN"
}
404 Не найдено
NotFound
Запрошенный ресурс не найден или находится вне области доступа аккаунта.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
NOT_FOUND
{
"message": "The requested resource was not found or is outside the authenticated account scope.",
"error": "NOT_FOUND"
}
409 Конфликт
Conflict
Запрос конфликтует с текущим состоянием ресурса или ключа идемпотентности.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
idempotencyConflict
{
"message": "The idempotency key is already used with a different payload.",
"error": "IDEMPOTENCY_KEY_CONFLICT"
}
422 Ошибка валидации
ValidationError
Ошибка валидации.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The given data was invalid." |
|||
error |
нет | string |
"VALIDATION_ERROR" |
|||
errors |
да | object |
{"warehouse_id":["The selected warehouse is invalid."]} |
Примеры ответа
validationError
{
"message": "The given data was invalid.",
"error": "VALIDATION_ERROR",
"errors": {
"warehouse_id": [
"The selected warehouse is invalid."
]
}
}
429 Превышен лимит запросов
TooManyRequests
Превышен лимит запросов.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"Too Many Attempts." |
|||
error |
да | string |
"RATE_LIMITED" |
500 Внутренняя ошибка сервера
InternalServerError
Произошла непредвиденная ошибка сервера.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
INTERNAL_SERVER_ERROR
{
"message": "An unexpected server error occurred.",
"error": "INTERNAL_SERVER_ERROR"
}
Обновить заказ
| operationId | replaceOrdersOffers |
|---|---|
| Раздел | Заказы |
| Безопасность | bearerAuth |
Update order. Запрос использует описанную payload-схему, проверяет видимость tenant и возвращает нормализованный API envelope.
Этот маршрут /offers является совместимым alias для /lines; в новых интеграциях используйте маршрут /lines.
Текущее поведение backend является legacy-семантикой частичного обновления: пропущенные поля не изменяются.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Order offers include actual fulfillment_lots and production_date. Request include=consumables on the order list for current consumable lines; order details include them by default. These snapshots are not historical event feeds.
Пример HTTP-запроса (cURL)
Подставьте свой сервер и токен. ID из примера замените реальными доступными ID. Для тела запроса сохраните подходящий JSON из раздела ниже в request.json; перед отправкой замените демонстрационные значения. Заголовок Idempotency-Key использует ключ одной логической операции.
curl --globoff --request PUT "${NWMS_BASE_URL}/api/v2/orders/1001/offers/1001" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}" \
--header "Idempotency-Key: ${NWMS_REQUEST_KEY}" \
--header "Content-Type: application/json" \
--data-binary @request.jsonПараметры
| Имя | Где | Обязательное | Тип | Style | Explode | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|---|---|
id |
path | да | integer:int64 |
min: 1 | ID заказа. | 1001 |
||
lineId |
path | да | integer:int64 |
min: 1 | ID строки документа. | 1001 |
||
Idempotency-Key |
header | нет | string |
maxLength: 191 | Опциональный ключ идемпотентности для write-запросов API v2. Успешные ответы 2xx/3xx повторяются для того же ключа и идентичного payload в течение одного дня. Тот же ключ с другим payload возвращает 409. |
"ord-create-20260714-001" |
Тело запроса
ReplaceOrderLineRequest обязательно
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
data |
да | OrderLineReplacePayload |
Legacy PUT payload строки. Текущий backend обрабатывает PUT как частичное обновление. | |
||
data.quantity |
нет | number:float | null |
min: 0.01 | 2 |
||
data.estimated_price |
нет | number:float | null |
19.5 |
|||
data.price |
нет | number:float | null |
19.99 |
|||
data.expiration_date |
нет | string:date | null |
"2027-01-15" |
|||
data.batch |
нет | string | null |
maxLength: 15 | "LOT-2026" |
||
data.operation_user_id |
нет | integer:int64 | null |
min: 1 | 9 |
Примеры запроса
default
{
"data": {
"quantity": 3,
"batch": "LOT-2026"
}
}
Ответы
200 Successful response.
Successful response.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
data |
да | OrderLine |
Scalar lot fields use the actual lot only when the full line is picked from one lot; partial/multiple actual lots leave scalars null. Before picking they retain the requested lot. Requested constraints are always available in requested_lot. | |
||
data.id |
да | integer:int64 |
readOnly | min: 1 | 1001 |
|
data.created_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.updated_at |
нет | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.order_id |
нет | integer:int64 | null |
min: 1 | 8101 |
||
data.product_id |
нет | integer:int64 | null |
min: 1 | 1201 |
||
data.quantity |
нет | number:float | null |
min: 0 | 2 |
||
data.estimated_price |
нет | number:float | null |
19.5 |
|||
data.price |
нет | number:float | null |
19.99 |
|||
data.expiration_date |
нет | string:date | null |
"2027-01-15" |
|||
data.batch |
нет | string | null |
maxLength: 15 | "LOT-2026" |
||
data.operation_user_id |
нет | integer:int64 | null |
min: 1 | 9 |
||
data.product |
нет | object | null |
|
|||
data.product.id |
да | integer:int64 |
readOnly | min: 1 | 1201 |
|
data.product.name |
да | string |
"Coffee 250g" |
|||
data.product.external_id |
нет | string | null |
"EXT-10045" |
|||
data.production_date |
нет | string:date | null |
"2026-01-15" |
|||
data.requested_lot |
нет | WarehouseLot |
|
|||
data.requested_lot.batch |
да | string | null |
"LOT-2026" |
|||
data.requested_lot.production_date |
да | string:date | null |
"2026-01-15" |
|||
data.requested_lot.expiration_date |
да | string:date | null |
"2027-01-15" |
|||
data.picked_quantity |
нет | number:float |
min: 0 | 2 |
||
data.fulfillment_lots |
нет | array<OrderFulfillmentLot> |
Current active placed warehouse rows for this exact order line and product. Existing orders are included where these rows survive. This is a current picking snapshot, not a historical shipment event. | |
||
data.fulfillment_lots[] |
нет | OrderFulfillmentLot |
|
|||
data.fulfillment_lots[].batch |
да | string | null |
"LOT-2026" |
|||
data.fulfillment_lots[].production_date |
да | string:date | null |
"2026-01-15" |
|||
data.fulfillment_lots[].expiration_date |
да | string:date | null |
"2027-01-15" |
|||
data.fulfillment_lots[].warehouse_id |
да | integer:int64 |
min: 1 | 734 |
||
data.fulfillment_lots[].product_id |
да | integer:int64 |
min: 1 | 1201 |
||
data.fulfillment_lots[].quantity |
да | number:float |
min: 0 | 2 |
||
meta |
да | ResponseMeta |
|
|||
meta.api_version |
да | enum |
enum: v2 | "v2" |
||
meta.deleted |
нет | boolean |
true |
|||
meta.id |
нет | integer:int64 | null |
min: 1 | 1001 |
||
meta.command_replayed |
нет | boolean |
True when an idempotent cross-dock command returned the original successful result. | false |
||
meta.crossdock_configuration |
нет | object | null |
|
|||
meta.crossdock_configuration.physical_warehouse_id |
да | integer:int64 |
min: 1 | 42 |
||
meta.crossdock_configuration.enabled |
да | boolean |
true |
|||
meta.crossdock_configuration.process_version |
да | string |
"direct_order_v1" |
Примеры ответа
success
{
"data": {
"id": 7001,
"order_id": 8101,
"product_id": 1201,
"quantity": 2,
"estimated_price": 19.5,
"price": 19.99,
"expiration_date": "2027-01-15",
"batch": "LOT-2026",
"operation_user_id": 9,
"product": {
"id": 1201,
"name": "Coffee 250g",
"external_id": "EXT-10045"
},
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
},
"meta": {
"api_version": "v2"
}
}
400 Некорректный запрос
BadRequest
Некорректный запрос.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
BAD_REQUEST
{
"message": "Bad request.",
"error": "BAD_REQUEST"
}
401 Требуется аутентификация
Unauthorized
Требуется аутентификация.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
AUTH_REQUIRED
{
"message": "Authentication is required.",
"error": "AUTH_REQUIRED"
}
403 Доступ запрещен
Forbidden
Аутентифицированному аккаунту запрещено выполнять это действие.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
FORBIDDEN
{
"message": "The authenticated account is not allowed to perform this action.",
"error": "FORBIDDEN"
}
404 Не найдено
NotFound
Запрошенный ресурс не найден или находится вне области доступа аккаунта.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
NOT_FOUND
{
"message": "The requested resource was not found or is outside the authenticated account scope.",
"error": "NOT_FOUND"
}
409 Конфликт
Conflict
Запрос конфликтует с текущим состоянием ресурса или ключа идемпотентности.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
idempotencyConflict
{
"message": "The idempotency key is already used with a different payload.",
"error": "IDEMPOTENCY_KEY_CONFLICT"
}
422 Ошибка валидации
ValidationError
Ошибка валидации.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The given data was invalid." |
|||
error |
нет | string |
"VALIDATION_ERROR" |
|||
errors |
да | object |
{"warehouse_id":["The selected warehouse is invalid."]} |
Примеры ответа
validationError
{
"message": "The given data was invalid.",
"error": "VALIDATION_ERROR",
"errors": {
"warehouse_id": [
"The selected warehouse is invalid."
]
}
}
429 Превышен лимит запросов
TooManyRequests
Превышен лимит запросов.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"Too Many Attempts." |
|||
error |
да | string |
"RATE_LIMITED" |
500 Внутренняя ошибка сервера
InternalServerError
Произошла непредвиденная ошибка сервера.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
INTERNAL_SERVER_ERROR
{
"message": "An unexpected server error occurred.",
"error": "INTERNAL_SERVER_ERROR"
}
Удалить заказ
| operationId | deleteOrdersOffers |
|---|---|
| Раздел | Заказы |
| Безопасность | bearerAuth |
Deletes the resource when the authenticated account has permission and the current lifecycle state allows deletion. If deletion is blocked by related records or document state, the API returns a validation error.
Этот маршрут /offers является совместимым alias для /lines; в новых интеграциях используйте маршрут /lines.
Пример HTTP-запроса (cURL)
Подставьте свой сервер и токен. ID из примера замените реальными доступными ID. Для тела запроса сохраните подходящий JSON из раздела ниже в request.json; перед отправкой замените демонстрационные значения. Заголовок Idempotency-Key использует ключ одной логической операции.
curl --globoff --request DELETE "${NWMS_BASE_URL}/api/v2/orders/1001/offers/1001" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}" \
--header "Idempotency-Key: ${NWMS_REQUEST_KEY}"Параметры
| Имя | Где | Обязательное | Тип | Style | Explode | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|---|---|
id |
path | да | integer:int64 |
min: 1 | ID заказа. | 1001 |
||
lineId |
path | да | integer:int64 |
min: 1 | ID строки документа. | 1001 |
||
Idempotency-Key |
header | нет | string |
maxLength: 191 | Опциональный ключ идемпотентности для write-запросов API v2. Успешные ответы 2xx/3xx повторяются для того же ключа и идентичного payload в течение одного дня. Тот же ключ с другим payload возвращает 409. |
"ord-create-20260714-001" |
Тело запроса
Тело запроса отсутствует.
Ответы
200 Successful response.
Successful response.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
data |
да | object | null |
|
|||
meta |
да | object |
|
|||
meta.api_version |
да | enum |
enum: v2 | "v2" |
||
meta.deleted |
да | boolean |
true |
|||
meta.id |
да | integer:int64 |
min: 1 | 1001 |
Примеры ответа
success
{
"data": null,
"meta": {
"api_version": "v2",
"deleted": true,
"id": 1001
}
}
400 Некорректный запрос
BadRequest
Некорректный запрос.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
BAD_REQUEST
{
"message": "Bad request.",
"error": "BAD_REQUEST"
}
401 Требуется аутентификация
Unauthorized
Требуется аутентификация.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
AUTH_REQUIRED
{
"message": "Authentication is required.",
"error": "AUTH_REQUIRED"
}
403 Доступ запрещен
Forbidden
Аутентифицированному аккаунту запрещено выполнять это действие.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
FORBIDDEN
{
"message": "The authenticated account is not allowed to perform this action.",
"error": "FORBIDDEN"
}
404 Не найдено
NotFound
Запрошенный ресурс не найден или находится вне области доступа аккаунта.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
NOT_FOUND
{
"message": "The requested resource was not found or is outside the authenticated account scope.",
"error": "NOT_FOUND"
}
409 Конфликт
Conflict
Запрос конфликтует с текущим состоянием ресурса или ключа идемпотентности.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
idempotencyConflict
{
"message": "The idempotency key is already used with a different payload.",
"error": "IDEMPOTENCY_KEY_CONFLICT"
}
422 Ошибка валидации
ValidationError
Ошибка валидации.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The given data was invalid." |
|||
error |
нет | string |
"VALIDATION_ERROR" |
|||
errors |
да | object |
{"warehouse_id":["The selected warehouse is invalid."]} |
Примеры ответа
validationError
{
"message": "The given data was invalid.",
"error": "VALIDATION_ERROR",
"errors": {
"warehouse_id": [
"The selected warehouse is invalid."
]
}
}
429 Превышен лимит запросов
TooManyRequests
Превышен лимит запросов.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"Too Many Attempts." |
|||
error |
да | string |
"RATE_LIMITED" |
500 Внутренняя ошибка сервера
InternalServerError
Произошла непредвиденная ошибка сервера.
| Поле | Обязательное | Тип | Флаги | Ограничения | Описание | Пример |
|---|---|---|---|---|---|---|
message |
да | string |
"The request could not be processed." |
|||
error |
да | string |
"BAD_REQUEST" |
Примеры ответа
INTERNAL_SERVER_ERROR
{
"message": "An unexpected server error occurred.",
"error": "INTERNAL_SERVER_ERROR"
}