---
title: "Синхронизация отзывов: поток изменений с курсором"
method: GET
path: "/v3/reviews/sync"
tags: ["reviews"]
---

# Синхронизация отзывов: поток изменений с курсором

`GET /v3/reviews/sync`

## Request

- Base URL: `https://api.rewio.ru`
- URL: `https://api.rewio.ru/v3/reviews/sync`
- Auth: API key in header `X-API-Key`

Отзывы, изменившиеся у нас после точки, на которой вы остановились.

Первый запрос — с адресом (`object_id` или `folder_id`), дальше достаточно
`cursor` из предыдущего ответа. `next_cursor` приходит **всегда**, в том
числе на последней и на пустой странице: это закладка, которую вы храните
между прогонами.

Порядок фиксирован (от давних изменений к свежим) и не настраивается,
фильтров нет. Строки могут повторяться между страницами — применяйте upsert
по `id`, потерять строку поток не может.

## Query parameters

- `folder_id` integer, nullable: Синхронизировать папку целиком: все объекты папки и её подпапок. Взаимоисключима с `object_id` — ровно один из двух.
- `cursor` string, nullable: Курсор из `next_cursor` предыдущего ответа. С ним остальные параметры можно не передавать — адресат, режим и размер страницы запечены внутри.
- `mode` string, nullable: Что присылать: * `all` (по умолчанию) — и новые отзывы, и изменения. Полная актуальная копия. * `new` — только впервые появившиеся отзывы. Правки, ответы и пропажи не приходят; каждый отзыв приходит один раз в жизни, апсерт не нужен. Режима «только изменения» нет намеренно: клиенту, который уже догнал текущее состояние, режим `all` ровно его и отдаёт — новых пока нет, приходят одни правки.
- `limit` integer, nullable: Размер страницы (1–1000). По умолчанию 100.
- `object_id` integer, nullable: Идентификатор объекта. Взаимоисключим с `folder_id` — в запросе должен быть ровно один из двух.

## Response `200`

Successful Response

