Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
title: Review Aggregator Replies API
description: 'Единый REST API для отзывов: сервис собирает отзывы с площадок (Яндекс Карты, 2ГИС, Google, Островок, ДокДок и др.), приводит их к общей модели и отдаёт с фильтрами и аналитикой.
📚 **Гайды, quickstart и полный справочник – на портале разработчика: https://docs.rewio.ru**
#### Как начать
1. Создайте **объект** – единицу бизнеса, отзывы по которой собираем.
2. Добавьте в него **ссылки** на страницы объекта на нужных площадках.
3. Запрашивайте **отзывы** и **аналитику** – данные обновляются дважды в сутки.
#### Что вы получаете по каждому отзыву
- **Текст**, **автор**, **оценка** – приведена к единой шкале 1–5 независимо от площадки
- **Ответ организации** – текст и дата
- **Изображения и видео** – превью и полноразмерные ссылки
#### Работа с отзывами
На тарифе «Полный»:
- **Ответы** – публикация, замена и удаление ответа от лица организации (на пробном доступе – 3 на площадку)
- **Жалобы** – подача жалобы на отзыв через форму площадки и её итог (на пробном доступе – 3 на площадку)
- **Дополнительный сбор** – новые отзывы по объекту вне расписания, раз в сутки (на пробном доступе – 5 сборов)
#### Соглашения
- **Базовый URL:** `https://api.rewio.ru`. Актуальная версия – `/v3`.
- **Авторизация:** заголовок `X-API-Key: ` в каждом запросе. Области ключа: `read_only` / `full`.
- **Формат:** JSON на вход и выход.
- **Даты:** UTC, ISO 8601 без таймзоны (`2026-02-25T09:28:07`). Время площадки (`review_date`, `reply_date`) приводится к UTC везде, где это возможно; в противном случае – как на площадке.
- **Оценки:** нормализованы к единой шкале 1–5 независимо от площадки; исходное значение площадки сохраняется отдельно (`rating_original`).
- **Списки:** ключ элементов всегда `data`. Постраничные ответы – `{data, total, limit, offset, has_next}` (параметры `limit` 1–1000 и `offset`); полные списки – только `{data}`.
- **Ошибки:** единый формат `{"detail": "...", "code": "..."}` с машиночитаемым `code`. Отдельно стоит `402`: доступ приостановлен (закончился пробный период или оплата) либо площадка не входит в тариф – повтор запроса не поможет.
- **Ограничение частоты:** при слишком частых запросах – `429`; повторите с задержкой.
#### Проба
В блоке авторизации уже подставлен тестовый ключ (только чтение) – можно сразу выполнить любой GET-запрос.
**Тестовый ключ (только чтение):** `hrev_FaDGMKJEDDeCR5BCBgEg0aEjMogI7O7hOzE53YY4T1M`
**Тестовый объект:** Отель Националь, **object_id = 20**
Бесплатный тестовый доступ на создание 30 объектов.
**Подключение и доступ:** 📧 info@rewio.ru · ✈️ @const_rewio'
version: 3.0.0
servers:
- url: https://api.rewio.ru
description: Production
tags:
- name: replies
description: 'Ответы на отзывы от лица организации: публикация, замена и удаление. Форма запроса одна для всех площадок.'
paths:
/v3/reviews/{review_id}/reply:
get:
tags:
- replies
summary: Состояние вашего ответа
description: 'Состояние вашего ответа на карточке.
`status`: `null` – отправлен, площадке ещё не передан; `pending` – площадка
приняла, на карточке ещё не видели; `published` – ваш текст стоит на
карточке; `deleted` – вашего ответа на карточке нет; `failed` – не
опубликован. `submitted_at` – когда вы отправили текст, `published_at` –
когда мы увидели его на карточке, `error` – почему ответ не опубликован или
пропал.
После того как площадка приняла ответ, мы сами читаем этот отзыв на ней:
через 15 с, 30 с, 1, 2, 3, 5, 15, 30 минут, 1, 2 и 4 часа. Увидели ваш
текст – `published`; не увидели за 4 часа – `failed` с кодом `not_visible`.
Сбор площадки обновляет статус так же. Метод к площадке не обращается –
опрашивайте его сколько нужно.
Ответ, поставленный не через нас, здесь не показывается – он виден как
`reply_text` самого отзыва в `GET /v3/reviews`; заменить или удалить его можно
теми же `PUT` и `DELETE`. Метод доступен на любом тарифе.'
operationId: get_reply_v3_v3_reviews__review_id__reply_get
security:
- APIKeyHeader: []
parameters:
- name: review_id
in: path
required: true
schema:
type: integer
description: Encoded review ID
title: Review Id
description: Encoded review ID
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/ReplyStateV3'
default:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
put:
tags:
- replies
summary: Опубликовать или заменить ответ
description: 'Опубликовать ответ на отзыв или заменить уже стоящий.
Ответ ставится в очередь и публикуется от вашего имени на площадке. Итог
смотрите в `GET /v3/reviews/{review_id}/reply`: публикация асинхронная,
и `202` здесь означает «приняли в работу», а не «уже на карточке».
Ответить можно только на **нативный** отзыв площадки. На отзыв, который
площадка лишь показывает у себя, но собран с другой (`provider` ≠ слаг
площадки: `tbank`, `booking`, `tripadvisor`, …), придёт `409
reply_not_replyable`.
Заменить можно любой ответ организации на отзыве, в том числе
поставленный не через Rewio. Где площадка не даёт переписать ответ
(2ГИС), стоящий ответ снимается и на его место ставится новый.'
operationId: put_reply_v3_v3_reviews__review_id__reply_put
security:
- APIKeyHeader: []
parameters:
- name: review_id
in: path
required: true
schema:
type: integer
description: Encoded review ID
title: Review Id
description: Encoded review ID
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ReplyWriteV3'
responses:
'202':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/ReplyV3'
default:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
delete:
tags:
- replies
summary: Удалить ответ
description: 'Удалить ответ организации с площадки – ваш или поставленный не через Rewio.
Удаление тоже асинхронное.'
operationId: delete_reply_v3_v3_reviews__review_id__reply_delete
security:
- APIKeyHeader: []
parameters:
- name: review_id
in: path
required: true
schema:
type: integer
description: Encoded review ID
title: Review Id
description: Encoded review ID
responses:
'202':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/ReplyV3'
default:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
/v3/reviews/{review_id}/skip:
put:
tags:
- replies
summary: Пропустить отзыв
description: 'Отметить, что отвечать на отзыв не будете: он уходит из `reply_state=unanswered`
в `reply_state=skipped` и получает `is_skipped: true`.
Нужен тариф с ответами («Полный», пробный), иначе `402 reply_requires_upgrade`.
`204` – отметка поставлена; `200 {"is_skipped": true}` – она уже стояла.
Повтор – не ошибка.'
operationId: skip_review_v3_v3_reviews__review_id__skip_put
security:
- APIKeyHeader: []
parameters:
- name: review_id
in: path
required: true
schema:
type: integer
description: Encoded review ID
title: Review Id
description: Encoded review ID
responses:
'204':
description: Successful Response
default:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'200':
description: 'Отметка уже стояла: `{"is_skipped": true}`.'
delete:
tags:
- replies
summary: Вернуть пропущенный отзыв
description: 'Снять отметку «Пропустить»: отзыв возвращается в `reply_state=unanswered`.
Отметки нет – тоже `204`. Тариф – как у «Пропустить».'
operationId: unskip_review_v3_v3_reviews__review_id__skip_delete
security:
- APIKeyHeader: []
parameters:
- name: review_id
in: path
required: true
schema:
type: integer
description: Encoded review ID
title: Review Id
description: Encoded review ID
responses:
'204':
description: Successful Response
default:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
components:
schemas:
ErrorResponse:
properties:
detail:
type: string
title: Detail
code:
type: string
title: Code
type: object
required:
- detail
- code
title: ErrorResponse
description: Standard error response returned by all exception handlers.
ReplyErrorV3:
properties:
code:
type: string
title: Code
description: Машинный код ошибки публикации.
message:
type: string
title: Message
description: Пояснение для человека.
default: ''
type: object
required:
- code
title: ReplyErrorV3
description: Последняя ошибка публикации.
ReplyWriteV3:
properties:
text:
type: string
maxLength: 4000
minLength: 1
title: Text
description: Текст ответа для публикации на площадке.
type: object
required:
- text
title: ReplyWriteV3
description: Текст ответа, который нужно опубликовать.
example:
text: Спасибо за отзыв!
ReplyV3:
properties:
text:
type: string
title: Text
description: Текст ответа, который должен стоять на площадке.
status:
anyOf:
- type: string
enum:
- pending
- published
- failed
- deleted
- type: 'null'
title: Status
description: 'Что с вашим ответом на карточке: `null` – отправлен, площадке ещё не передан; `pending` – площадка приняла, на карточке ещё не видели (проверяем через 15 с, 30 с, 1 мин … 4 ч); `published` – ваш текст стоит на карточке; `deleted` – вашего ответа на карточке нет: вы его удалили или он пропал (причина – в `error`); `failed` – не опубликован (почему – в `error`).'
updated_at:
type: string
format: date-time
title: Updated At
description: Когда запись менялась в последний раз (UTC, ISO 8601).
type: object
required:
- text
- updated_at
title: ReplyV3
description: Ответ, принятый в работу.
ReplyStateV3:
properties:
status:
anyOf:
- type: string
enum:
- pending
- published
- failed
- deleted
- type: 'null'
title: Status
description: 'Что с вашим ответом на карточке: `null` – отправлен, площадке ещё не передан; `pending` – площадка приняла, на карточке ещё не видели (проверяем через 15 с, 30 с, 1 мин … 4 ч); `published` – ваш текст стоит на карточке; `deleted` – вашего ответа на карточке нет: вы его удалили или он пропал (причина – в `error`); `failed` – не опубликован (почему – в `error`).'
submitted_at:
anyOf:
- type: string
format: date-time
- type: 'null'
title: Submitted At
description: Когда вы отправили этот текст (UTC, ISO 8601).
published_at:
anyOf:
- type: string
format: date-time
- type: 'null'
title: Published At
description: Когда мы увидели ваш текст на карточке (UTC, ISO 8601). `null`, пока не видели.
error:
anyOf:
- $ref: '#/components/schemas/ReplyErrorV3'
- type: 'null'
description: 'Почему ответ не опубликован или пропал с карточки: `not_visible`, `not_taken_down`, `review_deleted`, `reply_missing`, `reply_replaced` или код отказа площадки.'
updated_at:
type: string
format: date-time
title: Updated At
description: Когда запись об ответе менялась в последний раз (UTC, ISO 8601).
type: object
required:
- updated_at
title: ReplyStateV3
description: 'Что с ВАШИМ ответом на карточке.
Метод читает нашу запись и к площадке не обращается – опрашивать его можно с
любой частотой. На площадку ходим мы сами: после того как площадка приняла
ответ, читаем этот отзыв на ней через 15 с, 30 с, 1, 2, 3, 5, 15, 30 мин,
1, 2 и 4 ч. Увидели ваш текст – `published`; не увидели за 4 часа –
`failed` с кодом `not_visible`. Сбор площадки двигает статус так же.'
securitySchemes:
APIKeyHeader:
type: apiKey
in: header
name: X-API-Key
APIKeyCookie:
type: apiKey
in: cookie
name: rewio_session