Skip to content

Работа с API ​

Integration API — это поверхность, через которую ваша интеграция читает и изменяет данные клиента. Один базовый URL, один формат ответа и 464 эндпоинта.

СредаБазовый URL
Продакшнhttps://api.bito.uz/integration-api/integration/api/v2/
Девhttps://api.systematicdev.uz/integration-api/integration/api/v2/

Полный список методов со схемами запроса и ответа — в справочнике API.

Два способа авторизации ​

Оба ведут к одним и тем же эндпоинтам и данным. Выбор зависит от того, скольким клиентам вы служите.

API-ключOAuth 2.0
Заголовокapi-key: <username>:<secret>Authorization: Bearer <access_token>
Для скольких аккаунтовОдин — вашМного
Срок действияБессрочноAccess 24 ч, refresh 90 дней
НастройкаСкопировать из интеграцииКлиент устанавливает и подтверждает
Когда использоватьСвой бэкофис, скрипты, интеграция для одного клиентаИнтеграции для маркетплейса

API-ключ ​

Отправляйте api_key в заголовке api-key. Ни обмена токенами, ни срока действия.

http
POST https://api.bito.uz/integration-api/integration/api/v2/product/get-paging
api-key: mycompany:9ad41c0e7b3f28d5610ac94e7f1b26d8
Content-Type: application/json

{ "page": 1, "limit": 20 }

OAuth 2.0 ​

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

http
POST https://api.bito.uz/integration-api/integration/api/v2/product/get-paging
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json

{ "page": 1, "limit": 20 }

Как получить токен — в разделе OAuth 2.0: обзор.

Что нужно знать заранее ​

HTTP-методы ​

Метод — часть контракта каждого эндпоинта:

МетодДля чегоПример
POSTСоздание записи и любой запрос списка или фильтрацииPOST /product/create, POST /product/get-paging
PUTИзменение записи или смена её статусаPUT /product/update, PUT /production-operation/set-state
GETЧтение одной записи по id и запросы без телаGET /product/get-by-id/{id}, GET /product/get-deleted
DELETEУдаление записиDELETE /product/delete/{id}

Списки идут через POST, потому что фильтры передаются телом JSON, а не строкой запроса. Метод каждого эндпоинта указан на его странице в справочнике API.

WARNING

Админский API Bito — тот, с которым работает веб-панель, — принимает только POST. Integration API устроен иначе, не переносите это допущение.

Заголовки запроса ​

ЗаголовокОбязателенОписание
api-key или AuthorizationДаОдин из двух способов авторизации выше
Content-TypeДаapplication/json
Accept-LanguageНетuz, uz_cyrillic, ru, en, kk, tg, ky. По умолчанию uz. Задаёт язык поля message.
organization_idНетОрганизация внутри аккаунта. Используется, только если в настройках интеграции (fields) есть поле organization_id, — иначе заголовок игнорируется. Если заголовок не передан, берётся значение этого поля.
warehouse_idНетСклад. Используется, только если в настройках интеграции (fields) есть поле warehouse_id, — иначе заголовок игнорируется. Если заголовок не передан, берётся значение этого поля.
price_idНетПрайс-лист для цен. Используется, только если в настройках интеграции (fields) есть поле price_id, — иначе заголовок игнорируется. Если заголовок не передан, берётся значение этого поля.
role_idНетРоль, от которой выполняется запрос. Используется, только если в настройках интеграции (fields) есть поле role_id, — иначе заголовок игнорируется. Если заголовок не передан, берётся значение этого поля.
user_idНетВыполнить запрос от имени этого пользователя. Пользователь должен принадлежать этому аккаунту и не быть заблокирован, иначе запрос отклоняется. Если не передан — от имени владельца аккаунта.

Формат ответа ​

Любой ответ, успешный или нет, имеет одну и ту же структуру.

json
{
    "code": 0,
    "message": "Success",
    "status_code": 200,
    "messages": { "uz": "Muvaffaqiyatli", "ru": "Успешно", "en": "Successful" },
    "data": { },
    "time": "2025-05-01T12:00:00Z"
}
ПолеЗначение
code0 при успехе, иначе код ошибки. Ветвитесь по нему.
messageТекст на языке из Accept-Language. Не разбирайте его.
messagesТот же текст на uz, ru и en.
status_codeHTTP-статус.
dataПолезная нагрузка. При ошибке отсутствует.
timeВремя сервера, ISO 8601.

Постраничная выборка ​

Каждый эндпоинт get-paging принимает page и limit и возвращает общее количество рядом с записями.

Запрос

json
{ "page": 1, "limit": 50 }
ПолеТипПо умолчаниюОграничения
pagenumber1≥ 1
limitnumber20от 1 до 200

Ответ

json
{
    "code": 0,
    "message": "Success",
    "status_code": 200,
    "data": {
        "total": 1043,
        "data": [ { "_id": "6712f0a9c4d1e87b3a0f9911", "name": "Эспрессо" } ]
    },
    "time": "2025-05-01T12:00:00Z"
}

Обратите внимание на вложенность: записи лежат в data.data, количество — в data.total. Листайте, пока page * limit >= total.

TIP

Большинство get-paging принимают фильтры рядом с page/limit — в частности updated_at позволяет забрать только то, что изменилось с прошлой синхронизации. Смотрите нужный метод в справочнике API.

Удаление всегда мягкое ​

Bito не удаляет записи физически: вызов delete помечает запись удалённой. Для вас это значит две вещи — у большинства ресурсов есть эндпоинт get-deleted, а сохранённый id может вернуться как удалённый, а не исчезнуть.

Идентификаторы ​

Любой _id — это 24-символьный MongoDB ObjectId, например 6712f0a9c4d1e87b3a0f9911. Считайте его непрозрачной строкой.

Ошибки ​

Ответ с ошибкой содержит ненулевой code и не содержит data.

json
{
    "code": 401,
    "message": "Unauthorized user",
    "status_code": 401,
    "messages": { "uz": "...", "ru": "...", "en": "Unauthorized user" },
    "time": "2025-05-01T12:00:00Z"
}
HTTPЧто произошлоЧто делать
400Не прошла валидация или указанной записи нетПрочитайте message, исправьте тело запроса
401Ключ отсутствует, некорректен или истёкПроверьте заголовок, обновите токен
403У интеграции нет прав на это действиеВ сообщении указан нужный ключ права; добавьте его в required_permissions
404Такого эндпоинта нетСверьте путь со справочником API
429Слишком много запросовСнизьте частоту и повторите
500Сбой на стороне BitoПовторите с задержкой; если повторяется — напишите в поддержку

WARNING

Не повторяйте 400 без изменений и не повторяйте запись вслепую: большинство методов записи не идемпотентны, поэтому повторный create создаст вторую запись.

Дальше ​

Bito 2.0 Integration API