Inkor Dealer API

API для дилеров, которые торгуют товарами Inkor на собственных сайтах (в том числе по модели дропшиппинга): проверка остатков и цен с учётом вашей скидки, и программное размещение заказов — без ручной работы в личном кабинете.

Базовый адрес API: https://b2b.villartec.group/api/dealer-api/v1

Типичный сценарий использования:

  1. Вы загружаете наш ассортимент на свой сайт — либо один раз через GET /catalog, либо сверяясь со своим фидом по артикулам через POST /stock.
  2. Покупатель оформляет заказ у вас на сайте.
  3. Вы создаёте заказ у нас через POST /orders — мы резервируем остаток и ставим заказ в обработку.
  4. При необходимости проверяете статус через GET /orders/{number}.

Аутентификация

Каждый ключ привязан к одному юридическому лицу — ценам и остаткам, которые отдаёт API, применяется скидка именно этого юрлица. Один дилер с несколькими юрлицами может держать по ключу на каждое.

Передавайте client_id и secret как логин и пароль HTTP Basic Auth:

curl -u "client_id:secret" https://b2b.villartec.group/api/dealer-api/v1/ping

Либо, если у вашей библиотеки неудобно работать с Basic Auth, — отдельными заголовками:

curl https://b2b.villartec.group/api/dealer-api/v1/ping \
  -H "X-Dealer-Client-Id: client_id" \
  -H "X-Dealer-Client-Secret: secret"
Секрет показывается только один раз — сразу после создания ключа в личном кабинете. Если потеряли — создайте новый ключ и отозвите старый.

Как получить ключ

В личном кабинете на портале (b2b.villartec.group/profile) откройте раздел «API-ключи для дилеров»: выберите юрлицо, при желании задайте название ключа — и получите client_id/secret. Ключей можно выпустить несколько (например, по одному на тест и на прод вашего сайта). Отозвать ключ можно там же в любой момент — он сразу перестанет принимать запросы.

Лимиты запросов

Лимит считается отдельно на каждый ключ (не на юрлицо и не на IP):

ОкноЛимит по умолчанию
1 минута60 запросов
1 сутки5000 запросов

При превышении API отвечает 429 Too Many Requests с заголовком Retry-After (секунды до сброса окна). Если вашему интеграционному сценарию нужен другой лимит — обратитесь к менеджеру.

Формат ошибок

Ошибки возвращаются в едином виде:

{ "error": "unauthorized", "message": "Неверный client_id или secret." }

Коды состояния, которые использует API:

200 — успешно.
201 — заказ создан.
401 — неверный или отозванный ключ.
404 — заказ не найден (или принадлежит другому юрлицу).
409 — юрлицо ключа не привязано к поставщику ERP (обратитесь к менеджеру).
422 — ошибка валидации входных данных (errors по полям, как в стандартном Laravel-ответе).
429 — превышен лимит запросов.

Проверка ключа

GET /ping

Проверяет, что ключ действителен, и показывает, к какому юрлицу он привязан.

curl -u "client_id:secret" \
  https://b2b.villartec.group/api/dealer-api/v1/ping
{
  "ok": true,
  "legal_entity": { "id": 3, "name": "ООО «Пример»", "inn": "6313559246" }
}

Весь каталог

GET /catalog

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

ПараметрТипОписание
cursorstringКурсор страницы — значение next_cursor из предыдущего ответа. Без него — первая страница.
per_pageintРазмер страницы, 1–50 (по умолчанию 50).
searchstringФильтр по названию/артикулу (опционально).
curl -u "client_id:secret" \
  "https://b2b.villartec.group/api/dealer-api/v1/catalog?per_page=50"
{
  "data": [
    {
      "article": "5050450000",
      "id": 5921,
      "one_c_id": "1ddbe7e9-e532-11ef-80cf-00505601d910",
      "name": "Аккумулятор VILLARTEC AM 405",
      "price": 8990,
      "stock": 365,
      "order_multiple": 1,
      "reserve_allowed": true
    }
  ],
  "has_more": true,
  "next_cursor": "eyJpdiI6Ikk..."
}

Чтобы пройти весь каталог — повторяйте запрос, подставляя next_cursor в параметр cursor, пока has_more не станет false.

Остатки и цена по артикулам

POST /stock

Для тех, кто ведёт собственный фид и хочет свериться с нами по конкретным артикулам — например, перед показом кнопки «Заказать» на своём сайте.

ПолеТипОписание
itemsarrayОбязательно. 1–200 позиций.
items[].articlestringОбязательно. Артикул товара.
items[].quantityintОпционально. Если указать — API проверит кратность заказа и наличие именно этого количества.
curl -u "client_id:secret" \
  -X POST https://b2b.villartec.group/api/dealer-api/v1/stock \
  -H "Content-Type: application/json" \
  -d '{"items": [{"article": "00004007016C", "quantity": 4}]}'
{
  "data": [
    {
      "article": "00004007016C",
      "found": true,
      "id": 1,
      "one_c_id": "9e411ab2-8679-11ed-80c9-00505601d910",
      "name": "Свеча зажигания Champion USA RCJ6Y",
      "price": 299,
      "stock": 100438,
      "order_multiple": 4,
      "reserve_allowed": false,
      "problem": null
    }
  ]
}

Если артикул не найден — found: false, остальные поля null. Поле problem непустое, если указанное quantity не проходит проверку (например, не кратно order_multiple) — заказ с таким количеством будет отклонён при создании.

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

POST /orders
ПолеТипОписание
itemsarrayОбязательно. 1–200 позиций.
items[].articlestringОбязательно.
items[].quantityintОбязательно, ≥ 1.
delivery_typestringОбязательно. pickup или delivery.
delivery_addressstringОбязательно, если delivery_type = delivery.
commentstringОпционально.
external_order_idstringОпционально. Номер заказа в вашей системе — попадёт в комментарий, чтобы было легко свериться.
curl -u "client_id:secret" \
  -X POST https://b2b.villartec.group/api/dealer-api/v1/orders \
  -H "Content-Type: application/json" \
  -d '{
    "items": [{"article": "00004007016C", "quantity": 4}],
    "delivery_type": "pickup",
    "external_order_id": "WEB-10492"
  }'
HTTP/1.1 201 Created
{
  "data": {
    "number": "INK-2026-000512",
    "status": "pending",
    "status_label": "Ожидает подтверждения",
    "total": 1196,
    "final_total": null,
    "items_count": 1,
    "created_at": "2026-10-21T10:15:00+00:00"
  }
}

Остаток резервируется в момент создания заказа — так же, как при оформлении заказа в личном кабинете. Если по какой-то позиции остаток закончился прямо во время запроса, вернётся 422 и заказ не создастся — повторите запрос после проверки остатков.

final_total становится известна после обработки заказа в 1С (может отличаться от предварительной total) — проверяйте её через GET /orders/{number}.

Статус заказа

GET /orders/{number}

Доступен только заказ, созданный ключом того же юрлица.

curl -u "client_id:secret" \
  https://b2b.villartec.group/api/dealer-api/v1/orders/INK-2026-000512
{
  "data": {
    "number": "INK-2026-000512",
    "status": "processing",
    "status_label": "В обработке",
    "total": 1196,
    "final_total": 1196,
    "items_count": 1,
    "created_at": "2026-10-21T10:15:00+00:00"
  }
}

Возможные значения status: pending, processing, processed, completed, canceled.

Изменения

2026-10-21 Добавлен GET /catalog — полный листинг ассортимента.
2026-10-21 Первая версия API: /ping, /stock, /orders.