- ReviewsSyncPageV3: Страница потока изменений отзывов.
  - `data` ReviewV3[], required: Элементы текущей страницы.
    - `id` integer, required: Идентификатор отзыва в сервисе.
    - `link_id` integer, required: Идентификатор ссылки (страницы объекта на площадке).
    - `source_id` integer, required: Идентификатор площадки, с которой собран отзыв.
    - `source_slug` string, nullable: Слаг площадки, с которой собран отзыв (`2gis`, `google`, `yandex_maps`). Отвечать можно, если он совпадает с `provider` отзыва.
    - `author` string, nullable: Имя автора; `null`, если анонимен.
    - `text` string, nullable: Текст отзыва; `null`, если отзыв без текста.
    - `review_date` string, date-time, nullable: Дата и время публикации отзыва. Приводится к UTC везде, где это возможно; в противном случае — время, как его показывает площадка. ISO 8601 без таймзоны.
    - `rating_original` string, nullable: Исходная оценка в шкале площадки.
    - `rating` number, nullable: Оценка, приведённая к единой шкале 1–5. `null`, если оценки нет.
    - `review_url` string, nullable: Прямая ссылка на отзыв на площадке. `null`, если недоступна.
    - `reply_text` string, nullable: Текст официального ответа организации. `null`, если ответа нет.
    - `reply_date` string, date-time, nullable: Дата и время ответа организации (UTC, ISO 8601).
    - `provider` string, nullable: Площадка-источник самого отзыва внутри `source` (слаг в нижнем регистре). Многие площадки показывают в ленте отзывы других: 2ГИС — `booking`/`tbank`/`flamp`/…, Google — `tripadvisor`. У нативного отзыва совпадает со слагом площадки (`2gis`, `google`), и только на такой отзыв можно опубликовать ответ через эту площадку — на остальные вернётся `409 reply_not_replyable`.
    - `is_replyable` boolean, nullable: Можно ли ответить на отзыв через `PUT /v3/reviews/{review_id}/reply`. Приходит только на площадках, где Rewio публикует ответы (`can_publish_reply` в `GET /v3/sources`); на остальных ключа нет. `true` — ответы на ссылке подключены, и отзыв родной для площадки (`provider` пуст или равен `source_slug`). `false` — ответ вернёт ошибку: отзыв другой площадки (2ГИС показывает отзывы Netmonet, Booking, Т-Банка — `409 reply_not_replyable`) или ответы на ссылке не подключены. Тариф флаг не учитывает.
    - `has_images` boolean, required: Признак наличия изображений в отзыве.
    - `images` ReviewImageV2[]: Список изображений отзыва.
      - `template_url` string, required: URL изображения на CDN площадки в исходном виде. У части площадок содержит шаблон размера (`{size}` или `{width}`/`{height}`) и потому не предназначен для прямой вставки — для показа берите `preview` или `image`.
      - `preview` string, nullable: Готовый URL уменьшенной версии (превью) для списков и сеток.
      - `image` string, nullable: Готовый URL полноразмерной версии для просмотра.
    - `has_videos` boolean: Признак наличия видео в отзыве.
    - `videos` ReviewVideoResponse[]: Список видеовложений отзыва.
      - `kind` 'embed' | 'file' | 'hls', required: Тип вложения: `embed` — встраиваемый плеер площадки (открывать в sandbox-iframe), `file` — прямая ссылка на видеофайл, `hls` — HLS-поток (`.m3u8`).
      - `video_url` string, nullable: URL видео или встраиваемого плеера в зависимости от `kind`.
      - `thumbnail` string, nullable: URL кадра-заставки (превью) видео.
      - `width` integer, nullable: Ширина видео в пикселях, если известна.
      - `height` integer, nullable: Высота видео в пикселях, если известна.
      - `duration_ms` integer, nullable: Длительность видео в миллисекундах, если известна.
    - `is_deleted` boolean: Отзыв обнаружен удалённым на площадке (приходит только когда `true`).
    - `deleted_at` string, date-time, nullable: Момент обнаружения удаления (UTC, ISO 8601).
    - `is_hidden` boolean: Отзыв скрыт в рамках объекта (приходит только когда `true`).
    - `is_pinned` boolean: Отзыв закреплён в рамках объекта (приходит только когда `true`).
    - `pin_position` integer, nullable: Позиция закреплённого отзыва: меньше — выше.
    - `pros` string, nullable: Блок «достоинства» (только при `split_pros_cons=true`).
    - `cons` string, nullable: Блок «недостатки» (только при `split_pros_cons=true`).
  - `next_cursor` string, required: Курсор для следующего запроса. Приходит всегда, в том числе на последней и на пустой странице — его и нужно сохранить у себя до следующего прогона.
  - `has_next` boolean, required: Есть ли ещё элементы прямо сейчас. `false` — обход догнал текущее состояние; возвращайтесь с сохранённым курсором позже.
  - `access` AccessInfoV3: Выдача ограничена тарифом — показано не всё.
    - `reason` string, required: Почему выдача ограничена. `trial` — пробный доступ, `manual` — ограничение, согласованное по вашему договору.
    - `limit_per_link` integer, required: Сколько последних отзывов показывается по КАЖДОЙ ссылке (площадке объекта).
    - `hidden_total` integer, required: Сколько отзывов уже собрано сверх показанных. Считается по всему архиву и не зависит от фильтров запроса.
    - `message` string, required: Готовая формулировка для показа человеку.

## Other responses

- `default`: Error

---

[API](https://skmtc.dev/rewio/apis/review-aggregator.md) · [All operations](https://skmtc.dev/rewio/apis/review-aggregator/llms.txt) · [OpenAPI document](https://skmtc.dev/rewio/apis/review-aggregator/revisions/9222b6cf28a5?raw)
