Перейти к содержимому

Работа с заказами

Заказы — основной канал обмена с CRM, ERP и собственным сервисом: чтение, создание из проценки или каталога, смена статусов, meta (ID сделки), архив.

Базовый путь: /api/integrations/v1/orders
Авторизация: ключ и права · обозначения

Перед созданием обычно нужны:

Сценарий для CRM

  1. GET /orders?since=… (или webhook модуля) — новые/изменённые заказы.
  2. В CRM сохраните id заказа PlatParts.
  3. POST /orders/{id}/meta — запишите свой ID сделки: { "meta": { "crm_deal_id": "…" } }.
  4. При смене этапа в CRM — POST /orders/{id}/status с status_code магазина.
  5. Документы: external-ref.

Права минимум: orders.read, orders.write_status, orders.write_meta.

Суммы и цены

В теле создания (items.*.price, price_purchase)копейки (150000 = 1500 ₽)
В snapshot ответа (items[].price, total_price, total)рубли

Список заказов

GET /orders — право orders.read

QueryТипОписание
pickup_point_idintФильтр по точке (если у ключа точка — только она)
sincedatetimeupdated_at ≥ значения
status_codestringНапример order.created
per_pageint1–100, по умолчанию 50
cursorstringКурсор следующей страницы

Без права orders.read_archived архивные заказы в списке не показываются.

bash
curl -sS "https://ВАШ_ДОМЕН/api/integrations/v1/orders?per_page=50&status_code=order.created" \
 -H "Authorization: Bearer pp_abc123:ВАШ_СЕКРЕТ" \
 -H "Accept: application/json"
json
{
 "data": [
 {
 "id": 42,
 "user_id": 10,
 "pickup_point_id": 1,
 "status_id": 1,
 "status_code": "order.created",
 "status_semantic": "CREATED",
 "status_name": "Новый",
 "status_locked": false,
 "comment": "из внешней системы",
 "customer_name": "Иванов Иван",
 "total_price": 3000,
 "total": 3000,
 "items": [
 {
 "id": 1,
 "product_name": "Колодки",
 "quantity": 2,
 "price": 1500,
 "status_code": "item.created",
 "status_name": "Новая"
 }
 ],
 "archived_at": null,
 "created_at": "2026-07-15T14:22:00+03:00",
 "updated_at": "2026-07-15T14:22:00+03:00"
 }
 ],
 "per_page": 50,
 "next_cursor": null,
 "path": "https://ВАШ_ДОМЕН/api/integrations/v1/orders"
}

Карточка заказа

GET /orders/{id}orders.read

HTTPКогда
404Нет заказа / чужая точка / скрыт из API по id
403Ключ привязан к другой точке

Ответ — тот же snapshot, что элемент списка.


Создать заказ

POST /ordersorders.write201

Тело запроса

ПолеТипОбяз.Описание
user_idint|nullнетСуществующий пользователь
pickup_point_idintдаТочка выдачи
delivery_methodintдаid модуля доставки (GET /modulesdelivery)
payment_methodintдаid модуля оплаты (payment)
delivery_dataobjectнетJSON данных доставки
payment_dataobjectнетJSON данных оплаты
commentstring≤5000нетКомментарий
guest_surname / guest_namestringнетГость
guest_phonestringнетГость
itemsarray≥1даПозиции

Позиция items[]

ПолеТипОбяз.Описание
typestringнетstorage / catalog = из каталога; иначе поставщик (manufacturer)
product_idintдля каталогаId товара
storage_idintдаСклад / поставщик
quantityint≥1даКоличество
priceint≥0нетЦена продажи, копейки
price_purchaseint≥0нетЗакупка, копейки (для поставщика)
brand / article / namestringнетДля позиции из проценки
payloadobjectнетДоп. данные
commentstringнетКомментарий позиции
bash
curl -sS -X POST "https://ВАШ_ДОМЕН/api/integrations/v1/orders" \
 -H "Authorization: Bearer pp_abc123:ВАШ_СЕКРЕТ" \
 -H "Content-Type: application/json" \
 -H "Accept: application/json" \
 -d '{
 "user_id": 10,
 "pickup_point_id": 1,
 "delivery_method": 2,
 "payment_method": 3,
 "comment": "из CRM",
 "items": [
 {
 "type": "manufacturer",
 "storage_id": 5,
 "quantity": 2,
 "price": 150000,
 "price_purchase": 100000,
 "brand": "BOSCH",
 "article": "0986AB1234",
 "name": "Колодки"
 }
 ]
 }'
