Каталог, тарифы и цены
Этот раздел нужен для двух разных витрин:
- обычный каталог — товары или услуги, которые попадают в корзину и обычный заказ;
- подписочный каталог — тарифы, которые оформляются через checkout подписки.
Публичный каталог требует App Token. Избранное дополнительно требует Counterparty Bearer, потому что принадлежит конкретному клиенту.
Как выбрать endpoint подписочного каталога
| Endpoint | Когда использовать |
|---|---|
subscription-catalog | основной вариант; ответ сам становится сгруппированным, если в каталоге есть варианты периода |
subscription-catalog/grouped | интерфейс всегда ожидает группы и массив variants |
subscription-plans | нужен плоский список с slug, числовым amount и периодом |
Все три endpoint читают тарифы текущего Application. Это разные представления одного каталога, а не независимые наборы тарифов.
Получение подписочного каталога
- Метод
- GET
- URL
https://api.gigma.ru/api/counterparty/subscription-catalog- Авторизация
- App Token
- Headers
Token: {application_token}- Успешный ответ
200
Ответ
Если в каталоге нет дочерних вариантов, data содержит плоские тарифы:
{
"data": [
{
"id": 34780,
"name": "Базовый",
"description": "Доступ к сервису",
"avatar_url": null,
"price": "490.00",
"currency": "RUB",
"billing_period_months": 1
}
]
} Если есть хотя бы один дочерний вариант, весь ответ переводится в групповой формат:
{
"data": [
{
"id": 34780,
"name": "Базовый",
"description": "Доступ к сервису",
"avatar_url": null,
"price": "490.00",
"currency": "RUB",
"billing_period_months": 1,
"variants": [
{
"id": 34780,
"label": "1 месяц",
"price": "490.00",
"currency": "RUB",
"billing_period_months": 1
},
{
"id": 34786,
"label": "3 месяца",
"price": "1290.00",
"currency": "RUB",
"billing_period_months": 3
}
]
}
]
} При включённом управляемом каталоге возвращаются только активные тарифы, назначенные текущему Application. Если назначений нет, data будет пустым массивом. В режиме совместимости backend может вернуть все подписочные тарифы проекта.
Для оформления передайте ID выбранного тарифа в POST /api/counterparty/subscriptions/checkout.
Ошибки
401— App Token отсутствует или не распознан;429— превышен лимит 60 запросов в минуту.
Получение всегда сгруппированного каталога
- Метод
- GET
- URL
https://api.gigma.ru/api/counterparty/subscription-catalog/grouped- Авторизация
- App Token
- Headers
Token: {application_token}- Успешный ответ
200
Endpoint всегда возвращает группы с массивом variants, даже когда вариант у тарифа один. Поля и правила доступности совпадают с subscription-catalog.
Ответ
{
"data": [
{
"id": 34780,
"name": "Базовый",
"price": "490.00",
"currency": "RUB",
"billing_period_months": 1,
"variants": [
{
"id": 34780,
"label": "1 месяц",
"price": "490.00",
"currency": "RUB",
"billing_period_months": 1
}
]
}
]
}Получение плоских планов подписки
- Метод
- GET
- URL
https://api.gigma.ru/api/counterparty/subscription-plans- Авторизация
- App Token
- Headers
Token: {application_token}- Успешный ответ
200
Ответ
{
"data": [
{
"name": "Базовый",
"slug": "nomenclature-34780",
"amount": 490,
"currency": "RUB",
"period_months": 1
}
]
} В этом представлении amount — число. slug номенклатурного тарифа имеет формат nomenclature-{id} и может использоваться при создании подписки с сохранённым способом оплаты.
Обычный каталог
Получение списка товаров
- Метод
- GET
- URL
https://api.gigma.ru/api/counterparty/products- Авторизация
- App Token
- Headers
Token: {application_token}- Успешный ответ
200
Параметры запроса
page(integer, опционально) — номер страницы, по умолчанию1;per_page(integer, опционально) — размер страницы, по умолчанию10;query(string, опционально) — поиск по названию, 1–255 символов;category_id[](integer[], опционально) — категории;brand_id[](integer[], опционально) — бренды;country_id[](integer[], опционально) — страны;tag_id[](integer[], опционально) — теги;order_by(string, опционально) —name_asc,name_desc,popularity_asc,popularity_desc,price_ascилиprice_desc;price_from(number, опционально) — нижняя граница цены, от0;price_to(number, опционально) — верхняя граница цены, от1.
Параметры available и sale текущим backend не поддерживаются и не влияют на выборку.
Пример запроса
GET /api/counterparty/products?page=1&per_page=20&category_id[]=12&tag_id[]=4&order_by=price_asc HTTP/1.1
Host: api.gigma.ru
Token: <application_token>
Accept: application/json Ответ
{
"products": {
"current_page": 1,
"data": [
{
"id": 26896,
"views_count": 23,
"photo": "https://api.gigma.ru/storage/uploads/product.png",
"photos": [],
"name": "Товар",
"brand": {
"id": 99,
"name": "Бренд"
},
"old_price": "2450.00",
"price": "1960.00",
"discount": 20,
"quantity": 5,
"unit": null,
"is_favourite": false,
"tags": [],
"parameters": {
"wholesale": false,
"pieces_per_pack": 1,
"quantity_pack": 5
}
}
],
"per_page": 20,
"total": 1,
"last_page": 1
}
} price — строка с двумя десятичными знаками. quantity и parameters.quantity_pack рассчитываются из доступного остатка. is_favourite имеет смысл после авторизации клиента; для публичного запроса значение обычно false.
Ошибки
401— проверьте App Token;422— один из фильтров имеет неверный формат или ссылается на несуществующий ID.
Получение карточки товара
- Метод
- GET
- URL
https://api.gigma.ru/api/counterparty/products/{id}- Авторизация
- App Token
- Headers
Token: {application_token}- Успешный ответ
200
Возвращает расширенную карточку: описание, характеристики, фотографии, цену, остаток, теги и параметры упаковки.
Пример запроса
GET /api/counterparty/products/26896 HTTP/1.1
Host: api.gigma.ru
Token: <application_token>
Accept: application/json Ответ
{
"product": {
"id": 26896,
"name": "Товар",
"description": "<p>Описание</p>",
"specification": "<p>Характеристики</p>",
"price": "1960.00",
"quantity": 5,
"photos": [],
"is_favourite": false,
"share_link": null,
"tags": [],
"parameters": {
"wholesale": false,
"pieces_per_pack": 1,
"quantity_pack": 5
}
}
} Backend увеличивает views_count не чаще одного раза за 10 минут для одного IP и товара.
Ошибки
401— App Token отсутствует или недействителен;404— товара с таким ID нет.
Получение диапазона цен
- Метод
- GET
- URL
https://api.gigma.ru/api/counterparty/prices- Авторизация
- App Token
- Headers
Token: {application_token}- Успешный ответ
200
Параметры запроса
Endpoint принимает те же товарные фильтры, что и список товаров; page и per_page не влияют на результат:
query(string, опционально) — поиск по названию, 1–255 символов;category_id[](integer[], опционально) — категории;brand_id[](integer[], опционально) — бренды;country_id[](integer[], опционально) — страны;tag_id[](integer[], опционально) — теги;order_by(string, опционально) —name_asc,name_desc,popularity_asc,popularity_desc,price_ascилиprice_desc;price_from(number, опционально) — нижняя граница цены, от0;price_to(number, опционально) — верхняя граница цены, от1.
Ответ
{
"min_price": 100,
"max_price": 10000
} Если подходящих товаров нет, обе границы возвращаются как 0.
Избранное клиента
Все методы ниже требуют App Token и Counterparty Bearer.
Получение избранных товаров
- Метод
- GET
- URL
https://api.gigma.ru/api/counterparty/products/favourites- Авторизация
- App Token + Bearer token
- Headers
Token: {application_token}; Authorization: Bearer {counterparty_token}- Успешный ответ
200
Параметры запроса
page(integer, опционально) — номер страницы, по умолчанию1;per_page(integer, опционально) — размер страницы, по умолчанию10.
Ответ
{
"products": {
"current_page": 1,
"data": [
{
"id": 26896,
"name": "Товар",
"price": "1960.00",
"is_favourite": true
}
],
"per_page": 10,
"total": 1,
"last_page": 1
}
} Backend формирует список по избранному текущего клиента и затем вручную применяет пагинацию.
Получение карточки товара через маршрут избранного
- Метод
- GET
- URL
https://api.gigma.ru/api/counterparty/products/favourites/{product_id}- Авторизация
- App Token + Bearer token
- Headers
Token: {application_token}; Authorization: Bearer {counterparty_token}- Успешный ответ
200
Текущий runtime возвращает карточку товара по ID, но не проверяет, находится ли товар в избранном текущего клиента. Для обычной карточки используйте GET /api/counterparty/products/{id}, а принадлежность избранному определяйте по списку GET /api/counterparty/products/favourites.
Ответ
{
"product": {
"id": 26896,
"name": "Товар",
"price": "1960.00",
"is_favourite": false
}
} Ошибки
404— товара с таким ID нет. Отсутствие товара в избранном само по себе404не вызывает.
Добавление товара в избранное
- Метод
- POST
- URL
https://api.gigma.ru/api/counterparty/products/favourites- Авторизация
- App Token + Bearer token
- Headers
Token: {application_token}; Authorization: Bearer {counterparty_token}- Успешный ответ
200
Параметры запроса
product_id(integer, обязательно) — ID существующего товара.
Пример запроса
{
"product_id": 26896
} Ответ
{
"product": {
"id": 26896,
"name": "Товар",
"price": "1960.00",
"is_favourite": true
}
} Операция идемпотентна на уровне пары клиент–товар: повторный запрос не создаёт вторую запись и возвращает текущую карточку product.
Удаление товара из избранного
- Метод
- DELETE
- URL
https://api.gigma.ru/api/counterparty/products/favourites/{product_id}- Авторизация
- App Token + Bearer token
- Headers
Token: {application_token}; Authorization: Bearer {counterparty_token}- Успешный ответ
200
В path передаётся ID товара, а не ID записи избранного.
Ответ
{
"message": "Product successfully deleted from favourites"
} Если товар не находится в избранном текущего клиента, API вернёт 404.
Следующий шаг
- Для обычной покупки перейдите к заказам и подпискам.
- Для фильтров, доставки, оплаты и магазинов используйте справочники витрины.
- Для работы с избранным сначала подключите вход клиента.