Производство

Очередь и приёмка

Как устроен производственный контур целиком — в разделе «Как устроено».

Производственный контур живёт отдельно от остального API: свой префикс пути, свой ключ и своя логика доступа. Ключ выдаётся производственной площадке и жёстко привязан к одному бренду — подставить другой нельзя ни заголовком, ни параметром.

GET/production-api/me

Проверить ключ

Возвращает площадку, которой принадлежит ключ. Первый запрос при настройке.

Доступ:Ключ площадки

Признак «основная площадка» важен: основная дополнительно получает товары, не закреплённые ни за одной площадкой.

ответ
{
  "facility": { "id": 3, "name": "Основной цех", "is_default": true }
}

Ошибки

КодОтвет сервераКогда возникаетЧто делать
401{"error":"Missing Authorization: Bearer <apiKey>"}Заголовка нет или он не в том виде.Добавьте заголовок с ключом площадки.
401{"error":"Invalid or inactive API key"}Ключ неизвестен или площадка выключена.После выключения площадки старый ключ может отвечать ещё до 30 секунд.
GET/production-api/queue

Очередь на изготовление

Что и в каком количестве нужно произвести прямо сейчас.

Доступ:Ключ площадки

Очередь нигде не хранится — она считается на лету из текущих остатков, порога и размера партии. Поэтому она всегда актуальна, но и меняется от запроса к запросу: продали вещь — позиция появилась в очереди.

curl -s https://api.amarix.ru/production-api/queue \
  -H "Authorization: Bearer $КЛЮЧ_ПЛОЩАДКИ"

Поля ответа

ПолеТипОписание
quantity_to_producenumberСколько штук изготовить.
stocknumberОстаток за вычетом резервов. Отрицательное значение означает нехватку под уже принятые заказы.
thresholdnumberПорог, ниже которого позиция попадает в очередь.
batch_sizenumberРазмер партии.
on_demandbooleanПозиция шьётся под заказ, а не на склад.
link_onlybooleanТовар доступен только по прямой ссылке — такие товары обходят фильтр по размеру партии, см. note ниже.
chestny_znakstring | nullКод маркировки размера.
size_idnumber | nullЛегаси-идентификатор размера — null у товара без исторического «Размера» (заведён только на других атрибутах). Используйте его для сверки с приёмкой, если ещё не перешли на variant_id.
variant_idnumberИдентификатор варианта (система атрибутов) — рекомендуемый способ адресации вместо product_id+size/size_id, однозначно определяет комбинацию атрибутов.
attributesarray{ name, value }[] — атрибуты и их значения этой позиции (например Размер, Цвет).
soldoutbooleanПозиция помечена как распроданная.
ответ
{
  "facility": { "id": 3, "name": "Основной цех", "is_default": true },
  "count": 2,
  "items": [
    {
      "product_id": 341,
      "variant_id": 2214,
      "product_name": "Футболка «Пример» чёрная",
      "product_slug": "futbolka-primer-chernaya",
      "brand_code": "ваш-магазин",
      "chestny_znak": "04600000000017",
      "size": "M",
      "size_id": 1923,
      "attributes": [{ "name": "Размер", "value": "M" }],
      "quantity_to_produce": 5,
      "batch_size": 5,
      "stock": 1,
      "threshold": 2,
      "on_demand": false,
      "link_only": false,
      "soldout": false
    },
    {
      "product_id": 342,
      "variant_id": 2340,
      "product_name": "Футболка Graphic",
      "product_slug": "tee-graphic",
      "brand_code": "ваш-магазин",
      "chestny_znak": null,
      "size": "Жёлтый / L",
      "size_id": null,
      "attributes": [{ "name": "Цвет", "value": "Жёлтый" }, { "name": "Размер", "value": "L" }],
      "quantity_to_produce": 3,
      "batch_size": 1,
      "stock": -3,
      "threshold": 0,
      "on_demand": true,
      "link_only": false,
      "soldout": false
    }
  ]
}

Ошибки

КодОтвет сервераКогда возникаетЧто делать
401{"error":"Invalid or inactive API key"}Ключ неизвестен или площадка выключена.—
500{"error":"Internal error"}Непредвиденная ошибка на сервере.—
GET/production-api/products

Каталог бренда

Справочник товаров с размерами, остатками и настройками производства.

Доступ:Ключ площадки

В отличие от очереди отдаёт все товары, а не только те, что надо шить. Нужен для поиска, карточки товара и сопоставления позиций в вашем приложении.

Параметры запроса

ПараметрТипОбязателенОписание
all1 | true | yesнетВсе товары бренда, а не только закреплённые за вашей площадкой.

Поля ответа

ПолеТипОписание
pricenumberЦена товара.в копейках
sizes[].stocknumberФизический остаток на складе.
sizes[].stock_availablenumberОстаток за вычетом резервов.
sizes[].reservednumberЗакреплено за заказами.
sizes[].size_idnumber | nullЛегаси-идентификатор размера. null у товара без исторического «Размера».
sizes[].variant_idnumberИдентификатор варианта — рекомендуемый способ, сопоставляйте по нему с очередью.
sizes[].attributesarray{ name, value }[] — атрибуты и их значения этого варианта.

Ошибки