json
{
 "ok": true,
 "order": {
 "id": 42,
 "user_id": 10,
 "pickup_point_id": 1,
 "status_code": "order.created",
 "status_name": "Новый",
 "total_price": 3000,
 "total": 3000,
 "items": [
 {
 "id": 1,
 "product_name": "Колодки",
 "quantity": 2,
 "price": 1500
 }
 ],
 "created_at": "2026-07-15T14:22:00+03:00"
 }
}

Позиция из каталога наличия:

json
{
 "type": "storage",
 "product_id": 100,
 "storage_id": 7,
 "quantity": 1,
 "price": 20000
}
HTTPКогда
422Не настроен статус CREATED; неверный/неактивный модуль оплаты/доставки; позиция недоступна
403pickup_point_id не совпадает с точкой ключа

Изменить поля

PATCH /orders/{id}orders.write

Тело (все поля необязательны): comment, delivery_data, payment_data.

Статус этим методом не меняется — см. ниже.

200: { "ok": true, "order": { ... } }


Сменить статус заказа

Сначала получите доступные статусы: Статусы (GET /statuses/orders).
POST /orders/{id}/statusorders.write_status

Тело: либо status_id, либо status_code (один обязателен). Произвольное название не принимается.

bash
curl -sS -X POST "https://ВАШ_ДОМЕН/api/integrations/v1/orders/42/status" \
 -H "Authorization: Bearer pp_abc123:ВАШ_СЕКРЕТ" \
 -H "Content-Type: application/json" \
 -d '{"status_id":5}'
json
{
 "ok": true,
 "unchanged": false,
 "order_id": 42,
 "status_id": 5,
 "status_code": "order.in_progress",
 "status_semantic": "IN_PROGRESS",
 "order": {
 "id": 42,
 "status_code": "order.in_progress",
 "previous_status_code": "order.created",
 "previous_status_name": "Новый"
 }
}

404 — неизвестный статус.


Позиции заказа

Позиции можно читать, создавать, менять, удалять и менять статус. Сначала смотрите состав в GET /orders/{id} или карточку позиции — чтобы править существующую строку, а не плодить дубли.

МетодURLПраво
GET/orders/{orderId}/items/{itemId}orders.read
POST/orders/{orderId}/itemsorder_items.write
PATCH/orders/{orderId}/items/{itemId}order_items.write
DELETE/orders/{orderId}/items/{itemId}order_items.delete
POST/orders/{orderId}/items/{itemId}/statusorders.write_status
POST/orders/{orderId}/items/{itemId}/archiveorder_items.archive
POST/orders/{orderId}/items/{itemId}/unarchiveorder_items.unarchive

Добавить позицию

POST /orders/{orderId}/items — те же поля, что элемент items[] при создании заказа: storage_id и quantity обязательны; для каталога — type: storage + product_id. Цены в копейках.

bash
curl -sS -X POST "https://ВАШ_ДОМЕН/api/integrations/v1/orders/42/items" \
 -H "Authorization: Bearer pp_abc123:ВАШ_СЕКРЕТ" \
 -H "Content-Type: application/json" \
 -d '{"type":"storage","product_id":100,"storage_id":7,"quantity":1,"price":20000}'

201: { "ok": true, "item": { ... } }

Изменить позицию

PATCH /orders/{orderId}/items/{itemId} — опционально: quantity, price, price_purchase, comment, payload (merge). Статус этим методом не меняется.

Удалить позицию

DELETE /orders/{orderId}/items/{itemId} — жёсткое удаление строки (не архив). Архивные позиции сначала разархивируйте.

Статус позиции

Справочник: GET /statuses/order-items.
Тело: { "status_id": ... } или { "status_code": "..." }.


Meta, архив, удаление

МетодURLПравоТело
POST/orders/{id}/metaorders.write_meta{ "meta": { "crm_id": "CRM-9912" } }
POST/orders/{id}/archiveorders.archive
POST/orders/{id}/unarchiveorders.unarchive
DELETE/orders/{id}orders.delete

Meta мержится в namespace ключа (или заголовок X-Integration-Namespace).

bash
curl -sS -X POST "https://ВАШ_ДОМЕН/api/integrations/v1/orders/42/meta" \
 -H "Authorization: Bearer pp_abc123:ВАШ_СЕКРЕТ" \
 -H "Content-Type: application/json" \
 -d '{"meta":{"crm_id":"CRM-9912"}}'

Ответ удаления: { "ok": true, "deleted": true, "order_id": 42 }.


Дальше

База знаний для EMS-платформы PlatParts.