Bicops Partner APIv1

Интерфейс интеграции для продавцов и корпоративных партнёров.

Обзор

Данные о товарах, остатках и ценах передаются в Bicops через этот API. Данные о заказах и расчётах получаются через тот же API. Массовые запросы обрабатываются из очереди; ответ — 202 и идентификатор пакета (batchId).

Версия: /v1. Имена полей не меняются. Сообщения ответов на английском языке; поле code стабильно.

  • JSON, UTF-8, ISO-8601 (UTC)
  • Каждый ответ содержит заголовок X-Request-Id
  • Некорректные записи отклоняются, корректные обрабатываются
  • Запись с тем же sourceId обновляется
GET /v1/me
POST /v1/catalog/products
PATCH /v1/catalog/stock · /v1/catalog/prices
DELETE /v1/catalog/products/{sourceId}
POST /v1/catalog/imports → /{batchId}/complete
GET /v1/catalog/products · /v1/catalog/batches/{id} · /v1/logs/requests

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

Каждый запрос содержит заголовки X-Api-Key и X-Api-Secret. Ключ выпускается Bicops; секрет отображается только при создании.

Идентификатор продавца определяется ключом. В теле запроса он не передаётся. Ключ имеет доступ только к своей учётной записи. Права задаются областями (catalog:read, catalog:write, orders:read).

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

X-Api-Key: 2c1d5c7e-2a1b-4c1e-9d7a-2b6f0e3c9a11
X-Api-Secret: 4Qb…(base64url, 43 chars)
Content-Type: application/json
X-Request-Id: optional-your-correlation-id

Проверка соединения: GET /v1/me. В ответе — области и лимиты ключа.

Типы ключей

Есть два типа ключей с разным охватом. Вызов сервиса не тем типом возвращает 403.

Ключ продавцаКаталог, заказы, возвраты, счета, финансы, отчёты, пакеты, вебхуки. Привязан к учётной записи продавца.
Корпоративный ключКлиентские счета, выписки, квитанции об оплате, счета на продажу, назначения торговых представителей. Привязан к филиалу компании.
ОбаGET /v1/me, GET /v1/logs/requests, подписки вебхуков и GET /v1/events.

Начало работы

1. Проверка соединения

curl -s https://partner.bicops.tr/v1/me \
  -H "X-Api-Key: 2c1d5c7e-2a1b-4c1e-9d7a-2b6f0e3c9a11" \
  -H "X-Api-Secret: <your-secret>"

2. Передача товаров (до 1 000 записей). Ответ: 202 и batchId.

curl -s -X POST https://partner.bicops.tr/v1/catalog/products \
  -H "X-Api-Key: <key>" -H "X-Api-Secret: <secret>" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [{
      "sourceId": "SACHS 317 572",
      "name": "AMORTISOR ON AUDI A3 / GOLF V",
      "brand": "SACHS",
      "producerCode": "317 572",
      "oemCodes": ["1T0413031CN", "1T0413031CK"],
      "equivalentCodes": ["FEBI 106124"],
      "price": 3869.60, "currency": "TRY", "pricesIncludeVat": false,
      "stock": 12,
      "warehouses": [{ "code": "ANK", "stock": 8 }, { "code": "IZM", "stock": 4 }],
      "minOrder": 1, "packageAmount": 1, "unit": "AD", "desi": 3.2,
      "images": ["https://cdn.example.com/317572.jpg"],
      "status": 1
    }]
  }'
HTTP/1.1 202 Accepted
X-Request-Id: 7c0e1c5a-…
{
  "batchId": 1042, "status": "queued",
  "received": 1, "accepted": 1, "rejected": 0, "warnings": 0,
  "chunks": 1, "dryRun": false, "issues": [], "requestId": "7c0e1c5a-…"
}

3. Запрос записи пакета: статус, счётчики, ошибки строк.

curl -s https://partner.bicops.tr/v1/catalog/batches/1042 -H "X-Api-Key: <key>" -H "X-Api-Secret: <secret>"
curl -s https://partner.bicops.tr/v1/catalog/batches/1042/errors.csv -H "X-Api-Key: <key>" -H "X-Api-Secret: <secret>" -o errors.csv

4. Обновление остатков и цен (до 5 000 записей).

curl -s -X PATCH https://partner.bicops.tr/v1/catalog/stock \
  -H "X-Api-Key: <key>" -H "X-Api-Secret: <secret>" -H "Content-Type: application/json" \
  -d '{"items":[{"sourceId":"SACHS 317 572","stock":9,"warehouses":[{"code":"ANK","stock":5},{"code":"IZM","stock":4}]}]}'

Каталог

POST /v1/catalog/products добавляет или обновляет записи по sourceId. Обрабатываются только изменённые записи.

Поля

