Коллекции
Два похожих адреса отдают разное.
GET /collection/:permalink.json отдаёт товары: название, цену, ссылку. Каталог запрашивает его, когда подгружает следующую страницу.
GET /front_api/collection/:permalink.json сами товары не отдаёт. В ответе id товаров и пункты фильтра, например «Цвет» и сколько товаров у каждого цвета. Товары по этим id запрашивают отдельно, см. список товаров.
Товары коллекции
Параметры те же, что у страницы каталога: page, page_size, order, price_min, price_max, characteristics[], options[id свойства][], only_available, q.
filters_only=1 убирает товары и оставляет status, count и properties. count_only=1 оставляет status и count.
| Параметр | Описание |
|---|---|
page необязательныйчисло |
Номер страницы каталога. |
page_size необязательныйчисло |
Сколько товаров вернуть на странице. |
order необязательныйстрока |
Порядок товаров. |
price_min необязательныйчисло |
Нижняя граница цены. |
price_max необязательныйчисло |
Верхняя граница цены. |
characteristics[] необязательныйчисло |
Повторяющийся id характеристики. |
options[id свойства][] необязательныйчисло |
Повторяющийся id значения свойства. |
only_available необязательныйстрока |
Только товары в наличии. |
q необязательныйстрока |
Поиск внутри коллекции. |
filters_only необязательныйстрока |
Значение 1 убирает товары и оставляет status, count и properties. |
count_only необязательныйстрока |
Значение 1 оставляет status и count. |
const params = new URLSearchParams({ page: "1", page_size: "1" });
const response = await fetch(`/collection/telefony.json?${params}`, {
credentials: "same-origin",
headers: { Accept: "application/json" }
});
const data = await response.json();
Ответ · 200
{
"status": "ok",
"count": 30,
"products": [
{
"id": 673,
"title": "Apple iPhone 16 Pro Max 1 ТБ",
"permalink": "apple-iphone-16-pro-max-1-tb",
"url": "/product/apple-iphone-16-pro-max-1-tb",
"available": true,
"price_min": 179990.0,
"price_max": 179990.0,
"variants": []
}
]
}
Поля товара те же, что в списке товаров: картинки, свойства, модификации. count — сколько товаров подходит под фильтр, а не сколько объектов лежит в products.
Фильтр и id товаров
Названия и цены товаров в ответе нет. products_ids — их id на этой странице, в примере 673, 681, 689. options описывает фильтр по модификациям: группа «Цвет», значение «Чёрный», products_count равен 12 — столько товаров коллекции с этим цветом. properties устроен так же для свойств товара, в примере список пуст.
| Параметр | Описание |
|---|---|
price_min необязательныйчисло |
Нижняя граница цены. |
price_max необязательныйчисло |
Верхняя граница цены. |
characteristics необязательныйчисло |
Повторяющийся параметр характеристики. |
options[id свойства][] необязательныйчисло |
Значения свойства. |
properties_gt[id] необязательныйчисло |
Нижняя граница числового свойства. |
properties_lt[id] необязательныйчисло |
Верхняя граница числового свойства. |
only_available необязательныйстрока |
Значение true оставляет товары в наличии. |
q необязательныйстрока |
Поиск внутри коллекции. |
max_filter_items необязательныйчисло |
Сколько значений отдать в одной группе фильтра. |
const response = await fetch("/front_api/collection/telefony.json", {
credentials: "same-origin",
headers: { Accept: "application/json" }
});
const data = await response.json();
Ответ · 200
{
"status": "ok",
"count": 30,
"products_price_min": 27990.0,
"products_price_max": 179990.0,
"current_price_min": 27990.0,
"current_price_max": 179990.0,
"products_ids": [673, 681, 689],
"properties": [],
"options": [
{
"id": 2517840,
"title": "Цвет",
"values": [
{
"id": 21063191,
"title": "Чёрный",
"permalink": "chyornyy",
"products_count": 12,
"selected": false,
"image_url": null
}
]
}
]
}
Тот же адрес с суффиксом фильтра, /front_api/collection/telefony/chernye-telefony.json, сужает выборку. У выбранных значений selected становится true. Неизвестный пермалинк коллекции отвечает { "status": "not_found" }.
Цены фильтра: price_min, price_max. Характеристики: повторяющийся параметр characteristics. Значения свойств: options[id свойства][]. Числовые свойства: properties_gt[id] и properties_lt[id]. Наличие: only_available=true. Поиск внутри коллекции: q. Сколько значений отдать в одной группе фильтра: max_filter_items.
Значения одного фильтра
option_ids или property_ids — id свойства, одно число. Ответ короче полного фильтра: только запрошенные группы.
| Параметр | Описание |
|---|---|
option_ids необязательныйчисло |
id свойства-опции. В запросе одно число, вместе с property_ids или вместо него. |
property_ids необязательныйчисло |
id свойства. В запросе одно число. |
const response = await fetch("/front_api/fetch/telefony/items.json?option_ids=2517840", {
credentials: "same-origin",
headers: { Accept: "application/json" }
});
const data = await response.json();
Ответ · 200
{
"status": "ok",
"options": [
{
"id": 2517840,
"title": "Цвет",
"values": [
{
"id": 21063191,
"title": "Чёрный",
"products_count": 12,
"selected": false
}
]
}
],
"properties": []
}
SEO-фильтр
Нужен, чтобы восстановить отмеченные значения фильтра из человекочитаемого адреса. version сравнивают с версией фильтра на странице: если она устарела, фильтр запрашивают снова.
| Параметр | Описание |
|---|---|
permalink обязательныйстрока |
Адрес коллекции в пути. |
filter обязательныйстрока |
Адрес SEO-фильтра в пути. |
const response = await fetch(
"/front_api/collections/telefony/collection_filters/chernye-telefony.json",
{ credentials: "same-origin", headers: { Accept: "application/json" } }
);
const filter = await response.json();
Ответ · 200
{
"id": 1,
"permalink": "chernye-telefony",
"version": 1790435079,
"characteristics": [],
"option_values": [
{ "id": 21063191, "option_name_id": 2517840 }
]
}
option_values[].id подставляют в options[option_name_id][] запроса коллекции. characteristics[].id — в параметр characteristics.
Коллекции по id
ids — id через запятую, не больше 100. Флаги menu_image, description и products_count равны строке true. Значение 1 эти поля не включает. fields — пермалинки доп. полей через запятую.
image_resizing_rules[size] добавляет в картинку меню объект resized_urls. Без валидного size этого объекта нет, ошибки тоже нет.
| Параметр | Описание |
|---|---|
ids обязательныйстрока |
id коллекций через запятую, не больше 100. |
menu_image необязательныйстрока |
Строка true включает картинку меню. Значение 1 поле не включает. |
description необязательныйстрока |
Строка true включает описание. Значение 1 поле не включает. |
products_count необязательныйстрока |
Строка true включает число товаров. Значение 1 поле не включает. |
fields необязательныйстрока |
Пермалинки дополнительных полей через запятую. |
image_resizing_rules[size] необязательныйстрока |
Добавляет в картинку меню объект resized_urls. Без валидного size объекта нет, ошибки тоже нет. |
const params = new URLSearchParams({
ids: "53486014",
description: "true",
products_count: "true",
menu_image: "true"
});
const response = await fetch(`/front_api/collections.json?${params}`, {
credentials: "same-origin",
headers: { Accept: "application/json" }
});
const data = await response.json();
Ответ · 200
{
"collections": [
{
"id": 53486014,
"parent_id": 53486010,
"url": "/collection/telefony",
"title": "Телефоны",
"has_subcollections": false,
"menu_image": null,
"description": "Каталог смартфонов Apple iPhone.",
"products_count": 30
}
]
}
menu_image: null — у коллекции нет картинки. Если картинка есть, в объекте будут её URL.
Подкатегории
id=-1 — дети корневой категории. Другой id — дети этой коллекции.
| Параметр | Описание |
|---|---|
id обязательныйчисло |
id коллекции. Значение -1 — дети корневой категории. |
const response = await fetch("/front_api/collections/subcollections.json?id=-1", {
credentials: "same-origin",
headers: { Accept: "application/json" }
});
const data = await response.json();
Ответ · 200
{
"collections": [
{
"id": 53486014,
"parent_id": 53486010,
"url": "/collection/telefony",
"title": "Телефоны",
"has_subcollections": false
}
]
}
Меню каталога
start_level и end_level задают глубину, по умолчанию 1 и 2. menu_image_for_level — уровни, для которых нужна картинка. На промежуточных уровнях в ответе есть subcollections.
| Параметр | Описание |
|---|---|
start_level необязательныйчисло |
Начальная глубина. По умолчанию 1. |
end_level необязательныйчисло |
Конечная глубина. По умолчанию 2. |
menu_image_for_level необязательныйстрока |
Уровни, для которых нужна картинка. |
const response = await fetch("/front_api/collections/menu.json?start_level=1&end_level=2", {
credentials: "same-origin",
headers: { Accept: "application/json" }
});
const data = await response.json();
Ответ · 200
{
"collections": [
{
"id": 53486014,
"parent_id": 53486010,
"url": "/collection/telefony",
"title": "Телефоны",
"has_subcollections": false,
"menu_image": null,
"subcollections": []
}
]
}
Плоское меню
GET /front_api/fetch/menu.json возвращает другой объект: поле menu, без вложенных детей. Параметры level и parent_id ограничивают уровень.
{
"menu": [
{
"id": 53486014,
"permalink": "telefony",
"parent_id": 53486010,
"title_translations": "Телефоны",
"position": 10,
"level_cached": 1,
"children_count": 0
}
]
}