Отзывы и комментарии
Списки ниже отдают уже опубликованные записи. Создание отзыва и комментария проходит проверки магазина: обязательные поля, модерацию и капчу.
Отзывы товара
GET /front_api/products/:product_id/reviews.json — массив, не больше 100 записей, свежие сверху. Для товара, который входит в группу объединённых карточек, в массив попадают отзывы всей группы.
| Параметр | Описание |
|---|---|
product_id обязательныйчисло |
id товара в пути. Для товара из группы объединённых карточек в массив попадают отзывы всей группы. |
const response = await fetch("/front_api/products/761/reviews.json", {
credentials: "same-origin",
headers: { Accept: "application/json" }
});
const reviews = await response.json();
Ответ · 200
[
{
"id": 1,
"product_id": 761,
"author": "Анна",
"content": "Отличный телефон, доставка быстрая.",
"email": "anna@example.com",
"rating": 5,
"published": true,
"manager_reply": null,
"replied_at": null,
"created_at": "2026-09-26T18:04:18.000+03:00",
"title": "Apple iPhone 16 128 ГБ",
"url": "/product/apple-iphone-16-128-gb"
}
]
В полном объекте есть ещё published_at, spam, manager_name и first_image товара.
Все отзывы магазина
GET /front_api/accounts/reviews.json
| Параметр | Описание |
|---|---|
page необязательныйчисло | Номер страницы. |
per_page необязательныйчисло | По умолчанию 20, максимум 100. |
rating необязательныйчисло | Оценка. |
created_asc необязательныйстрока | Значение asc ставит старые отзывы сверху. |
unique необязательныйстрока | Значение true оставляет один отзыв на товар. |
Ответ — массив того же вида, что и отзывы товара.
Отзывы о магазине
GET /front_api/accounts/shop_reviews.json принимает page, per_page, rating, created_asc.
| Параметр | Описание |
|---|---|
page необязательныйчисло |
Номер страницы. |
per_page необязательныйчисло |
Сколько отзывов вернуть. |
rating необязательныйчисло |
Оценка. |
created_asc необязательныйстрока |
Порядок по дате. |
const response = await fetch("/front_api/accounts/shop_reviews.json?per_page=2", {
credentials: "same-origin",
headers: { Accept: "application/json" }
});
const reviews = await response.json();
Ответ · 200
[
{
"id": 1,
"author": "Иван",
"content": "Удобный магазин.",
"email": "ivan@example.com",
"rating": 5,
"published": true,
"manager_reply": null,
"replied_at": null,
"created_at": "2026-09-26T18:04:18.000+03:00"
}
]
Создание: POST /shop_reviews.json с полями shop_review[author], shop_review[email], shop_review[content], shop_review[rating]. Успех выглядит как { "status": "ok", "message": "Отзыв успешно добавлен" }. Ошибки полей приходят объектом errors.
Создать отзыв о товаре
Адрес — POST /product/:permalink/reviews.json. Обязательны автор, email и текст. Если в магазине включена капча, без её решения отзыв не сохраняется. Ответ на запрос без решения капчи:
| Параметр | Описание |
|---|---|
review[author] обязательныйстрока |
Автор. |
review[email] обязательныйстрока |
Email. |
review[content] обязательныйстрока |
Текст отзыва. |
review[rating] необязательныйчисло |
Оценка. |
recaptcha_type необязательныйстрока |
Только для reCAPTCHA. У невидимой капчи значение invisible. |
g-recaptcha-response необязательныйстрока |
Токен reCAPTCHA. Его передают, когда в магазине выбран этот тип капчи. |
yandex-smart-token необязательныйстрока |
Токен Yandex SmartCaptcha. Его передают, когда в магазине выбран этот тип капчи. Имя совпадает со скрытым полем виджета. |
const csrfToken = document.querySelector('meta[name="csrf-token"]').content;
const body = new URLSearchParams({
"review[author]": "Пётр",
"review[email]": "petr@example.com",
"review[content]": "Хороший",
"review[rating]": "5"
});
const response = await fetch("/product/apple-iphone-16-128-gb/reviews.json", {
method: "POST",
credentials: "same-origin",
headers: {
Accept: "application/json",
"Content-Type": "application/x-www-form-urlencoded",
"X-CSRF-Token": csrfToken
},
body
});
const data = await response.json();
Ответ · 200
{
"errors": {
"captcha_solution": ["имеет неверное значение"]
}
}
Какое поле капчи передавать, зависит от типа капчи магазина. Для reCAPTCHA это g-recaptcha-response. На карточке товара эта капча невидимая: вместе с токеном передают recaptcha_type=invisible. Для Yandex SmartCaptcha это yandex-smart-token, поле recaptcha_type не нужно. Если нет ни того, ни другого поля, сервер ждёт картинку в review[captcha_solution]. Запрос без решения капчи отзыв не сохраняет и возвращает captcha_solution, как в примере выше.
Комментарии к статье
GET /front_api/articles/:article_id/comments.json принимает числовой id статьи.
| Параметр | Описание |
|---|---|
article_id обязательныйчисло |
Числовой id статьи в пути. |
const response = await fetch("/front_api/articles/1/comments.json", {
credentials: "same-origin",
headers: { Accept: "application/json" }
});
const comments = await response.json();
Ответ · 200
[
{
"id": 1,
"author": "Мария",
"email": "maria@example.com",
"content": "Полезная статья.",
"published": true,
"spam": false,
"created_at": "2026-09-26T18:04:39.000+03:00"
}
]
Создание идёт на адрес статьи, не на /front_api. У главного блога это POST /blog/:permalink/comments.json. У дополнительного блога в путь входит его handle: POST /blogs/:handle/:permalink/comments.json. Адрес без handle, например /blog/one-2/comments.json для статьи блога news, отвечает 404. Рабочий адрес этой статьи — /blogs/news/one-2/comments.json.
| Параметр | Описание |
|---|---|
comment[author] обязательныйстрока |
Автор. |
comment[email] обязательныйстрока |
Email. |
comment[content] обязательныйстрока |
Текст комментария. |
const csrfToken = document.querySelector('meta[name="csrf-token"]').content;
const body = new URLSearchParams({
"comment[author]": "Олег",
"comment[email]": "oleg@example.com",
"comment[content]": "Спасибо"
});
const response = await fetch("/blogs/news/one-2/comments.json", {
method: "POST",
credentials: "same-origin",
headers: {
Accept: "application/json",
"Content-Type": "application/x-www-form-urlencoded",
"X-CSRF-Token": csrfToken
},
body
});
const data = await response.json();
Ответ · 200
{
"comment": {
"id": 9,
"article_id": 1,
"author": "Олег",
"content": "Спасибо",
"email": "oleg@example.com",
"published": true,
"spam": false
}
}
Если проверка не проходит, ответ содержит объект errors с сообщениями полей.