Skip to content

Отзывы и комментарии

Списки ниже отдают уже опубликованные записи. Создание отзыва и комментария проходит проверки магазина: обязательные поля, модерацию и капчу.

Отзывы товара

GET /front_api/products/:product_id/reviews.json — массив, не больше 100 записей, свежие сверху. Для товара, который входит в группу объединённых карточек, в массив попадают отзывы всей группы.

GET/front_api/products/761/reviews.json
Параметр Описание
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.

GET/front_api/accounts/shop_reviews.json?per_page=2
Параметр Описание
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 и текст. Если в магазине включена капча, без её решения отзыв не сохраняется. Ответ на запрос без решения капчи:

POST/product/apple-iphone-16-128-gb/reviews.json
Параметр Описание
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 статьи.

GET/front_api/articles/1/comments.json
Параметр Описание
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.

POST/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 с сообщениями полей.