ПолеТипОписание
sourceIdstring (≤200)Обязательно. Код товара продавца. До 200 символов.
namestring (≤4000)Обязательно для активного товара.
brandstring (≤200)Наименование бренда.
producerCode, previousCodestring (≤200)Номер производителя и предыдущий номер.
oemCodes[]string[] (≤200 items, each ≤100)Номера OEM в виде массива. Номера не объединяются.
equivalentCodes[]string[] (≤200 items)Номера аналогов («БРЕНД НОМЕР»).
price, currency, pricesIncludeVatdecimal · string(3) · booleanПрейскурантная цена. TRY, USD или EUR.
stock, warehouses[]decimal · object[] {code: string, stock: decimal}Общий остаток и разбивка по складам [{code, stock}].
minOrder, packageAmount, boxAmount, unitinteger · integer · integer · string(≤16)Правила заказа.
desi, weightdecimal · decimalОбъёмный вес и вес (кг).
images[]string[] (URL, ≤10)Адреса изображений (https).
statusinteger (0 | 1)1 — активен, 0 — неактивен.

PATCH /v1/catalog/stock и PATCH /v1/catalog/prices обновляют только остатки и цены. Обрабатываются в приоритетной очереди.

Деактивация: DELETE /v1/catalog/products/{sourceId} или POST /v1/catalog/products/deactivate.

GET /v1/catalog/products возвращает состояние записей на стороне Bicops.

Импорт файла

Полный каталог передаётся файлом NDJSON (одна запись в строке). Рекомендуется gzip. Файл загружается непосредственно в хранилище.

  1. POST /v1/catalog/imports: получить uploadUrl и batchId
  2. Загрузить файл методом HTTP PUT по адресу uploadUrl
  3. POST /v1/catalog/imports/{batchId}/complete: начать обработку
  4. GET /v1/catalog/batches/{batchId}: отслеживать ход
# 1
curl -s -X POST https://partner.bicops.tr/v1/catalog/imports -H "X-Api-Key: <key>" -H "X-Api-Secret: <secret>" \
  -H "Content-Type: application/json" -d '{"format":"ndjson","gzip":true}'
# → {"batchId":1043,"uploadUrl":"https://files.bicops.tr/partner-raw/…","expiresInSec":900}
# 2
curl -s -X PUT "<uploadUrl>" -H "Content-Type: application/octet-stream" --data-binary @catalog.ndjson.gz
# 3
curl -s -X POST https://partner.bicops.tr/v1/catalog/imports/1043/complete -H "X-Api-Key: <key>" -H "X-Api-Secret: <secret>"

Формат файла

  • Каждая строка — самостоятельный объект JSON. Между строками нет запятых и квадратных скобок.
  • Файл в кодировке UTF-8, конец строки \n. Пустые строки пропускаются.
  • Обязательное поле только одно — sourceId (ваш складской код). Непереданное поле сохраняет текущее значение.
  • Ошибочная строка отклоняется сама по себе, остальной файл обрабатывается. Причины доступны в GET /v1/catalog/batches/{id}/errors.
  • Если переданы и stock, и warehouses, значение stock должно равняться сумме складских остатков.
  • Товары, отсутствующие в файле, не удаляются. Чтобы деактивировать товар, отправьте его со status: 0.

Пример файла

{"sourceId":"SACHS 317 572","name":"AMORTISOR ON AUDI A3 / GOLF V","brand":"SACHS","producerCode":"317 572","previousCode":"317 571","oemCodes":["1T0413031CN","1T0413031CK"],"equivalentCodes":["FEBI 106124"],"barcodes":["4054228012345"],"price":3869.6,"currency":"TRY","pricesIncludeVat":false,"stock":12,"warehouses":[{"code":"ANK","stock":8},{"code":"IST","stock":4}],"minOrder":1,"packageAmount":1,"boxAmount":2,"unit":"AD","desi":3.2,"weight":1.25,"images":["https://cdn.satici.com/317572.jpg"],"categoryHint":"Amortisor","vehicleHint":"VW Golf V 2003-2008","status":1}
{"sourceId":"MANN W 712/95","name":"YAG FILTRESI","brand":"MANN","oemCodes":["W 712/95","1109AY"],"price":210.5,"currency":"TRY","stock":0,"status":1}
{"sourceId":"BOSCH 0986495255","name":"FREN BALATASI ON","brand":"BOSCH","oemCodes":["0986495255"],"price":1250,"currency":"TRY","stock":6,"warehouses":[{"code":"IZM","stock":6}],"status":1}
{"sourceId":"SACHS 317 571","status":0}

Скачать пример файла NDJSON

dryRun=true проверяет файл без записи. Первый импорт 1 000 000 записей занимает около 15 минут.

Записи пакетов

Каждый массовый запрос создаёт запись пакета. GET /v1/catalog/batches/{id} возвращает статус, счётчики и длительности. /errors возвращает ошибки строк; /errors.csv — тот же список в CSV.

queuedВ очереди
awaiting_uploadОжидается загрузка файла
processingОбрабатывается
syncingОбновление каталога и поискового индекса
doneЗавершено
partialЗавершено, часть записей отклонена
failedОшибка

Счётчики: received, accepted, rejected, changed. При повторной отправке тех же данных changed = 0.

Методы

Все методы находятся под /v1. Для методов записи требуется соответствующая область.