КодОтвет сервераКогда возникаетЧто делать
401{"error":"Invalid or inactive API key"}Ключ неизвестен.—
500{"error":"Internal error"}Непредвиденная ошибка на сервере.—
GET/production-api/products/{id}

Один товар

Тот же объект, что в каталоге, но без обёртки.

Доступ:Ключ площадки

Параметры пути

ПараметрТипОбязателенОписание
idnumberдаИдентификатор товара.
ответ
{
  "product_id": 341,
  "product_name": "Футболка Basic",
  "product_slug": "futbolka-basic",
  "brand_code": "acme",
  "category": "Футболки",
  "price": 199000,
  "material": "Хлопок",
  "care": "Стирка 30°",
  "production_time_days": 3,
  "on_demand": false,
  "soldout": false,
  "images": ["https://cdn.amarix.ru/products/341/1.jpg"],
  "production_facility_id": 2,
  "sizes": [
    {
      "size_id": 45,
      "variant_id": 2214,
      "size": "M",
      "attributes": [{ "name": "Размер", "value": "M" }],
      "chestny_znak": null,
      "stock": 12,
      "stock_available": 12,
      "reserved": 0,
      "threshold": 5,
      "batch_size": 10,
      "visible": true
    }
  ]
}

Ошибки

КодОтвет сервераКогда возникаетЧто делать
400{"error":"Некорректный идентификатор товара"}В пути не число.—
404{"error":"Товар не найден"}Товара нет либо он принадлежит другому бренду.Чужой товар неотличим от несуществующего — так и задумано.
POST/production-api/receive

Приёмка готовой продукции

Сообщает, что произведено столько-то штук. Остаток на складе увеличивается.

Доступ:Ключ площадки

Можно прислать одну позицию или сразу пачку. Пачка обрабатывается целиком: если хоть одна строка не пройдёт проверку, не применится ни одна.

Тело запроса

ПараметрТипОбязателенОписание
variant_idnumberнетИдентификатор варианта — самостоятельная альтернатива паре product_id+size ИЛИ size_id. Рекомендуемый способ для новых интеграций, из очереди/каталога.
product_idnumberнетТовар — вместе с size. Для одной позиции нужна ЛИБО эта пара, ЛИБО size_id, ЛИБО variant_id.
sizestringнетРазмер, как он называется в каталоге — вместе с product_id.
size_idnumberнетЛегаси-идентификатор размера — самостоятельная альтернатива паре product_id+size, из очереди /production-api/queue. Поле также принимается как sizeId.
quantitynumberдаСколько штук произведено. Больше нуля.
linesarrayнетПачка строк вместо одной позиции. У каждой строки — те же поля адресации: variant_id ИЛИ product_id+size ИЛИ size_id, плюс quantity.
warehouse_slugstringнетКуда приходовать. По умолчанию — онлайн-склад бренда товара.
curl -s -X POST https://api.amarix.ru/production-api/receive \
  -H "Authorization: Bearer $КЛЮЧ_ПЛОЩАДКИ" \
  -H "Content-Type: application/json" \
  -d '{"variant_id": 2214, "quantity": 5}'
ответ
{
  "ok": true,
  "warehouse_slug": "acme-online",
  "warehouse_id": 3,
  "received_quantity": 20,
  "on_demand": false,
  "link_only": false,
  "soldout": false,
  "product_id": 341,
  "variant_id": 2214,
  "product_name": "Футболка Basic",
  "chestny_znak": null,
  "size": "M",
  "quantity": 5,
  "stock": 32,
  "threshold": 5,
  "batch_size": 10,
  "queue_count": 12
}

Ошибки

КодОтвет сервераКогда возникаетЧто делать
400{"error":"product_id обязателен"}Не указан товар.—
400{"error":"нужен size_id либо пара product_id и size"}Одиночная позиция без адресации: нет ни size_id, ни пары product_id+size.—
400{"error":"lines[N]: нужен size_id либо пара product_id и size"}То же самое, но внутри пачки — N это индекс строки.—
400{"error":"size_id должен быть числом"}size_id пришёл не числом.—
400{"error":"quantity должно быть положительным числом"}quantity ноль, отрицательное или не число.—
400{"error":"lines[N]: quantity должно быть положительным числом"}То же самое, но внутри пачки.—
400{"error":"lines не должен быть пустым массивом"}Прислали lines: [].—
400{"error":"Онлайн-склад бренда не настроен"}Некуда приходовать: у бренда не назначен склад.—
403{"error":"Позиция не принадлежит этой производственной площадке"}Товар относится к другому бренду или закреплён за другой площадкой.—
404{"error":"Товар не найден"}product_id не найден вообще (ещё до попытки найти размер).—
404{"error":"Позиция не найдена или недоступна для производства"}Размер по строке size не совпал ни с одним размером товара, либо size_id указывает на несуществующий/скрытый/удалённый размер.—
404{"error":"Онлайн-склад бренда не найден или недоступен"}У бренда назначен онлайн-склад, но сам склад пропал/деактивирован.—
404{"error":"Склад не найден или недоступен"}Явно передан warehouse_slug, которого нет или он чужой/деактивирован.—
500{"error":"Internal error"}Сбой на стороне платформы.Прежде чем повторять, проверьте остаток: возможно, приход уже применился.