Inkor Dealer API
API для дилеров, которые торгуют товарами Inkor на собственных сайтах (в том числе по модели дропшиппинга): проверка остатков и цен с учётом вашей скидки, и программное размещение заказов — без ручной работы в личном кабинете.
https://b2b.villartec.group/api/dealer-api/v1
Типичный сценарий использования:
- Вы загружаете наш ассортимент на свой сайт — либо один раз через
GET /catalog, либо сверяясь со своим фидом по артикулам черезPOST /stock. - Покупатель оформляет заказ у вас на сайте.
- Вы создаёте заказ у нас через
POST /orders— мы резервируем остаток и ставим заказ в обработку. - При необходимости проверяете статус через
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 — превышен лимит запросов.Проверка ключа
/ping
Проверяет, что ключ действителен, и показывает, к какому юрлицу он привязан.
curl -u "client_id:secret" \
https://b2b.villartec.group/api/dealer-api/v1/ping
{
"ok": true,
"legal_entity": { "id": 3, "name": "ООО «Пример»", "inn": "6313559246" }
}
Весь каталог
/catalog
Постранично отдаёт весь ассортимент, доступный вашему юрлицу — для тех, кто не ведёт свой фид и предпочитает один раз забрать весь каталог, а не сверяться по артикулам. Цена уже со скидкой вашего юрлица.
| Параметр | Тип | Описание |
|---|---|---|
cursor | string | Курсор страницы — значение next_cursor из предыдущего ответа. Без него — первая страница. |
per_page | int | Размер страницы, 1–50 (по умолчанию 50). |
search | string | Фильтр по названию/артикулу (опционально). |
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.
Остатки и цена по артикулам
/stock
Для тех, кто ведёт собственный фид и хочет свериться с нами по конкретным артикулам — например, перед показом кнопки «Заказать» на своём сайте.
| Поле | Тип | Описание |
|---|---|---|
items | array | Обязательно. 1–200 позиций. |
items[].article | string | Обязательно. Артикул товара. |
items[].quantity | int | Опционально. Если указать — 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) — заказ с таким
количеством будет отклонён при создании.
Создать заказ
/orders
| Поле | Тип | Описание |
|---|---|---|
items | array | Обязательно. 1–200 позиций. |
items[].article | string | Обязательно. |
items[].quantity | int | Обязательно, ≥ 1. |
delivery_type | string | Обязательно. pickup или delivery. |
delivery_address | string | Обязательно, если delivery_type = delivery. |
comment | string | Опционально. |
external_order_id | string | Опционально. Номер заказа в вашей системе — попадёт в комментарий, чтобы было легко свериться. |
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}.
Статус заказа
/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.
Изменения
GET /catalog — полный листинг ассортимента./ping, /stock, /orders.