Документация BAZAAR API для внешних интеграций
Подключайте сайты, маркетплейсы и внешние системы к BAZAAR: получайте товары, цены и остатки, передавайте заказы и синхронизируйте клиентов.
Base URL
Store-scopedhttps://bazaar.kg/api/bazaar/v1Overview
Назначение API
/productsПолучение товаров
Товары, цены, остатки, изображения, штрихкоды, упаковки и варианты.
/ordersСоздание заказа
Передача заказа из маркетплейса или внешней витрины в BAZAAR.
/ordersСтатусы заказов
Список API-заказов с фильтрами по статусу, датам и внешнему ID.
/orders/{id}Заказ по ID
Получение статуса и деталей по ID, номеру заказа или externalId.
/customersСинхронизация клиентов
Создание нового клиента или обновление существующей карточки.
API работает в модели store-scoped access: каждый API-ключ привязан к одному магазину. Внешняя система видит и создаёт данные только в рамках этого магазина.
Authentication
Авторизация
Для всех запросов требуется API-ключ в заголовке.
Authorization: Bearer <API_KEY>
Content-Type: application/jsonAPI-ключ создаётся в BAZAAR в разделе интеграций. Новый ключ показывается один раз, поэтому его нужно сохранить сразу после создания.
401 и сообщение apiUnauthorized.Endpoint
GET /products
Возвращает список активных товаров магазина, доступных для интеграции.
/api/bazaar/v1/products?page=1&pageSize=50&search=coffeeQuery параметры
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
page | number | Нет | Номер страницы. По умолчанию 1. |
pageSize | number | Нет | Количество товаров на странице. По умолчанию 50, максимум 100. |
search | string | Нет | Поиск по названию или SKU. Максимум 200 символов. |
Пример запроса
curl -X GET "https://bazaar.kg/api/bazaar/v1/products?page=1&pageSize=50" \
-H "Authorization: Bearer <API_KEY>"Пример ответа
{
"store": {
"id": "store_123",
"name": "Main Store"
},
"currencyCode": "KGS",
"currencyRateKgsPerUnit": 1,
"page": 1,
"pageSize": 50,
"total": 1,
"items": [
{
"id": "product_123",
"sku": "COFFEE-250",
"name": "Coffee 250g",
"category": "Coffee",
"categories": ["Coffee", "Beans"],
"description": "Single-origin whole bean coffee",
"unit": "pcs",
"baseUnit": {
"id": "unit_123",
"code": "pcs",
"labelRu": "шт",
"labelKg": "даана"
},
"supplier": {
"id": "supplier_123",
"name": "Supplier LLC"
},
"isBundle": false,
"barcodes": ["1234567890123"],
"packs": [
{
"id": "pack_123",
"packName": "Box",
"packBarcode": "BOX-123",
"multiplierToBase": 6,
"allowInPurchasing": true,
"allowInReceiving": true
}
],
"createdAt": "2026-06-01T10:00:00.000Z",
"updatedAt": "2026-06-04T10:00:00.000Z",
"price": 900,
"priceKgs": 900,
"stockQty": 7,
"pcs": 7,
"stockByVariant": [
{
"variantKey": "BASE",
"stockQty": 7,
"pcs": 7
}
],
"images": [
"https://cdn.example.com/products/coffee-main.jpg"
],
"imageObjects": [
{
"id": null,
"url": "https://cdn.example.com/products/coffee-main.jpg",
"position": 0,
"isPrimary": true,
"isAiGenerated": false
}
],
"variants": [
{
"id": "variant_123",
"sku": "COFFEE-1KG",
"name": "1 kg",
"attributes": {
"size": "1 kg"
},
"attributeValues": [
{
"key": "size",
"value": "1 kg"
}
],
"createdAt": "2026-06-01T10:00:00.000Z",
"updatedAt": "2026-06-04T10:00:00.000Z",
"price": 1200,
"priceKgs": 1200,
"stockQty": 3,
"pcs": 3
}
]
}
]
}Важные поля
| Поле | Описание |
|---|---|
id | ID товара. Используется при создании заказа. |
sku | Артикул товара. |
price | Цена в валюте магазина. |
priceKgs | Цена в KGS. |
currencyCode | Валюта магазина. |
stockQty | Остаток базового товара. |
pcs | Совместимый alias для stockQty. |
variants[].id | ID варианта. Используется как variantId при создании заказа. |
variants[].stockQty | Остаток конкретного варианта. |
stockByVariant | Остатки по базовому товару и вариантам. |
Закрытые внутренние поля, включая себестоимость и бухгалтерские данные, через API не передаются.
Endpoint
Заказы
Создаёт заказ в BAZAAR для магазина, к которому привязан API-ключ.
/api/bazaar/v1/ordersТело запроса
| Поле | Тип | Обязательное | Ограничение |
|---|---|---|---|
externalId | string | Нет | До 160 символов. |
customerName | string | Нет | До 160 символов. |
customerEmail | string | Нет | Валидный email, до 254 символов. |
customerPhone | string | Нет | До 64 символов. |
customerAddress | string | Нет | До 512 символов. |
comment | string | Нет | До 2000 символов. |
lines | array | Да | От 1 до 500 строк. |
lines[].productId | string | Да | ID товара из GET /products. |
lines[].variantId | string | Нет | ID варианта из GET /products; не передавать для базового товара. |
lines[].qty | number | Да | Целое число, минимум 1. |
Пример запроса
curl -X POST "https://bazaar.kg/api/bazaar/v1/orders" \
-H "Authorization: Bearer <API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"externalId": "MARKET-10001",
"customerName": "Ivan Ivanov",
"customerEmail": "ivan@example.com",
"customerPhone": "+996555111222",
"customerAddress": "Bishkek, Manas 10",
"comment": "Delivery after 18:00",
"lines": [
{
"productId": "product_123",
"qty": 2
},
{
"productId": "product_456",
"variantId": "variant_456_blue",
"qty": 1
}
]
}'Пример ответа
{
"order": {
"id": "order_123",
"number": "SO-000001",
"status": "CONFIRMED",
"totalKgs": 3000
}
}- Заказ создаётся только в магазине, к которому привязан API-ключ.
- Товары в заказе должны быть активны и доступны в этом же магазине.
- Для варианта товара нужно передавать
variantIdиз ответаGET /products. - Если переданы данные клиента, BAZAAR создаст или обновит клиента в базе этого магазина.
- Если email и телефон клиента не переданы, отдельная карточка клиента не создаётся.
- Валютный snapshot магазина сохраняется в заказе на момент создания.
GET /orders
Возвращает список API-заказов магазина с фильтрами и cursor-пагинацией.
/api/bazaar/v1/orders?status=CONFIRMED&limit=50| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
status | string | Нет | Публичный статус: NEW, CONFIRMED, READY_FOR_PICKUP, COMPLETED, CANCELLED. |
orderNumber | string | Нет | Номер заказа, например SO-000001. |
externalOrderId | string | Нет | externalId, переданный при POST /orders. |
dateFrom | string | Нет | Дата/время начала периода по createdAt. |
dateTo | string | Нет | Дата/время конца периода по createdAt. |
storeId | string | Нет | Должен совпадать с магазином API-ключа; другие магазины не возвращаются. |
limit | number | Нет | Размер страницы. По умолчанию 50, максимум 100. |
cursor | string | Нет | Курсор следующей страницы из pagination.nextCursor. |
curl -X GET "https://bazaar.kg/api/bazaar/v1/orders?status=CONFIRMED&dateFrom=2026-06-01&dateTo=2026-06-30" \
-H "Authorization: Bearer <API_KEY>"{
"data": [
{
"id": "order_123",
"orderNumber": "SO-000001",
"externalOrderId": "MARKET-10001",
"status": "CONFIRMED",
"statusLabel": "Подтвержден",
"internalStatus": "CONFIRMED",
"createdAt": "2026-06-04T10:00:00.000Z",
"updatedAt": "2026-06-04T10:00:00.000Z",
"total": 3000,
"totalKgs": 3000,
"currencyCode": "KGS"
}
],
"pagination": {
"nextCursor": null
}
}GET /orders/{id}
Возвращает один API-заказ по ID BAZAAR, номеру заказа или externalId, переданному при создании.
/api/bazaar/v1/orders/SO-000001curl -X GET "https://bazaar.kg/api/bazaar/v1/orders/SO-000001" \
-H "Authorization: Bearer <API_KEY>"
curl -X GET "https://bazaar.kg/api/bazaar/v1/orders/MARKET-10001" \
-H "Authorization: Bearer <API_KEY>"{
"order": {
"id": "order_123",
"orderNumber": "SO-000001",
"externalOrderId": "MARKET-10001",
"status": "CONFIRMED",
"statusLabel": "Подтвержден",
"internalStatus": "CONFIRMED",
"createdAt": "2026-06-04T10:00:00.000Z",
"updatedAt": "2026-06-04T10:00:00.000Z",
"cancelledAt": null,
"completedAt": null,
"customer": {
"name": "Ivan Ivanov",
"phone": "+996555111222",
"email": "ivan@example.com",
"address": "Bishkek, Manas 10"
},
"store": {
"id": "store_123",
"name": "Main Store"
},
"items": [
{
"productId": "product_123",
"variantId": null,
"name": "Coffee 250g",
"sku": "COFFEE-250",
"quantity": 2,
"price": 1500,
"priceKgs": 1500,
"total": 3000,
"totalKgs": 3000
}
],
"totals": {
"subtotal": 3000,
"discount": 0,
"shipping": 0,
"total": 3000,
"currencyCode": "KGS"
},
"payment": {
"status": "UNPAID",
"method": null,
"methods": []
},
"fulfillment": {
"status": "PENDING",
"trackingNumber": null,
"trackingUrl": null,
"carrier": null
}
}
}Публичные статусы
Поле status стабильно для внешних интеграций. Поле internalStatus передаётся только для диагностики.
| Internal | Public API | Описание |
|---|---|---|
DRAFT | NEW | Новый заказ |
CONFIRMED | CONFIRMED | Подтвержден |
READY | READY_FOR_PICKUP | Готов к выдаче |
COMPLETED | COMPLETED | Завершен |
CANCELED | CANCELLED | Отменен |
Endpoint
POST /customers
Создаёт нового клиента или обновляет существующего клиента в магазине.
/api/bazaar/v1/customersТело запроса
| Поле | Тип | Обязательное | Ограничение |
|---|---|---|---|
name | string | Да | От 1 до 160 символов. |
email | string | Да | Валидный email, до 254 символов. |
phone | string | Да | От 1 до 64 символов. |
address | string | Нет | До 512 символов. |
Пример запроса
curl -X POST "https://bazaar.kg/api/bazaar/v1/customers" \
-H "Authorization: Bearer <API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"name": "Ivan Ivanov",
"email": "ivan@example.com",
"phone": "+996555111222",
"address": "Bishkek, Manas 10"
}'Пример ответа
{
"action": "created",
"customer": {
"id": "customer_123",
"name": "Ivan Ivanov",
"email": "ivan@example.com",
"phone": "+996555111222",
"address": "Bishkek, Manas 10",
"source": "INTEGRATION",
"createdAt": "2026-06-04T10:00:00.000Z",
"updatedAt": "2026-06-04T10:00:00.000Z"
}
}Errors
Ошибки
Ошибки возвращаются в едином формате.
{
"message": "invalidInput"
}| HTTP статус | message | Описание |
|---|---|---|
400 | invalidInput | Неверный JSON, неверный формат полей или превышены лимиты. |
400 | invalidQuantity | Некорректное количество товара в заказе. |
400 | salesOrderEmpty | Заказ без строк. |
401 | apiUnauthorized | Не передан, неверный или отозван API-ключ. |
404 | storeNotFound | Магазин для API-ключа не найден. |
404 | ORDER_NOT_FOUND | Заказ не найден или недоступен для API-ключа. |
404 | productNotFound | Товар не найден или недоступен в магазине API-ключа. |
404 | variantNotFound | Вариант товара не найден или не относится к указанному товару. |
500 | genericMessage | Внутренняя ошибка сервера. |
Limits
Ограничения и требования
- Все запросы должны выполняться по HTTPS.
- API-ключ нельзя передавать в query string; используйте только заголовок
Authorization. - Один API-ключ даёт доступ только к одному магазину.
GET /productsвозвращает максимум100товаров на страницу.POST /ordersпринимает максимум500строк заказа.- API отдаёт только активные товары, доступные в магазине.
- API не отдаёт себестоимость, бухгалтерские и другие закрытые внутренние поля.
- Для синхронизации товаров, цен и остатков маркетплейс должен регулярно читать
GET /products. - Для передачи заказов маркетплейс должен вызывать
POST /orders. - Запись товаров, цен и остатков из внешней системы в BAZAAR через публичный API сейчас не включена в базовый набор методов и обсуждается отдельно при необходимости.
Integration flow
Рекомендуемый сценарий интеграции
- В BAZAAR создаётся API-ключ для нужного магазина.
- Маркетплейс периодически вызывает
GET /products. - Маркетплейс сохраняет у себя
productIdи, при наличии вариантов,variantId. - При новом заказе маркетплейс вызывает
POST /orders. - BAZAAR создаёт подтверждённый заказ и сохраняет данные клиента.
- Маркетплейс повторно читает
GET /productsдля обновления остатков и цен.
Публичная ссылка
После деплоя документация будет доступна по адресу /developers/bazaar-api на вашем домене.