Соглашения
Базовые правила, общие для всех endpoint’ов. Если в конкретном методе что-то не описано — значит работает по этому документу.
💡 Для значений ID, передаваемых в
*_id-поля (order_status_id,delivery_type_id,role_id,file_type_id, …), см. отдельный справочник Энумы.
Базовый URL
https://api.gigma.ru/api Все пути в документации указаны полностью (например https://api.gigma.ru/api/login), но в реальном клиенте обычно используется база https://api.gigma.ru/api + относительный путь endpoint’а.
Заголовки запроса
Минимальный набор для любого запроса с телом:
Accept: application/json
Content-Type: application/json Для авторизованных запросов добавляется:
Authorization: Bearer <access_token.value> Для загрузки файлов (POST /api/files, POST /api/orders/{id}/files, …) Content-Type меняется на multipart/form-data.
Авторизация
Получить токен:
POST /api/login(ERP) илиPOST /api/counterparty/login(E-Commerce).Сохранить
access_token.value(например в localStorage).Слать в каждом последующем запросе:
Authorization: Bearer <access_token.value>Окончание действия токена —
access_token.expires_at(ISO 8601). По истечению или после401 Unauthenticatedнужно повторить шаг 1.
Подробности — ERP/Авторизация и E-Commerce/Авторизация.
Формат Bearer-токена
Бэкенд — Laravel Sanctum. Каждый токен имеет вид:
<id>|<secret> Например: 28|dCWBGIqC9algoNXr6NVVg9D2fKWBaq7BJkRFyxq009cd040b
<id>— целое число переменной длины (1, 28, 1024, …). Это первичный ключ записи токена в БД.|— обязательный разделитель. Без него токен невалиден.<secret>— секретная часть, alphanumeric.
⚠ При хранении токена в файлах/таблицах/env-переменных следите за тем, чтобы
|не потерялся. CSV, INI-парсеры и некоторые шеллы могут его съесть. Корректное хранение: целиком в quoted-строке или в переменной.
Справочники: концепт → endpoint
Имена справочных endpoint’ов не всегда предсказуемы (например, единицы измерения это /api/storage_units, а не /api/units). Полная карта:
| Концепт | Endpoint | Описание |
|---|---|---|
| Статусы заказов | GET /api/order_statuses | См. Энумы |
| Способы доставки | GET /api/delivery_types | + подтипы /api/delivery_types/{id}/subtypes |
| Способы оплаты | GET /api/payment_types | — |
| Типы контрагентов | GET /api/counterparty_types | Физлицо / юрлицо / розница |
| Менеджеры | GET /api/managers | Упрощённый список для фильтров |
| Ответственные | GET /api/responsible_users | Для фильтра «Ответственный» в бизнесах |
| Поиск пользователей | GET /api/users?query=… | Полный объект, с ролью и filiale |
| Роли | GET /api/roles | См. Энумы |
| Права доступа | GET /api/permissions | См. Энумы |
| Экраны | GET /api/screens | См. Энумы |
| Отделы | GET /api/departments | — |
| Бизнесы | GET /api/branches | НЕ /api/businesses |
| Города | GET /api/cities | — |
| Страны | GET /api/countries | — |
| Бренды | GET /api/brands | — |
| Категории | GET /api/categories | — |
| Объекты | GET /api/objects | — |
| Типы номенклатуры | GET /api/nomenclature_types | — |
| Виды номенклатуры | GET /api/nomenclature_kinds | НЕ /api/kinds, НЕ /api/nomenclatures/kinds |
| Единицы измерения | GET /api/storage_units | НЕ /api/units |
| Ставки НДС | GET /api/vats | НЕ /api/vat |
| Каналы продаж | GET /api/sales_channels | — |
| Стратегии продаж | GET /api/sales_strategies | См. ERP/Стратегии продаж |
| Типы файлов | GET /api/file_types | См. Энумы |
| Типы страниц | GET /api/page_types | — |
| Поиск адреса | POST /api/search_address | Тело: { query } |
| Поиск банка | POST /api/search_bank | Тело: { query } |
| Поиск компании | POST /api/search_company | Тело: { field: "name"\|"inn"\|"ogrn", query } |
| Меню (текущего юзера) | GET /api/menus, GET /api/menus/default/items | См. ERP/Меню |
Карта живая — список справочников может расти. Если нужного концепта нет в таблице, не угадывайте plural/singular — спросите бэк.
Форматы данных
| Тип | Формат | Пример |
|---|---|---|
| Дата | ISO 8601 (YYYY-MM-DD) | "2024-04-02" |
| Дата + время | ISO 8601 с микросекундами в UTC | "2024-04-03T07:07:11.000000Z" |
| Числа | JSON number (без кавычек) или string для «денежных» (см. ниже) | 42, "2100.00" |
| Денежные суммы | Часто приходят как строка с фиксированной точностью | "2100.00" |
| Boolean | true / false, иногда 1 / 0 для legacy-полей (например is_active) | true, 1 |
| Локаль | ru-RU (русский интерфейс) | — |
| Кодировка | UTF-8 везде, в JSON | — |
| Идентификаторы | int (auto-increment) | 42 |
Пагинация
Используется стандартный Laravel-пагинатор. Endpoint’ы вида GET /api/tables/... и GET /api/.../history возвращают пагинацию.
Query-параметры
page(int, опционально) — номер страницы (с 1)per_page(int, опционально) — размер страницы (по умолчанию 15)
Структура ответа
{
"items": [ /* массив записей */ ],
"pagination": {
"total": 42,
"per_page": 15,
"current_page": 1,
"last_page": 3,
"from": 1,
"to": 15
}
} Для history-endpoint’ов пагинатор может приходить в развёрнутом виде с links[], first_page_url, next_page_url и т.п. — см. ERP/Контрагенты → история.
Фильтры
Передаются как query-параметры. Соглашения:
| Тип фильтра | Формат | Пример |
|---|---|---|
| Простое поле | ?field=value | ?is_company=true |
| Массив | ?field[]=v1&field[]=v2 | ?counterparty_type_id[]=2&counterparty_type_id[]=3 |
| Диапазон дат | ?date_from=YYYY-MM-DD&date_to=YYYY-MM-DD | ?date_from=2024-01-01&date_to=2024-12-31 |
| Сравнение | ?credit_gt=100&credit_lt=1000 | _gt = greater, _lt = less |
| Поиск | ?query=строка | ?query=иванов |
Кириллица в query должна быть URL-encoded.
Коды ответа
| Код | Когда | Тело |
|---|---|---|
| 200 OK | Успешное чтение или обновление | endpoint-specific |
| 201 Created | Успешное создание объекта (POST на коллекцию) | endpoint-specific, обычно сам объект |
| 204 No Content | Успешное удаление без тела ответа | пустое (агент должен НЕ парсить тело) |
| 401 Unauthenticated | Нет / невалидный / протухший токен | { "message": "Unauthenticated." } — нужно перелогиниться |
| 403 Forbidden | Токен валидный, но нет прав | { "message": "..." } — обычно проверить permissions пользователя |
| 422 Unprocessable Entity | Валидация полей не прошла | { "errors": { "field_name": ["сообщение"] }, "message": "..." } |
| 429 Too Many Requests | Превышение rate limit | { "message": "Too Many Attempts." } |
| 500 Internal Server Error | Внутренняя ошибка | { "message": "Server error" } (без подробностей в проде) |
⚠ Не делайте жёсткой проверки
status === 200на write-запросах —POST /api/<resource>обычно возвращает 201, аDELETE— 204. Используйте диапазон2xx.
Пример 422
{
"errors": {
"password": ["The password field is required."],
"phone_1": ["The phone 1 must be at least 11 characters."],
"products.0.id": ["The selected products.0.id is invalid."]
},
"message": "The given data was invalid."
} Ключи могут быть вложенными через точку (
products.0.id) — для массивов в теле. Per-method примеры реальных ключей — в соответствующих endpoint’ах.
Обработка на стороне клиента
В event_ai (admin-фронт) принят такой паттерн (src/Redux/api/index.ts):
- На 401 Unauthenticated — очистить localStorage, редирект на
/authentication/sign-in. - На 403 — редирект на
/profileчерез 3 секунды. - На 422 — показать пользователю по полям из
errors. - На остальные
4xx/5xxс{ message }— показать toast.
Rate limits
Бэкенд использует стандартный Laravel-throttle (throttle:api middleware). Дефолт фреймворка — 60 запросов в минуту на пользователя/IP. Точное значение в проде не подтверждено; для надёжности закладывайте backoff:
- При 429 ждать минимум 60 секунд (или значение из
Retry-Afterесли придёт). - Для массовых импортов — не более 1 запроса в секунду на токен.
Идемпотентность
Стандартной поддержки Idempotency-Key нет. POST-запросы создания объектов не идемпотентны: повторный вызов создаст дубль.
Безопасно повторять:
GET— всегдаDELETE— да (вторая попытка вернёт 404, но состояние корректно)PUT— да, заменяет объект целиком
Требует осторожности:
POSTна коллекцию — НЕ повторять без проверки, что прошлый запрос провалился до создания объекта
Webhooks
Не поддерживаются. Бэкенд не отправляет push-уведомления о смене состояния заказов / контрагентов / номенклатуры.
Для отслеживания изменений — polling через GET-endpoint раз в N секунд. Адекватный интервал — 30–60 секунд (учитывая rate limit).
Версионирование URL
URL не версионируется. Префикса вида /api/v1/… или /api/v2/… нет — все endpoint’ы живут под единым корнем https://api.gigma.ru/api.
Изменения API накатываются прямо на этот корень; следить за breaking changes можно через release notes на docs.gigma.ru (когда появятся) или эмпирически — мониторингом 4xx/5xx на ключевых endpoint’ах.