Заказы

МетодОписание
GET /ordersСписок заказов (status, updatedSince)
GET /orders/{id}Детали заказа
POST /orders/{id}/approveПодтвердить заказ
POST /orders/{id}/statusОбновить статус {status}
POST /orders/{id}/erp-referenceСохранить ссылку ERP {reference}
GET /orders/{id}/messagesСообщения по заказу
GET /orders/{id}/documentsДокументы заказа

Доставка

МетодОписание
POST /orders/{id}/shipmentsУказать собственную отправку {trackNumber, cargoId?}
POST /orders/{id}/shipments/createСоздать отправку перевозчиком Bicops
GET /orders/{id}/shipments/labelЭтикетка отправки (PDF, base64)
GET /orders/carriersСписок перевозчиков

Возвраты и отмены

МетодОписание
GET /returnsЗапросы на возврат
GET /returns/{id}Детали возврата
POST /returns/{id}/decisionРешение по возврату {action: approve|reject}
GET /cancellationsОтменённые заказы

Счета

МетодОписание
GET /orders/{id}/invoicesФайлы счетов по заказу
POST /orders/{id}/invoiceПрикрепить свой счёт {fileBase64|fileUrl}
GET /invoicesДокументы, выставленные вам Bicops

Финансы

МетодОписание
GET /finance/settlementsРасчёт по заказам
GET /finance/statementМесячная выписка
GET /finance/paymentsОплаты картой

Webhook и события

МетодОписание
GET /webhooksСписок webhook
POST /webhooksРегистрация webhook {url, events[]}
DELETE /webhooks/{id}Отключить webhook
POST /webhooks/{id}/testОтправить тестовое событие
GET /webhooks/deliveriesЖурнал доставки
GET /eventsОчередь событий (cursor)

Отчёты

МетодОписание
GET /reports/salesОтчёт по продажам (groupBy=day|month|product|brand)
GET /reports/returnsДоля возвратов
GET /reports/catalogСостояние каталога
GET /reports/demandСпрос и товары без остатка

Корпоративный контур (ключ филиала)

МетодОписание
GET /customersКарточки клиентов
GET /customers/{id}/statementВыписка и баланс клиента
GET /accounting/receiptsКвитанции об оплате
GET /accounting/invoicesСчета продаж филиала
GET /salesmenНазначения торговых представителей

Коды ошибок

Ответ с ошибкой: { code, message, details[], requestId }. code стабилен; message — описание на английском языке.

{
  "code": "VALIDATION_FAILED",
  "message": "Request body validation failed",
  "details": [{ "field": "items.0.price", "code": "INVALID_FIELD", "message": "price must not be less than 0" }],
  "requestId": "7c0e1c5a-…"
}

Коды состояния HTTP

UNAUTHORIZED (401)Ключ недействителен или отсутствует
FORBIDDEN_SCOPE (403)Недостаточно прав
SELLER_KEY_REQUIRED (403)Сервису нужен ключ продавца; использован корпоративный ключ
CORPORATE_KEY_REQUIRED (403)Сервису нужен корпоративный ключ; использован ключ продавца
SANDBOX_READ_ONLY (403)Ключ песочницы не может изменять заказы, возвраты и счета; запросы каталога только проверяются
IP_NOT_ALLOWED (403)IP не в списке разрешённых
VALIDATION_FAILED (422)Недопустимая схема тела
PAYLOAD_TOO_LARGE (413)Превышен лимит записей
QUEUE_BUSY (429)Превышен лимит ожидающих пакетов; см. заголовок Retry-After
RATE_LIMITED (429)Превышена частота запросов
NOT_FOUND (404)Запись не найдена
STORAGE_UNAVAILABLE (503)Хранилище временно недоступно

Коды записей (отчёт об ошибках пакета)

SOURCEID_REQUIREDsourceId пуст
NAME_REQUIREDНет наименования активного товара
PRICE_NEGATIVE, STOCK_NEGATIVEОтрицательное или нечисловое значение
CURRENCY_INVALIDВалюта не TRY, USD или EUR
STATUS_INVALIDstatus не 0 или 1
UNKNOWN_SOURCEIDТовар не определён
INVALID_JSONСтрока не является корректным JSON
OEM_TOO_SHORT (предупреждение)Номер короче трёх символов пропущен
WAREHOUSE_STOCK_MISMATCH (предупреждение)Использована сумма по складам
DUPLICATE_SOURCEID (предупреждение)Использована последняя запись

Лимиты

  • Товары: 1 000 записей в запросе. Остатки и цены: 5 000 записей в запросе. Тело: 6 МБ.
  • Частота: 600 запросов в минуту на ключ. При превышении — 429.
  • Ожидающие пакеты: 10 на продавца. При превышении — 429.
  • Файл: без ограничения по записям, до 2 ГБ (gzip).
  • Адрес загрузки действителен 15 минут.

Журнал запросов

GET /v1/logs/requests возвращает запросы за последние 30 дней: метод, статус, длительность, requestId, batchId.

Справочник