BazaarAPI v1

Документация BAZAAR API для внешних интеграций

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

Base URL

Store-scoped
https://bazaar.kg/api/bazaar/v1
Authorization: Bearer API key
Один ключ даёт доступ к одному магазину
Максимум 100 товаров на страницу

Overview

Назначение API

GET/products

Получение товаров

Товары, цены, остатки, изображения, штрихкоды, упаковки и варианты.

POST/orders

Создание заказа

Передача заказа из маркетплейса или внешней витрины в BAZAAR.

GET/orders

Статусы заказов

Список API-заказов с фильтрами по статусу, датам и внешнему ID.

GET/orders/{id}

Заказ по ID

Получение статуса и деталей по ID, номеру заказа или externalId.

POST/customers

Синхронизация клиентов

Создание нового клиента или обновление существующей карточки.

API работает в модели store-scoped access: каждый API-ключ привязан к одному магазину. Внешняя система видит и создаёт данные только в рамках этого магазина.

Authentication

Авторизация

Для всех запросов требуется API-ключ в заголовке.

Authorization: Bearer <API_KEY>
Content-Type: application/json

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

Если ключ отозван или передан неверно, API возвращает HTTP 401 и сообщение apiUnauthorized.

Endpoint

GET /products

Возвращает список активных товаров магазина, доступных для интеграции.

GET/api/bazaar/v1/products?page=1&pageSize=50&search=coffee

Query параметры

ПараметрТипОбязательныйОписание
pagenumberНетНомер страницы. По умолчанию 1.
pageSizenumberНетКоличество товаров на странице. По умолчанию 50, максимум 100.
searchstringНетПоиск по названию или 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
        }
      ]
    }
  ]
}

Важные поля

ПолеОписание
idID товара. Используется при создании заказа.
skuАртикул товара.
priceЦена в валюте магазина.
priceKgsЦена в KGS.
currencyCodeВалюта магазина.
stockQtyОстаток базового товара.
pcsСовместимый alias для stockQty.
variants[].idID варианта. Используется как variantId при создании заказа.
variants[].stockQtyОстаток конкретного варианта.
stockByVariantОстатки по базовому товару и вариантам.

Закрытые внутренние поля, включая себестоимость и бухгалтерские данные, через API не передаются.

Endpoint

Заказы

Создаёт заказ в BAZAAR для магазина, к которому привязан API-ключ.

POST/api/bazaar/v1/orders

Тело запроса

ПолеТипОбязательноеОграничение
externalIdstringНетДо 160 символов.
customerNamestringНетДо 160 символов.
customerEmailstringНетВалидный email, до 254 символов.
customerPhonestringНетДо 64 символов.
customerAddressstringНетДо 512 символов.
commentstringНетДо 2000 символов.
linesarrayДаОт 1 до 500 строк.
lines[].productIdstringДаID товара из GET /products.
lines[].variantIdstringНетID варианта из GET /products; не передавать для базового товара.
lines[].qtynumberДаЦелое число, минимум 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-пагинацией.

GET/api/bazaar/v1/orders?status=CONFIRMED&limit=50
ПараметрТипОбязательныйОписание
statusstringНетПубличный статус: NEW, CONFIRMED, READY_FOR_PICKUP, COMPLETED, CANCELLED.
orderNumberstringНетНомер заказа, например SO-000001.
externalOrderIdstringНетexternalId, переданный при POST /orders.
dateFromstringНетДата/время начала периода по createdAt.
dateTostringНетДата/время конца периода по createdAt.
storeIdstringНетДолжен совпадать с магазином API-ключа; другие магазины не возвращаются.
limitnumberНетРазмер страницы. По умолчанию 50, максимум 100.
cursorstringНетКурсор следующей страницы из 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, переданному при создании.

GET/api/bazaar/v1/orders/SO-000001
curl -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 передаётся только для диагностики.

InternalPublic APIОписание
DRAFTNEWНовый заказ
CONFIRMEDCONFIRMEDПодтвержден
READYREADY_FOR_PICKUPГотов к выдаче
COMPLETEDCOMPLETEDЗавершен
CANCELEDCANCELLEDОтменен

Endpoint

POST /customers

Создаёт нового клиента или обновляет существующего клиента в магазине.

POST/api/bazaar/v1/customers

Тело запроса

ПолеТипОбязательноеОграничение
namestringДаОт 1 до 160 символов.
emailstringДаВалидный email, до 254 символов.
phonestringДаОт 1 до 64 символов.
addressstringНетДо 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Описание
400invalidInputНеверный JSON, неверный формат полей или превышены лимиты.
400invalidQuantityНекорректное количество товара в заказе.
400salesOrderEmptyЗаказ без строк.
401apiUnauthorizedНе передан, неверный или отозван API-ключ.
404storeNotFoundМагазин для API-ключа не найден.
404ORDER_NOT_FOUNDЗаказ не найден или недоступен для API-ключа.
404productNotFoundТовар не найден или недоступен в магазине API-ключа.
404variantNotFoundВариант товара не найден или не относится к указанному товару.
500genericMessageВнутренняя ошибка сервера.

Limits

Ограничения и требования

  • Все запросы должны выполняться по HTTPS.
  • API-ключ нельзя передавать в query string; используйте только заголовок Authorization.
  • Один API-ключ даёт доступ только к одному магазину.
  • GET /products возвращает максимум 100 товаров на страницу.
  • POST /orders принимает максимум 500 строк заказа.
  • API отдаёт только активные товары, доступные в магазине.
  • API не отдаёт себестоимость, бухгалтерские и другие закрытые внутренние поля.
  • Для синхронизации товаров, цен и остатков маркетплейс должен регулярно читать GET /products.
  • Для передачи заказов маркетплейс должен вызывать POST /orders.
  • Запись товаров, цен и остатков из внешней системы в BAZAAR через публичный API сейчас не включена в базовый набор методов и обсуждается отдельно при необходимости.

Integration flow

Рекомендуемый сценарий интеграции

  1. В BAZAAR создаётся API-ключ для нужного магазина.
  2. Маркетплейс периодически вызывает GET /products.
  3. Маркетплейс сохраняет у себя productId и, при наличии вариантов, variantId.
  4. При новом заказе маркетплейс вызывает POST /orders.
  5. BAZAAR создаёт подтверждённый заказ и сохраняет данные клиента.
  6. Маркетплейс повторно читает GET /products для обновления остатков и цен.

Публичная ссылка

После деплоя документация будет доступна по адресу /developers/bazaar-api на вашем домене.