Каталог, тарифы и цены

Этот раздел нужен для двух разных витрин:

  • обычный каталог — товары или услуги, которые попадают в корзину и обычный заказ;
  • подписочный каталог — тарифы, которые оформляются через 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.

Следующий шаг

© 2026 Gigma