{"openapi":"3.1.0","info":{"title":"Review Aggregator","description":"Единый REST API для отзывов: сервис собирает отзывы с площадок (Яндекс Карты, 2ГИС, Google, Ostrovok, ДокДок и др.), приводит их к общей модели и отдаёт с фильтрами и аналитикой. Под ваши задачи можно добавить новые площадки и функциональность.\n\n📚 **Гайды, quickstart и полный справочник — на портале разработчика: https://docs.rewio.ru**\n\n#### Как начать\n1. Создайте **объект** — единицу бизнеса, отзывы по которой собираем.\n2. Добавьте в него **ссылки** на страницы объекта на нужных площадках.\n3. Запрашивайте **отзывы** и **аналитику** — данные обновляются несколько раз в день.\n\n#### Что вы получаете по каждому отзыву\n- **Текст**, **автор**, **оценка** — приведена к единой шкале 1–5 независимо от площадки\n- **Ответ организации** — текст и дата\n- **Изображения и видео** — превью и полноразмерные ссылки\n\n#### Соглашения\n- **Базовый URL:** `https://api.rewio.ru`. Актуальная версия — `/v3`.\n- **Авторизация:** заголовок `X-API-Key: <ключ>` в каждом запросе. Области ключа: `read_only` / `full`.\n- **Формат:** JSON на вход и выход.\n- **Даты:** UTC, ISO 8601 без таймзоны (`2026-02-25T09:28:07`). Исключение — `review_date` (дата отзыва): это местное время площадки, как показано на её сайте.\n- **Оценки:** нормализованы к единой шкале 1–5 независимо от площадки; исходное значение площадки сохраняется отдельно (`rating_original`).\n- **Списки:** ключ элементов всегда `data`. Постраничные ответы — `{data, total, limit, offset, has_next}` (параметры `limit` 1–1000 и `offset`); полные списки — только `{data}`.\n- **Ошибки:** единый формат `{\"detail\": \"...\", \"code\": \"...\"}` с машиночитаемым `code`. Отдельно стоит `402`: доступ приостановлен (закончился пробный период или оплата) либо площадка не входит в тариф — повтор запроса не поможет.\n- **Ограничение частоты:** при слишком частых запросах — `429`; повторите с задержкой.\n\n#### Проба\nВ блоке авторизации уже подставлен тестовый ключ (только чтение) — можно сразу выполнить любой GET-запрос.\n\n**Тестовый ключ (только чтение):** `hrev_FaDGMKJEDDeCR5BCBgEg0aEjMogI7O7hOzE53YY4T1M`  \n**Тестовый объект:** Отель Националь, **object_id = 20**\n\nБесплатный тестовый доступ на создание 10 объектов.  \n**Подключение и доступ:** 📧 info@rewio.ru · ✈️ @const_rewio","version":"3.0.0"},"servers":[{"url":"https://api.rewio.ru","description":"Production"}],"paths":{"/health":{"get":{"tags":["health"],"summary":"Проверка доступности","description":"Отвечает, если API на связи. Ключ не нужен.\n\nКлюч метод не проверяет, поэтому отделяет сеть от ключа: молчит — дело в\nсети или на нашей стороне, отвечает, а запрос с ключом даёт `401` — дело\nв ключе.","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/health/read":{"get":{"tags":["health"],"summary":"Проверка чтения данных","description":"Отвечает `200`, если чтение данных работает: методы отзывов и аналитики\nответят. Если нет — `503`. Ключ не нужен.\n\nПодходит для внешнего мониторинга доступности.","operationId":"read_health_check_health_read_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v3/reviews/sync":{"get":{"tags":["reviews"],"summary":"Синхронизация отзывов: поток изменений с курсором","description":"Отзывы, изменившиеся у нас после точки, на которой вы остановились.\n\nПервый запрос — с адресом (`object_id` или `folder_id`), дальше достаточно\n`cursor` из предыдущего ответа. `next_cursor` приходит **всегда**, в том\nчисле на последней и на пустой странице: это закладка, которую вы храните\nмежду прогонами.\n\nПорядок фиксирован (от давних изменений к свежим) и не настраивается,\nфильтров нет. Строки могут повторяться между страницами — применяйте upsert\nпо `id`, потерять строку поток не может.","operationId":"sync_reviews_v3_v3_reviews_sync_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"folder_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Синхронизировать папку целиком: все объекты папки и её подпапок. Взаимоисключима с `object_id` — ровно один из двух.","title":"Folder Id"},"description":"Синхронизировать папку целиком: все объекты папки и её подпапок. Взаимоисключима с `object_id` — ровно один из двух."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Курсор из `next_cursor` предыдущего ответа. С ним остальные параметры можно не передавать — адресат, режим и размер страницы запечены внутри.","title":"Cursor"},"description":"Курсор из `next_cursor` предыдущего ответа. С ним остальные параметры можно не передавать — адресат, режим и размер страницы запечены внутри."},{"name":"mode","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(all|new)$"},{"type":"null"}],"description":"Что присылать:\n\n* `all` (по умолчанию) — и новые отзывы, и изменения. Полная актуальная копия.\n* `new` — только впервые появившиеся отзывы. Правки, ответы и пропажи не\n  приходят; каждый отзыв приходит один раз в жизни, апсерт не нужен.\n\nРежима «только изменения» нет намеренно: клиенту, который уже догнал текущее\nсостояние, режим `all` ровно его и отдаёт — новых пока нет, приходят одни\nправки.","title":"Mode"},"description":"Что присылать:\n\n* `all` (по умолчанию) — и новые отзывы, и изменения. Полная актуальная копия.\n* `new` — только впервые появившиеся отзывы. Правки, ответы и пропажи не\n  приходят; каждый отзыв приходит один раз в жизни, апсерт не нужен.\n\nРежима «только изменения» нет намеренно: клиенту, который уже догнал текущее\nсостояние, режим `all` ровно его и отдаёт — новых пока нет, приходят одни\nправки."},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":1000,"minimum":1},{"type":"null"}],"description":"Размер страницы (1–1000). По умолчанию 100.","title":"Limit"},"description":"Размер страницы (1–1000). По умолчанию 100."},{"name":"object_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Идентификатор объекта. Взаимоисключим с `folder_id` — в запросе должен быть ровно один из двух.","title":"Object Id"},"description":"Идентификатор объекта. Взаимоисключим с `folder_id` — в запросе должен быть ровно один из двух."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewsSyncPageV3"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v3/reviews":{"get":{"tags":["reviews"],"summary":"Получить отзывы объекта или папки","description":"Отзывы объекта или папки с фильтрацией, сортировкой и пагинацией.\n\nАдресовать нужно **ровно один**: либо `object_id` (один объект), либо\n`folder_id` (папка целиком). Оба сразу — `400 object_and_folder_conflict`,\nни одного — `400 object_or_folder_required`.\n\nОтвет — конверт `Page`: `{data, total, limit, offset, has_next}`. По каждому\nотзыву: `author`, `text`, `rating` (шкала 1–5), `reply_text` / `reply_date`,\n`images` и остальное.\n\n**Сортировка:** `sort_by=review_date` (по умолчанию), `rating` или\n`reply_date`. Отзывы без ответа идут **в конце** при обоих направлениях,\nпоэтому «сначала неотвеченные» — это не сортировка, а `has_reply=false`.","operationId":"get_reviews_v3_v3_reviews_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"folder_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Единая лента по всей папке: все объекты папки и её подпапок. Взаимоисключим с `object_id` — ровно один из двух. Выключенные и удалённые объекты в состав не входят. В папочном режиме закрепления не применяются, а скрытия применяются по составу папки.","title":"Folder Id"},"description":"Единая лента по всей папке: все объекты папки и её подпапок. Взаимоисключим с `object_id` — ровно один из двух. Выключенные и удалённые объекты в состав не входят. В папочном режиме закрепления не применяются, а скрытия применяются по составу папки."},{"name":"object_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Идентификатор объекта. Взаимоисключим с `folder_id` — в запросе должен быть ровно один из двух.","title":"Object Id"},"description":"Идентификатор объекта. Взаимоисключим с `folder_id` — в запросе должен быть ровно один из двух."},{"name":"link_ids","in":"query","required":false,"schema":{"type":"array","items":{"type":"integer"},"description":"Filter by link IDs.","default":[],"title":"Link Ids"},"description":"Filter by link IDs."},{"name":"source_ids","in":"query","required":false,"schema":{"type":"array","items":{"type":"integer"},"description":"Фильтр по площадкам: id из `GET /v3/sources`. Пусто — все площадки объекта.","default":[],"title":"Source Ids"},"description":"Фильтр по площадкам: id из `GET /v3/sources`. Пусто — все площадки объекта."},{"name":"sort_by","in":"query","required":false,"schema":{"enum":["review_date","rating","reply_date"],"type":"string","description":"Поле сортировки: `review_date` (дата публикации отзыва), `rating` (оценка) или `reply_date` (дата ответа организации; отзывы без ответа — в конце при любом направлении).","default":"review_date","title":"Sort By"},"description":"Поле сортировки: `review_date` (дата публикации отзыва), `rating` (оценка) или `reply_date` (дата ответа организации; отзывы без ответа — в конце при любом направлении)."},{"name":"sort_order","in":"query","required":false,"schema":{"enum":["desc","asc"],"type":"string","description":"Направление сортировки: `desc` / `asc`.","default":"desc","title":"Sort Order"},"description":"Направление сортировки: `desc` / `asc`."},{"name":"min_rating","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":5,"minimum":0},{"type":"null"}],"description":"Минимальная оценка включительно, шкала 1–5. `0` — без нижней границы и **вместе с отзывами без оценки**.","title":"Min Rating"},"description":"Минимальная оценка включительно, шкала 1–5. `0` — без нижней границы и **вместе с отзывами без оценки**."},{"name":"max_rating","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":5,"minimum":1},{"type":"null"}],"description":"Максимальная оценка включительно, шкала 1–5.","title":"Max Rating"},"description":"Максимальная оценка включительно, шкала 1–5."},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Нижняя граница по дате публикации (`review_date`), включительно. Формат `YYYY-MM-DD`.","title":"Published From"},"description":"Нижняя граница по дате публикации (`review_date`), включительно. Формат `YYYY-MM-DD`."},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Верхняя граница по дате публикации (`review_date`), включительно. Формат `YYYY-MM-DD`.","title":"Published To"},"description":"Верхняя граница по дате публикации (`review_date`), включительно. Формат `YYYY-MM-DD`."},{"name":"has_images","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Фильтр по наличию изображений.","title":"Has Images"},"description":"Фильтр по наличию изображений."},{"name":"has_videos","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Фильтр по наличию видео.","title":"Has Videos"},"description":"Фильтр по наличию видео."},{"name":"has_text","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Фильтр по наличию текста отзыва.","title":"Has Text"},"description":"Фильтр по наличию текста отзыва."},{"name":"has_reply","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Фильтр по наличию ответа организации.","title":"Has Reply"},"description":"Фильтр по наличию ответа организации."},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"description":"Поиск подстроки по тексту отзыва (регистронезависимо).","title":"Search"},"description":"Поиск подстроки по тексту отзыва (регистронезависимо)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Размер страницы (1–1000). По умолчанию 100.","default":100,"title":"Limit"},"description":"Размер страницы (1–1000). По умолчанию 100."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Смещение для пагинации.","default":0,"title":"Offset"},"description":"Смещение для пагинации."},{"name":"show_deleted","in":"query","required":false,"schema":{"type":"boolean","description":"Показывать отзывы, помеченные удалёнными на площадке.","default":false,"title":"Show Deleted"},"description":"Показывать отзывы, помеченные удалёнными на площадке."},{"name":"only_deleted","in":"query","required":false,"schema":{"type":"boolean","description":"Только удалённые отзывы (приоритет над `show_deleted`).","default":false,"title":"Only Deleted"},"description":"Только удалённые отзывы (приоритет над `show_deleted`)."},{"name":"show_hidden","in":"query","required":false,"schema":{"type":"boolean","description":"Показывать скрытые отзывы (с флагом `is_hidden`).","default":false,"title":"Show Hidden"},"description":"Показывать скрытые отзывы (с флагом `is_hidden`)."},{"name":"show_pinned","in":"query","required":false,"schema":{"type":"boolean","description":"Показывать закреплённые отзывы (с флагом `is_pinned`).","default":false,"title":"Show Pinned"},"description":"Показывать закреплённые отзывы (с флагом `is_pinned`)."},{"name":"split_pros_cons","in":"query","required":false,"schema":{"type":"boolean","description":"Разбирать слитый текст на `pros` / `cons`.","default":false,"title":"Split Pros Cons"},"description":"Разбирать слитый текст на `pros` / `cons`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewsPageV3"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v3/reviews/{review_id}":{"get":{"tags":["reviews"],"summary":"Получить один отзыв по идентификатору","description":"Один отзыв целиком — по идентификатору из списка.\n\nОтзыв должен принадлежать вашему объекту; чужой и несуществующий отвечают\nодинаково `404`, чтобы по ответу нельзя было проверять существование чужих\nзаписей.","operationId":"get_review_v3_v3_reviews__review_id__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/ReviewV3"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v3/ratings":{"get":{"tags":["reviews"],"summary":"Оценка объекта на площадках","description":"Оценка объекта – числовые значения рейтинга, выбранные пользователями.\nОтзыв – оценка с текстом.\n\nПо каждой ссылке приходит последнее известное значение: оценка, число\nоценок и число отзывов **по данным площадки**.\n\nНеобходимо указать либо объект (`object_id`), либо папку (`folder_id`) –\nровно один из двух.\n\nСсылка, по которой замеров ещё не было, в ответе не появляется. Чтобы\nотслеживать динамику оценки, воспользуйтесь `GET /v3/ratings/history`.","operationId":"get_ratings_v3_v3_ratings_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"folder_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Оценки по всей папке: все объекты папки и её подпапок. Взаимоисключим с `object_id` — ровно один из двух. Выключенные и удалённые объекты в состав не входят.","title":"Folder Id"},"description":"Оценки по всей папке: все объекты папки и её подпапок. Взаимоисключим с `object_id` — ровно один из двух. Выключенные и удалённые объекты в состав не входят."},{"name":"source_ids","in":"query","required":false,"schema":{"type":"array","items":{"type":"integer"},"description":"Фильтр по площадкам: id из `GET /v3/sources`. Пусто — все площадки.","default":[],"title":"Source Ids"},"description":"Фильтр по площадкам: id из `GET /v3/sources`. Пусто — все площадки."},{"name":"object_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Идентификатор объекта. Взаимоисключим с `folder_id` — в запросе должен быть ровно один из двух.","title":"Object Id"},"description":"Идентификатор объекта. Взаимоисключим с `folder_id` — в запросе должен быть ровно один из двух."},{"name":"link_ids","in":"query","required":false,"schema":{"type":"array","items":{"type":"integer"},"description":"Filter by link IDs.","default":[],"title":"Link Ids"},"description":"Filter by link IDs."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnAll_RatingV3_"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v3/ratings/history":{"get":{"tags":["analytics"],"summary":"Как менялась оценка на площадках","description":"Ряд изменений оценки по каждой ссылке – свежее первым.\n\nНовое значение оценки записывается только в том случае, если оно\nизменилось.\n\nНеобходимо указать либо объект (`object_id`), либо папку (`folder_id`) –\nровно один из двух.","operationId":"get_ratings_history_v3_v3_ratings_history_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"folder_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Оценки по всей папке: все объекты папки и её подпапок. Взаимоисключим с `object_id` — ровно один из двух. Выключенные и удалённые объекты в состав не входят.","title":"Folder Id"},"description":"Оценки по всей папке: все объекты папки и её подпапок. Взаимоисключим с `object_id` — ровно один из двух. Выключенные и удалённые объекты в состав не входят."},{"name":"source_ids","in":"query","required":false,"schema":{"type":"array","items":{"type":"integer"},"description":"Фильтр по площадкам: id из `GET /v3/sources`. Пусто — все площадки.","default":[],"title":"Source Ids"},"description":"Фильтр по площадкам: id из `GET /v3/sources`. Пусто — все площадки."},{"name":"measured_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Нижняя граница по дате замера, включительно. Формат `YYYY-MM-DD`. Не передана — с самого начала наблюдений.","title":"Measured From"},"description":"Нижняя граница по дате замера, включительно. Формат `YYYY-MM-DD`. Не передана — с самого начала наблюдений."},{"name":"measured_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Верхняя граница по дате замера, включительно. Формат `YYYY-MM-DD`. Не передана — по сегодня.","title":"Measured To"},"description":"Верхняя граница по дате замера, включительно. Формат `YYYY-MM-DD`. Не передана — по сегодня."},{"name":"object_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Идентификатор объекта. Взаимоисключим с `folder_id` — в запросе должен быть ровно один из двух.","title":"Object Id"},"description":"Идентификатор объекта. Взаимоисключим с `folder_id` — в запросе должен быть ровно один из двух."},{"name":"link_ids","in":"query","required":false,"schema":{"type":"array","items":{"type":"integer"},"description":"Filter by link IDs.","default":[],"title":"Link Ids"},"description":"Filter by link IDs."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnAll_RatingHistoryV3_"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v3/objects":{"post":{"tags":["objects"],"summary":"Создать объект","description":"Создать объект — единицу бизнеса, по которой вы получаете отзывы,\nаналитику и (опционально) вебхуки.\n\nОбъект — основная единица адресации в API: `GET /v3/reviews`,\n`GET /v3/analytics` и подписки `POST /v3/webhooks` работают через\n`object_id`. Внутри объекта — ссылки: по одной на каждую площадку (Яндекс\nКарты, Google, 2ГИС, Островок и т.д.), которые сервис сам периодически\nопрашивает.\n\nСсылки можно передать сразу (`links`, до 200 штук) или не передавать —\nобъект создастся пустым, ссылки добавляются позже через\n`POST /v3/objects/{object_id}/links`. Площадка определяется по домену URL.\n\nОбъект занимает место в тарифе с момента создания — при исчерпании лимита\nответ `403`. `link_results` показывает итог по каждой ссылке отдельно:\nчасть ссылок может не добавиться, но сам объект при этом создаётся.","operationId":"create_object_v3_v3_objects_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObjectCreateV3"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObjectCreateResponseV3"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["objects"],"summary":"Список объектов","description":"Список объектов с пагинацией. Порядок — `id` по убыванию.","operationId":"list_objects_v3_v3_objects_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Размер страницы (1–1000). По умолчанию 100.","default":100,"title":"Limit"},"description":"Размер страницы (1–1000). По умолчанию 100."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Смещение для пагинации.","default":0,"title":"Offset"},"description":"Смещение для пагинации."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_ObjectV3_"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"tags":["objects"],"summary":"Включить/выключить объекты","description":"Массово включить или выключить объекты — то же поле `is_active`, что и в\n`PUT /v3/objects/{object_id}`, применённое к набору за один вызов.\n\n**Переключается всё, что можно переключить.** `object_id`, недоступный\nвызывающему (чужой, несуществующий, удалённый), молча пропускается —\nостальные переключаются как обычно. Не нашлось ни одного — ответ с пустым\n`data`. Лимит объектов переключение не трогает: место в тарифе занимает\nсуществование объекта, а не его включённость.","operationId":"switch_objects_v3_v3_objects_put","security":[{"APIKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObjectsSwitchV3"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnAll_ObjectV3_"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v3/objects/{object_id}":{"get":{"tags":["objects"],"summary":"Получить объект","description":"Получить один объект целиком — с составом ссылок и статусом сбора по каждой.\n\nЗдесь же видно `is_active` — общий выключатель объекта. Он не влияет на\nдоступность самого объекта: выключенный всё равно возвращается этим\nметодом, но `GET /v3/reviews` и `GET /v3/analytics` по нему отвечают `404`.","operationId":"get_object_v3_v3_objects__object_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"object_id","in":"path","required":true,"schema":{"type":"integer","description":"Идентификатор объекта","title":"Object Id"},"description":"Идентификатор объекта"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObjectV3"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"tags":["objects"],"summary":"Обновить объект","description":"Обновить объект: название (`name`) и/или выключатель (`is_active`).\n\n**`is_active=false`** выключает объект: `GET /v3/reviews` и\n`GET /v3/analytics` по нему отвечают `404`, ссылки перестают собираться,\nвебхуки по нему не эмитятся. Сам объект остаётся — виден в списке,\nпереименовывается, ссылки правятся и удаляются, `DELETE` работает.\n\n**Лимит объектов переключение не трогает**: место в тарифе занимает\nсуществование объекта, освобождает — удаление.","operationId":"update_object_v3_v3_objects__object_id__put","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"object_id","in":"path","required":true,"schema":{"type":"integer","description":"Идентификатор объекта","title":"Object Id"},"description":"Идентификатор объекта"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObjectUpdateV3"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObjectV3"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["objects"],"summary":"Удалить объект","description":"Удалить объект вместе со ссылками. Место в тарифе освобождается сразу.\n\nОтвет — идентификатор и название удалённого. Поля `deleted` здесь нет:\nкод `200` уже означает, что объект удалён, а `false` в нём не приходил\nникогда.","operationId":"delete_object_v3_v3_objects__object_id__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"object_id","in":"path","required":true,"schema":{"type":"integer","description":"Идентификатор объекта","title":"Object Id"},"description":"Идентификатор объекта"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObjectDeleteResponseV3"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v3/objects/{object_id}/links":{"post":{"tags":["links"],"summary":"Добавить ссылки","description":"Добавить ссылки в объект — до 200 за раз.\n\nПлощадка определяется по домену URL. Ответ содержит итог по каждой ссылке\nотдельно: успех с `link_id` или `error` — часть ссылок может не добавиться,\nостальные при этом добавляются. Сбор по новым ссылкам стартует сразу.","operationId":"add_links_v3_v3_objects__object_id__links_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"object_id","in":"path","required":true,"schema":{"type":"integer","description":"Идентификатор объекта","title":"Object Id"},"description":"Идентификатор объекта"},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LinkInputV3"},"title":"Links"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkLinksResponseV3"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["links"],"summary":"Список ссылок","description":"Все ссылки объекта. Метод отдаёт их целиком — страниц здесь нет.","operationId":"list_links_v3_v3_objects__object_id__links_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"object_id","in":"path","required":true,"schema":{"type":"integer","description":"Идентификатор объекта","title":"Object Id"},"description":"Идентификатор объекта"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnAll_LinkV3_"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v3/objects/{object_id}/links/{link_id}":{"put":{"tags":["links"],"summary":"Обновить ссылку","description":"Обновить ссылку объекта: своё название (`link_name`) и/или участие в\nсборе (`is_active`).","operationId":"update_link_v3_v3_objects__object_id__links__link_id__put","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"object_id","in":"path","required":true,"schema":{"type":"integer","description":"Идентификатор объекта","title":"Object Id"},"description":"Идентификатор объекта"},{"name":"link_id","in":"path","required":true,"schema":{"type":"integer","description":"Encoded link ID","title":"Link Id"},"description":"Encoded link ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkUpdateV3"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkV3"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["links"],"summary":"Удалить ссылку","description":"Убрать ссылку из объекта. Собранные по ней отзывы перестают отдаваться.","operationId":"remove_link_v3_v3_objects__object_id__links__link_id__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"object_id","in":"path","required":true,"schema":{"type":"integer","description":"Идентификатор объекта","title":"Object Id"},"description":"Идентификатор объекта"},{"name":"link_id","in":"path","required":true,"schema":{"type":"integer","description":"Encoded link ID","title":"Link Id"},"description":"Encoded link ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkRemoveResponseV3"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v3/objects/{object_id}/hidden-reviews":{"post":{"tags":["hidden & pinned"],"summary":"Скрыть отзывы в объекте","description":"Скрыть отзывы: они перестают приходить в выдаче объекта, но остаются\nсобранными и в любой момент возвращаются обратно. Сам отзыв не меняется.","operationId":"hide_reviews_v3_v3_objects__object_id__hidden_reviews_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"object_id","in":"path","required":true,"schema":{"type":"integer","description":"Идентификатор объекта","title":"Object Id"},"description":"Идентификатор объекта"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewIdsRequestV3"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HiddenReviewsMutationResponseV3"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["hidden & pinned"],"summary":"Вернуть отзывы из скрытых","description":"Вернуть скрытые отзывы в выдачу объекта.","operationId":"unhide_reviews_v3_v3_objects__object_id__hidden_reviews_delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"object_id","in":"path","required":true,"schema":{"type":"integer","description":"Идентификатор объекта","title":"Object Id"},"description":"Идентификатор объекта"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewIdsRequestV3"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HiddenReviewsMutationResponseV3"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["hidden & pinned"],"summary":"Список скрытых отзывов объекта","description":"Что именно скрыто в объекте — с теми же фильтрами, что у обычной выдачи.","operationId":"list_hidden_reviews_v3_v3_objects__object_id__hidden_reviews_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"object_id","in":"path","required":true,"schema":{"type":"integer","description":"Идентификатор объекта","title":"Object Id"},"description":"Идентификатор объекта"},{"name":"link_ids","in":"query","required":false,"schema":{"type":"array","items":{"type":"integer"},"description":"Filter by link IDs.","default":[],"title":"Link Ids"},"description":"Filter by link IDs."},{"name":"source_ids","in":"query","required":false,"schema":{"type":"array","items":{"type":"integer"},"description":"Фильтр по площадкам.","default":[],"title":"Source Ids"},"description":"Фильтр по площадкам."},{"name":"sort_by","in":"query","required":false,"schema":{"enum":["review_date","rating","reply_date"],"type":"string","description":"Поле сортировки.","default":"review_date","title":"Sort By"},"description":"Поле сортировки."},{"name":"sort_order","in":"query","required":false,"schema":{"enum":["desc","asc"],"type":"string","description":"Направление сортировки.","default":"desc","title":"Sort Order"},"description":"Направление сортировки."},{"name":"min_rating","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":5,"minimum":1},{"type":"null"}],"description":"Минимальная оценка включительно.","title":"Min Rating"},"description":"Минимальная оценка включительно."},{"name":"max_rating","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":5,"minimum":1},{"type":"null"}],"description":"Максимальная оценка включительно.","title":"Max Rating"},"description":"Максимальная оценка включительно."},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Нижняя граница по дате публикации, включительно.","title":"Published From"},"description":"Нижняя граница по дате публикации, включительно."},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Верхняя граница по дате публикации, включительно.","title":"Published To"},"description":"Верхняя граница по дате публикации, включительно."},{"name":"has_images","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Фильтр по наличию изображений.","title":"Has Images"},"description":"Фильтр по наличию изображений."},{"name":"has_text","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Фильтр по наличию текста.","title":"Has Text"},"description":"Фильтр по наличию текста."},{"name":"has_reply","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Фильтр по наличию ответа организации.","title":"Has Reply"},"description":"Фильтр по наличию ответа организации."},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"description":"Поиск подстроки по тексту отзыва.","title":"Search"},"description":"Поиск подстроки по тексту отзыва."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Размер страницы (1–1000).","default":100,"title":"Limit"},"description":"Размер страницы (1–1000)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Смещение для пагинации.","default":0,"title":"Offset"},"description":"Смещение для пагинации."},{"name":"show_deleted","in":"query","required":false,"schema":{"type":"boolean","description":"Показывать отзывы, помеченные удалёнными на площадке.","default":false,"title":"Show Deleted"},"description":"Показывать отзывы, помеченные удалёнными на площадке."},{"name":"only_deleted","in":"query","required":false,"schema":{"type":"boolean","description":"Только удалённые отзывы.","default":false,"title":"Only Deleted"},"description":"Только удалённые отзывы."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_ReviewV3_"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v3/objects/{object_id}/pinned-reviews":{"put":{"tags":["hidden & pinned"],"summary":"Задать порядок закреплённых отзывов","description":"Задать закрепление целиком: список заменяет прежний, порядок — как прислали.","operationId":"set_pinned_reviews_v3_v3_objects__object_id__pinned_reviews_put","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"object_id","in":"path","required":true,"schema":{"type":"integer","description":"Идентификатор объекта","title":"Object Id"},"description":"Идентификатор объекта"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PinnedOrderRequestV3"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnAll_ReviewV3_"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["hidden & pinned"],"summary":"Закрепить отзывы (в конец)","description":"Добавить отзывы к закреплённым — в конец текущего порядка.","operationId":"add_pinned_reviews_v3_v3_objects__object_id__pinned_reviews_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"object_id","in":"path","required":true,"schema":{"type":"integer","description":"Идентификатор объекта","title":"Object Id"},"description":"Идентификатор объекта"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewIdsRequestV3"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnAll_ReviewV3_"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["hidden & pinned"],"summary":"Открепить отзывы","description":"Открепить перечисленные отзывы; остальные сохраняют свой порядок.","operationId":"remove_pinned_reviews_v3_v3_objects__object_id__pinned_reviews_delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"object_id","in":"path","required":true,"schema":{"type":"integer","description":"Идентификатор объекта","title":"Object Id"},"description":"Идентификатор объекта"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewIdsRequestV3"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnAll_ReviewV3_"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["hidden & pinned"],"summary":"Текущий конфиг закрепления","description":"Что закреплено в объекте и в каком порядке.","operationId":"list_pinned_reviews_v3_v3_objects__object_id__pinned_reviews_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"object_id","in":"path","required":true,"schema":{"type":"integer","description":"Идентификатор объекта","title":"Object Id"},"description":"Идентификатор объекта"},{"name":"link_ids","in":"query","required":false,"schema":{"type":"array","items":{"type":"integer"},"description":"Filter by link IDs.","default":[],"title":"Link Ids"},"description":"Filter by link IDs."},{"name":"source_ids","in":"query","required":false,"schema":{"type":"array","items":{"type":"integer"},"description":"Фильтр по площадкам.","default":[],"title":"Source Ids"},"description":"Фильтр по площадкам."},{"name":"sort_by","in":"query","required":false,"schema":{"enum":["review_date","rating","reply_date"],"type":"string","description":"Поле сортировки.","default":"review_date","title":"Sort By"},"description":"Поле сортировки."},{"name":"sort_order","in":"query","required":false,"schema":{"enum":["desc","asc"],"type":"string","description":"Направление сортировки.","default":"desc","title":"Sort Order"},"description":"Направление сортировки."},{"name":"min_rating","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":5,"minimum":1},{"type":"null"}],"description":"Минимальная оценка включительно.","title":"Min Rating"},"description":"Минимальная оценка включительно."},{"name":"max_rating","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":5,"minimum":1},{"type":"null"}],"description":"Максимальная оценка включительно.","title":"Max Rating"},"description":"Максимальная оценка включительно."},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Нижняя граница по дате публикации, включительно.","title":"Published From"},"description":"Нижняя граница по дате публикации, включительно."},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Верхняя граница по дате публикации, включительно.","title":"Published To"},"description":"Верхняя граница по дате публикации, включительно."},{"name":"has_images","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Фильтр по наличию изображений.","title":"Has Images"},"description":"Фильтр по наличию изображений."},{"name":"has_text","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Фильтр по наличию текста.","title":"Has Text"},"description":"Фильтр по наличию текста."},{"name":"has_reply","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Фильтр по наличию ответа организации.","title":"Has Reply"},"description":"Фильтр по наличию ответа организации."},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"description":"Поиск подстроки по тексту отзыва.","title":"Search"},"description":"Поиск подстроки по тексту отзыва."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Размер страницы (1–1000).","default":100,"title":"Limit"},"description":"Размер страницы (1–1000)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Смещение для пагинации.","default":0,"title":"Offset"},"description":"Смещение для пагинации."},{"name":"show_deleted","in":"query","required":false,"schema":{"type":"boolean","description":"Показывать отзывы, помеченные удалёнными на площадке.","default":false,"title":"Show Deleted"},"description":"Показывать отзывы, помеченные удалёнными на площадке."},{"name":"only_deleted","in":"query","required":false,"schema":{"type":"boolean","description":"Только удалённые отзывы.","default":false,"title":"Only Deleted"},"description":"Только удалённые отзывы."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_ReviewV3_"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v3/folders":{"post":{"tags":["folders"],"summary":"Создать папку","description":"Создать папку и, если нужно, сразу положить в неё объекты.\n\n`object_ids` — это полный состав, а не добавление: список заменяет прежний\nцеликом. Недоступные идентификаторы не валят запрос, а возвращаются в\n`ignored_object_ids`.","operationId":"create_folder_v3_v3_folders_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderCreateV3"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderWriteV3"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["folders"],"summary":"Все папки с подпапками и объектами","description":"Дерево папок целиком: папки верхнего уровня в `data`, вложенные — в\n`subfolders` каждой. Состав объектов приходит вместе с деревом.","operationId":"list_folders_v3_v3_folders_get","security":[{"APIKeyHeader":[]}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnAll_FolderV3_"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v3/folders/{folder_id}":{"get":{"tags":["folders"],"summary":"Папка со всем, что в ней лежит","description":"Одна папка: её объекты и её подпапки со своим составом.","operationId":"get_folder_v3_v3_folders__folder_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"integer","description":"Идентификатор папки.","title":"Folder Id"},"description":"Идентификатор папки."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderV3"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["folders"],"summary":"Изменить папку","description":"Изменить название, родителя или состав папки.\n\nПереданный `object_ids` заменяет состав целиком; не переданный — оставляет\nкак был.","operationId":"update_folder_v3_v3_folders__folder_id__patch","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"integer","description":"Идентификатор папки.","title":"Folder Id"},"description":"Идентификатор папки."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderUpdateV3"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderWriteV3"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["folders"],"summary":"Удалить папку","description":"Удалить папку. Объекты внутри не удаляются — они просто перестают в ней лежать.","operationId":"delete_folder_v3_v3_folders__folder_id__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"integer","description":"Идентификатор папки.","title":"Folder Id"},"description":"Идентификатор папки."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderDeleteResponseV3"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v3/analytics":{"get":{"tags":["analytics"],"summary":"Сводная аналитика объекта или папки","description":"Сводная аналитика по отзывам за период — по объекту или по папке целиком.\n\nАдресовать нужно **ровно один**: `object_id` или `folder_id`. Оба сразу —\n`400 object_and_folder_conflict`, ни одного — `400 object_or_folder_required`.\n\nВ папочном режиме считается по всем объектам папки и её подпапок; ссылка,\nлежащая в нескольких объектах папки, учитывается один раз. `by_source`\nсхлопывает одну площадку разных объектов в одну строку с суммой.\n`meta.object_ids` показывает фактический состав расчёта.","operationId":"get_analytics_v3_v3_analytics_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"folder_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Папка целиком: все её объекты и объекты подпапок. Взаимоисключима с `object_id` — ровно один из двух.","title":"Folder Id"},"description":"Папка целиком: все её объекты и объекты подпапок. Взаимоисключима с `object_id` — ровно один из двух."},{"name":"object_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Идентификатор объекта. Взаимоисключим с `folder_id`.","title":"Object Id"},"description":"Идентификатор объекта. Взаимоисключим с `folder_id`."},{"name":"source_ids","in":"query","required":false,"schema":{"type":"array","items":{"type":"integer"},"description":"Фильтр по площадкам (id из `GET /v3/sources`). Пусто — все площадки объекта.","default":[],"title":"Source Ids"},"description":"Фильтр по площадкам (id из `GET /v3/sources`). Пусто — все площадки объекта."},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Начало периода по дате публикации, включительно (`YYYY-MM-DD`). По умолчанию `2000-01-01`.","title":"Published From"},"description":"Начало периода по дате публикации, включительно (`YYYY-MM-DD`). По умолчанию `2000-01-01`."},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Конец периода по дате публикации, включительно (`YYYY-MM-DD`). По умолчанию сегодня.","title":"Published To"},"description":"Конец периода по дате публикации, включительно (`YYYY-MM-DD`). По умолчанию сегодня."},{"name":"min_rating","in":"query","required":false,"schema":{"type":"number","maximum":5,"minimum":0,"description":"Нижняя граница оценки (1–5), включительно. `0` — без нижней границы и **вместе с отзывами без оценки**.","default":1,"title":"Min Rating"},"description":"Нижняя граница оценки (1–5), включительно. `0` — без нижней границы и **вместе с отзывами без оценки**."},{"name":"max_rating","in":"query","required":false,"schema":{"type":"number","maximum":5,"minimum":1,"description":"Верхняя граница оценки (1–5), включительно.","default":5,"title":"Max Rating"},"description":"Верхняя граница оценки (1–5), включительно."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyticsResponseV3"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v3/analytics/timeseries":{"get":{"tags":["analytics"],"summary":"Динамика отзывов по периодам","description":"Динамика отзывов по интервалам — по объекту или по папке целиком.\n\nРяды приходят в `series`, точки каждого ряда — в `points`. `source_id = 0`\nозначает агрегированный ряд по всем площадкам.","operationId":"get_timeseries_v3_v3_analytics_timeseries_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"folder_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Папка целиком: все её объекты и объекты подпапок. Взаимоисключима с `object_id` — ровно один из двух.","title":"Folder Id"},"description":"Папка целиком: все её объекты и объекты подпапок. Взаимоисключима с `object_id` — ровно один из двух."},{"name":"object_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Идентификатор объекта. Взаимоисключим с `folder_id`.","title":"Object Id"},"description":"Идентификатор объекта. Взаимоисключим с `folder_id`."},{"name":"source_ids","in":"query","required":false,"schema":{"type":"array","items":{"type":"integer"},"description":"Площадки для разбивки; `0` — агрегированный ряд. По умолчанию `[0]`.","default":[],"title":"Source Ids"},"description":"Площадки для разбивки; `0` — агрегированный ряд. По умолчанию `[0]`."},{"name":"granularity","in":"query","required":false,"schema":{"enum":["day","week","month"],"type":"string","description":"Размер интервала: `day` / `week` / `month`.","default":"month","title":"Granularity"},"description":"Размер интервала: `day` / `week` / `month`."},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Начало периода по дате публикации, включительно. По умолчанию 90 дней назад.","title":"Published From"},"description":"Начало периода по дате публикации, включительно. По умолчанию 90 дней назад."},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Конец периода по дате публикации, включительно. По умолчанию сегодня.","title":"Published To"},"description":"Конец периода по дате публикации, включительно. По умолчанию сегодня."},{"name":"min_rating","in":"query","required":false,"schema":{"type":"number","maximum":5,"minimum":0,"description":"Нижняя граница оценки (1–5). `0` — без нижней границы и вместе с отзывами без оценки.","default":1,"title":"Min Rating"},"description":"Нижняя граница оценки (1–5). `0` — без нижней границы и вместе с отзывами без оценки."},{"name":"max_rating","in":"query","required":false,"schema":{"type":"number","maximum":5,"minimum":1,"description":"Верхняя граница оценки (1–5).","default":5,"title":"Max Rating"},"description":"Верхняя граница оценки (1–5)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeseriesResponseV3"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v3/sources":{"get":{"tags":["sources"],"summary":"Список площадок","description":"Список площадок, с которых Rewio собирает отзывы — Яндекс Карты,\nGoogle, 2ГИС и ещё почти три десятка сервисов.\n\nОбычно сюда заглядывают один раз: найти `id` нужной площадки и\nиспользовать его в фильтрах у отзывов и аналитики. `supports_replies`\nговорит, бывают ли на площадке ответы организации вообще, а\n`can_publish_reply` — умеем ли мы их там публиковать за вас.","operationId":"list_sources_v3_v3_sources_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnAll_SourceV3_"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v3/webhooks":{"get":{"tags":["webhooks"],"summary":"Список вебхуков","description":"Все ваши подписки со статусом и счётчиком неудач.","operationId":"list_webhooks_v3_v3_webhooks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnAll_WebhookV3_"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]},"post":{"tags":["webhooks"],"summary":"Создать вебхук","description":"Подписаться на события: новые отзывы, новые ответы, конец цикла сбора.\n\n`object_ids` сужает подписку до перечисленных объектов; без него события\nприходят по всем вашим. Подпись доставки проверяется секретом аккаунта —\nон один на все ваши подписки, см. `GET /v3/webhooks/secret`.","operationId":"create_webhook_v3_v3_webhooks_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreateV3"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookV3"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v3/webhooks/secret":{"get":{"tags":["webhooks"],"summary":"Секрет подписи аккаунта","description":"Секрет, которым подписаны все доставки аккаунта. Первый вызов его создаёт.\n\nТребует ключ со scope `full` — тем же, что и в `/v2`: секрет проверяет\nподпись доставок, ключу «только чтение» он не полагается.","operationId":"get_account_secret_v3_v3_webhooks_secret_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountSecretResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v3/webhooks/rotate-secret":{"post":{"tags":["webhooks"],"summary":"Перевыпустить секрет аккаунта","description":"Выпустить новый секрет. Старый перестаёт подходить сразу — обновите\nпроверку подписи на своей стороне до вызова.","operationId":"rotate_account_secret_v3_v3_webhooks_rotate_secret_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountSecretResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v3/webhooks/{webhook_id}":{"patch":{"tags":["webhooks"],"summary":"Изменить вебхук","description":"Изменить подписку: адрес, состав объектов, события, окно, фильтры,\nвключённость. Передавайте только то, что меняется.","operationId":"update_webhook_v3_v3_webhooks__webhook_id__patch","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"integer","title":"Webhook Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookUpdateV3"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookV3"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["webhooks"],"summary":"Удалить вебхук","description":"Удалить подписку. Доставки по ней прекращаются сразу.","operationId":"delete_webhook_v3_v3_webhooks__webhook_id__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"integer","title":"Webhook Id"}}],"responses":{"204":{"description":"Successful Response"},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v3/webhooks/{webhook_id}/test":{"post":{"tags":["webhooks"],"summary":"Тестовая доставка","description":"Отправить на ваш адрес тестовое событие — проверить доступность и подпись.","operationId":"test_webhook_v3_v3_webhooks__webhook_id__test_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"integer","title":"Webhook Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestSubscriptionResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v3/reviews/{review_id}/reply":{"get":{"tags":["replies"],"summary":"Проверить ответ на площадке","description":"Посмотреть на площадке, стоит ли ответ под этим отзывом.\n\nМы читаем страницу площадки в момент запроса, поэтому ответ описывает её, а\nне нашу очередь: `reply_found: false` означает «сейчас ответа нет».\n\nПроверка доступна **30 минут после публикации** через нас и не чаще раза в\nминуту на отзыв: это живой запрос к площадке, а не наша база. Позже\nподтверждение приходит обычным путём — `reply_text` и `reply_date` в самом\nотзыве и событие `replies.new`.\n\nРаботает там, где ответ виден в публичной выдаче: Яндекс.Карты и 2ГИС.","operationId":"check_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/ReplyCheckV3"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"tags":["replies"],"summary":"Опубликовать или заменить ответ","description":"Опубликовать ответ на отзыв или заменить уже стоящий.\n\nОтвет ставится в очередь и публикуется от вашего имени на площадке. Итог\nсмотрите в `GET /v3/reviews/{review_id}/reply`: публикация асинхронная,\nи `202` здесь означает «приняли в работу», а не «уже на карточке».","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":"Удалить ваш ответ с площадки. Удаление тоже асинхронное.","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/support/message":{"post":{"tags":["support"],"summary":"Написать в поддержку","description":"Отправить сообщение в поддержку от вашего аккаунта.","operationId":"send_support_message_v3_v3_support_message_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportMessage"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportAccepted"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]}}},"components":{"schemas":{"AccessInfoV3":{"properties":{"reason":{"type":"string","title":"Reason","description":"Почему выдача ограничена. `trial` — пробный доступ, `manual` — ограничение, согласованное по вашему договору."},"limit_per_link":{"type":"integer","title":"Limit Per Link","description":"Сколько последних отзывов показывается по КАЖДОЙ ссылке (площадке объекта)."},"hidden_total":{"type":"integer","title":"Hidden Total","description":"Сколько отзывов уже собрано сверх показанных. Считается по всему архиву и не зависит от фильтров запроса."},"message":{"type":"string","title":"Message","description":"Готовая формулировка для показа человеку."}},"type":"object","required":["reason","limit_per_link","hidden_total","message"],"title":"AccessInfoV3","description":"Выдача ограничена тарифом — показано не всё."},"AccountSecretResponse":{"properties":{"secret":{"type":"string","title":"Secret"},"rotated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Rotated At"}},"type":"object","required":["secret"],"title":"AccountSecretResponse","description":"Account-level webhook signing secret. Returned by `GET\n/webhooks/secret` (always) and `POST /webhooks/rotate-secret`.","examples":[{"secret":"whsec_..."}],"example":{"secret":"whsec_..."}},"AnalyticsMetaV3":{"properties":{"object_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Object Id","description":"Объект, по которому считали. `null` в папочном режиме."},"folder_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Folder Id","description":"Папка, по которой считали. `null` в объектном режиме."},"object_ids":{"items":{"type":"integer"},"type":"array","title":"Object Ids","description":"Объекты, вошедшие в расчёт. В объектном режиме — один."},"published_from":{"type":"string","format":"date","title":"Published From","description":"Фактически применённое начало периода по дате публикации, включительно."},"published_to":{"type":"string","format":"date","title":"Published To","description":"Фактически применённый конец периода, включительно."},"source_ids":{"items":{"type":"integer"},"type":"array","title":"Source Ids","description":"Фактически применённый фильтр по площадкам. Пусто — все площадки объекта."},"generated_at":{"type":"string","format":"date-time","title":"Generated At","description":"Момент расчёта данных (UTC, ISO 8601)."}},"type":"object","required":["object_ids","published_from","published_to","source_ids","generated_at"],"title":"AnalyticsMetaV3","description":"Что именно посчитано — фактически применённые адресат и фильтры."},"AnalyticsResponseV3":{"properties":{"meta":{"$ref":"#/components/schemas/AnalyticsMetaV3"},"summary":{"$ref":"#/components/schemas/AnalyticsSummaryV3"},"by_source":{"items":{"$ref":"#/components/schemas/BySourceItemV3"},"type":"array","title":"By Source"},"access":{"anyOf":[{"$ref":"#/components/schemas/AccessInfoV3"},{"type":"null"}],"description":"Ограничение выдачи, если показали не всё."}},"type":"object","required":["meta","summary","by_source"],"title":"AnalyticsResponseV3","description":"Сводная аналитика объекта или папки."},"AnalyticsSummaryV3":{"properties":{"review_count":{"type":"integer","title":"Review Count","description":"Всего отзывов за период с учётом фильтров."},"average_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Rating","description":"Средняя оценка по шкале 1–5, округлённая до сотых. `null`, если отзывов нет."},"reviews_with_text":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reviews With Text","description":"Сколько из них с текстом."},"reviews_with_images":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reviews With Images","description":"Сколько из них с изображениями."},"rating_distribution":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Rating Distribution","description":"Распределение отзывов по оценкам."},"reply":{"anyOf":[{"$ref":"#/components/schemas/ReplyStatsV3"},{"type":"null"}],"description":"Сводка по ответам организации."}},"type":"object","required":["review_count"],"title":"AnalyticsSummaryV3","description":"Сводка за период."},"BulkLinksResponseV3":{"properties":{"object_id":{"type":"integer","title":"Object Id","description":"Объект, в который добавлялись ссылки."},"link_results":{"items":{"$ref":"#/components/schemas/LinkResultV3"},"type":"array","title":"Link Results","description":"Итог по каждой переданной ссылке."}},"type":"object","required":["object_id","link_results"],"title":"BulkLinksResponseV3","description":"Итог массового добавления ссылок в объект."},"BySourceItemV3":{"properties":{"source_id":{"type":"integer","title":"Source Id","description":"Идентификатор площадки (см. `GET /v3/sources`)."},"source_name":{"type":"string","title":"Source Name","description":"Название площадки для показа человеку."},"review_count":{"type":"integer","title":"Review Count","description":"Число отзывов с этой площадки за период."},"average_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Rating","description":"Средняя оценка по этой площадке, шкала 1–5."},"reviews_with_reply":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reviews With Reply","description":"Сколько из них с ответом организации."},"reviews_with_text":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reviews With Text","description":"Сколько из них с текстом."},"reviews_with_images":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reviews With Images","description":"Сколько из них с изображениями."},"rating_distribution":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Rating Distribution","description":"Распределение отзывов по оценкам."},"reply_distribution":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Reply Distribution","description":"Распределение отвеченных отзывов по оценкам."},"latest_review_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Latest Review Date","description":"Дата самого свежего отзыва с этой площадки за период."}},"type":"object","required":["source_id","source_name","review_count"],"title":"BySourceItemV3","description":"Та же сводка в разрезе одной площадки."},"CollectingInfoV3":{"properties":{"link_count":{"type":"integer","title":"Link Count","description":"Сколько площадок (ссылок) участвует в выдаче."},"links_collecting":{"type":"integer","title":"Links Collecting","description":"По скольким из них первый сбор идёт прямо сейчас или стоит в очереди. Отзывы появятся сами — повторите запрос через несколько десятков секунд."},"links_failed":{"type":"integer","title":"Links Failed","description":"По скольким из них первый сбор не удался. Состояние каждой площадки — в `scrape_status` / `scrape_error` объекта."},"message":{"type":"string","title":"Message","description":"Готовая формулировка. Для своего интерфейса стройте текст по числам выше."}},"type":"object","required":["link_count","links_collecting","links_failed","message"],"title":"CollectingInfoV3","description":"Первый сбор ещё идёт — поэтому отзывов может не быть.\n\nКлюч приходит только до первого успешного сбора: дальше пустая страница\nзначит «отзывов нет», и объяснять нечего."},"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."},"FiltersV2":{"properties":{"allowed_ratings":{"items":{"type":"integer"},"type":"array","title":"Allowed Ratings"},"allowed_sources":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Sources"},"has_text":{"type":"boolean","title":"Has Text","default":false},"has_images":{"type":"boolean","title":"Has Images","default":false}},"type":"object","title":"FiltersV2","description":"Фильтры доставки (/v2). AND-комбинируются. Канонические имена\n``has_text`` / ``has_images`` вместо внутренних ``require_text`` /\n``require_images``.","examples":[{"allowed_ratings":[1,2],"allowed_sources":["yandex_maps"],"has_images":false,"has_text":true}],"example":{"allowed_ratings":[1,2],"allowed_sources":["yandex_maps"],"has_images":false,"has_text":true}},"FolderCreateV3":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name","description":"Название папки."},"parent_folder_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Folder Id","description":"Родительская папка. Глубина ограничена двумя ступенями."},"object_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Object Ids","description":"Состав папки. Присылается целиком: список полностью заменяет прежний. Недоступные идентификаторы возвращаются в `ignored_object_ids`."}},"type":"object","required":["name"],"title":"FolderCreateV3","description":"Тело создания папки."},"FolderDeleteResponseV3":{"properties":{"id":{"type":"integer","title":"Id","description":"Идентификатор удалённой папки."},"name":{"type":"string","title":"Name","description":"Название удалённой папки."}},"type":"object","required":["id","name"],"title":"FolderDeleteResponseV3","description":"Ответ на удаление папки."},"FolderObjectV3":{"properties":{"id":{"type":"integer","title":"Id","description":"Идентификатор объекта."},"name":{"type":"string","title":"Name","description":"Название объекта."}},"type":"object","required":["id","name"],"title":"FolderObjectV3","description":"Объект в составе папки — идентификатор и название, чтобы не ходить за ними отдельно."},"FolderUpdateV3":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name","description":"Новое название папки."},"parent_folder_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Folder Id","description":"Новый родитель папки."},"object_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Object Ids","description":"Новый состав папки — полная замена прежнего. Недоступные идентификаторы возвращаются в `ignored_object_ids`."}},"type":"object","title":"FolderUpdateV3","description":"Тело изменения папки — передавайте только изменяемые поля."},"FolderV3":{"properties":{"id":{"type":"integer","title":"Id","description":"Идентификатор папки."},"user_id":{"type":"integer","title":"User Id","description":"Владелец папки."},"name":{"type":"string","title":"Name","description":"Название папки."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Момент создания папки (UTC, ISO 8601)."},"parent_folder_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Folder Id","description":"Родительская папка; `null` у папки верхнего уровня."},"objects":{"items":{"$ref":"#/components/schemas/FolderObjectV3"},"type":"array","title":"Objects","description":"Собственный состав папки — объекты с названиями.","default":[]},"subfolders":{"items":{"$ref":"#/components/schemas/FolderV3"},"type":"array","title":"Subfolders","description":"Подпапки со своим составом.","default":[]}},"type":"object","required":["id","user_id","name","created_at"],"title":"FolderV3","description":"Папка со своим составом и подпапками."},"FolderWriteV3":{"properties":{"id":{"type":"integer","title":"Id","description":"Идентификатор папки."},"user_id":{"type":"integer","title":"User Id","description":"Владелец папки."},"name":{"type":"string","title":"Name","description":"Название папки."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Момент создания папки (UTC, ISO 8601)."},"parent_folder_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Folder Id","description":"Родительская папка; `null` у папки верхнего уровня."},"objects":{"items":{"$ref":"#/components/schemas/FolderObjectV3"},"type":"array","title":"Objects","description":"Собственный состав папки — объекты с названиями.","default":[]},"subfolders":{"items":{"$ref":"#/components/schemas/FolderV3"},"type":"array","title":"Subfolders","description":"Подпапки со своим составом.","default":[]},"ignored_object_ids":{"items":{"type":"integer"},"type":"array","title":"Ignored Object Ids","description":"Идентификаторы из присланного `object_ids`, которые в состав не попали: чужие, удалённые или несуществующие объекты. Запрос при этом выполняется — остальные объекты кладутся в папку."}},"type":"object","required":["id","user_id","name","created_at"],"title":"FolderWriteV3","description":"Ответ на создание и изменение — та же папка плюс список пропущенного."},"HiddenReviewsMutationResponseV3":{"properties":{"message":{"type":"string","title":"Message","description":"Человекочитаемый итог операции."},"hidden_count":{"type":"integer","title":"Hidden Count","description":"Сколько отзывов скрыто в объекте после операции."}},"type":"object","required":["message","hidden_count"],"title":"HiddenReviewsMutationResponseV3","description":"Итог скрытия или возврата отзывов."},"LinkInputV3":{"properties":{"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url","description":"Адрес страницы объекта на площадке. Площадка определяется по домену."},"is_active":{"type":"boolean","title":"Is Active","description":"Собирать ли отзывы по этой ссылке.","default":true},"link_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link Name","description":"Своё название ссылки внутри объекта."}},"type":"object","required":["url"],"title":"LinkInputV3","description":"Ссылка, передаваемая при создании объекта или добавлении в него.","example":{"link_name":"Яндекс Карты","url":"https://yandex.ru/maps/org/natsional/1049256789/"}},"LinkRemoveResponseV3":{"properties":{"message":{"type":"string","title":"Message","description":"Человекочитаемый итог операции."},"object_id":{"type":"integer","title":"Object Id","description":"Объект, из которого удалена ссылка."},"link_id":{"type":"integer","title":"Link Id","description":"Идентификатор удалённой ссылки."}},"type":"object","required":["message","object_id","link_id"],"title":"LinkRemoveResponseV3","description":"Ответ на удаление ссылки из объекта."},"LinkResultV3":{"properties":{"url":{"type":"string","title":"Url","description":"URL ссылки, к которой относится результат."},"link_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Link Id","description":"Идентификатор созданной ссылки. `null` при ошибке."},"source_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Slug","description":"Машинное имя площадки, определённой по URL (`2gis`, `yandex_travel`). `null`, если определить не удалось."},"link_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link Name","description":"Название ссылки, как оно сохранено."},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Причина, по которой ссылка не добавлена. `null` при успехе."},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code","description":"Машинная причина отказа — по ней и следует ветвиться: `source_not_detected`, `source_url_invalid`, `source_requires_upgrade`, `source_already_linked` (площадка в объекте может быть только одна), `link_already_added`. `null` при успехе."}},"type":"object","required":["url"],"title":"LinkResultV3","description":"Итог добавления одной ссылки — успех с `link_id` либо `error`."},"LinkUpdateV3":{"properties":{"link_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link Name","description":"Новое своё название ссылки внутри объекта. Не передано — не меняется."},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active","description":"Собирать ли отзывы по этой ссылке. Не передано — не меняется."}},"type":"object","title":"LinkUpdateV3","description":"Изменение ссылки внутри объекта. Передавайте только изменяемые поля."},"LinkV3":{"properties":{"id":{"type":"integer","title":"Id","description":"Идентификатор ссылки."},"url":{"type":"string","title":"Url","description":"URL страницы объекта на площадке."},"source_id":{"type":"integer","title":"Source Id","description":"Идентификатор площадки ссылки (см. `GET /v3/sources`)."},"link_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link Name","description":"Своё название ссылки внутри объекта, если задано."},"auto_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auto Name","description":"Название, определённое нами по ссылке, с подписью площадки через двоеточие. Показывать стоит `link_name`, если задано, иначе `auto_name`."},"is_active":{"type":"boolean","title":"Is Active","description":"Включена ли ссылка в автосбор отзывов."},"scrape_status":{"$ref":"#/components/schemas/ScrapeStatus","description":"Статус последнего сбора: `pending` / `in_progress` / `success` / `failed`."},"scrape_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scrape Error","description":"Текст ошибки последнего неудачного сбора. `null`, когда сбор успешен."},"last_scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Scraped At","description":"Момент последнего сбора по ссылке (UTC, ISO 8601)."},"last_scraped_review_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Scraped Review Date","description":"Дата публикации самого свежего собранного отзыва по ссылке."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Момент добавления ссылки в объект (UTC, ISO 8601)."}},"type":"object","required":["id","url","source_id","is_active","scrape_status","created_at"],"title":"LinkV3","description":"Ссылка объекта на одной площадке."},"ObjectCreateResponseV3":{"properties":{"id":{"type":"integer","title":"Id","description":"Идентификатор созданного объекта."},"name":{"type":"string","title":"Name","description":"Название объекта."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Момент создания объекта (UTC, ISO 8601)."},"link_results":{"anyOf":[{"items":{"$ref":"#/components/schemas/LinkResultV3"},"type":"array"},{"type":"null"}],"title":"Link Results","description":"Итог по каждой переданной ссылке. `null`, если ссылок не было."}},"type":"object","required":["id","name","created_at"],"title":"ObjectCreateResponseV3","description":"Созданный объект и результат по каждой переданной ссылке."},"ObjectCreateV3":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name","description":"Название объекта."},"links":{"anyOf":[{"items":{"$ref":"#/components/schemas/LinkInputV3"},"type":"array"},{"type":"null"}],"title":"Links","description":"Ссылки, которые добавить сразу (до 200). Можно не передавать — объект создастся пустым, ссылки добавляются позже через `POST /v3/objects/{object_id}/links`."}},"type":"object","required":["name"],"title":"ObjectCreateV3","description":"Тело создания объекта.","example":{"links":[{"url":"https://yandex.ru/maps/org/natsional/1049256789/"}],"name":"Отель Националь"}},"ObjectDeleteResponseV3":{"properties":{"id":{"type":"integer","title":"Id","description":"Идентификатор удалённого объекта."},"name":{"type":"string","title":"Name","description":"Название удалённого объекта."}},"type":"object","required":["id","name"],"title":"ObjectDeleteResponseV3","description":"Ответ на удаление объекта. Кода 200 достаточно — поля `deleted` больше нет."},"ObjectScrapeStatus":{"type":"string","enum":["pending","in_progress","success","partial","failed"],"title":"ObjectScrapeStatus","description":"Сводный статус сбора по объекту. Значения те же, что в предыдущей версии."},"ObjectUpdateV3":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name","description":"Новое название объекта."},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active","description":"Включить или выключить объект."}},"type":"object","title":"ObjectUpdateV3","description":"Изменение объекта: название и/или включённость."},"ObjectV3":{"properties":{"id":{"type":"integer","title":"Id","description":"Идентификатор объекта."},"name":{"type":"string","title":"Name","description":"Название объекта."},"is_active":{"type":"boolean","title":"Is Active","description":"Включён ли объект. Выключенный не отдаёт отзывы и аналитику и не собирается, но остаётся у вас и продолжает занимать место в тарифе."},"scrape_status":{"$ref":"#/components/schemas/ObjectScrapeStatus","description":"Сводный статус сбора по включённым ссылкам объекта: `pending` / `in_progress` / `success` / `partial` / `failed`."},"last_scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Scraped At","description":"Последний сбор по объекту (UTC, ISO 8601)."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Момент создания объекта (UTC, ISO 8601)."},"links":{"items":{"$ref":"#/components/schemas/LinkV3"},"type":"array","title":"Links","description":"Ссылки объекта на разных площадках.","default":[]}},"type":"object","required":["id","name","is_active","scrape_status","created_at"],"title":"ObjectV3","description":"Объект — единица бизнеса, отзывы по которой собираются со всех площадок.","example":{"created_at":"2026-02-25T09:28:07","id":20,"is_active":true,"last_scraped_at":"2026-08-23T04:15:00","links":[],"name":"Отель Националь","scrape_status":"success"}},"ObjectsSwitchV3":{"properties":{"object_ids":{"items":{"type":"integer"},"type":"array","maxItems":200,"minItems":1,"title":"Object Ids","description":"Идентификаторы объектов. Недоступные вам молча пропускаются — в ответе придут только те, что удалось тронуть."},"is_active":{"type":"boolean","title":"Is Active","description":"Одно значение на вызов: включить или выключить."}},"type":"object","required":["object_ids","is_active"],"title":"ObjectsSwitchV3","description":"Массовое включение/выключение объектов одним вызовом.","example":{"is_active":false,"object_ids":[12,13,27]}},"Page_ObjectV3_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ObjectV3"},"type":"array","title":"Data","description":"Элементы текущей страницы."},"total":{"type":"integer","title":"Total","description":"Общее число элементов, подходящих под фильтры (без учёта limit/offset)."},"limit":{"type":"integer","title":"Limit","description":"Размер страницы, применённый к запросу."},"offset":{"type":"integer","title":"Offset","description":"Смещение от начала выборки, применённое к запросу."},"has_next":{"type":"boolean","title":"Has Next","description":"Есть ли ещё элементы за пределами текущей страницы."}},"type":"object","required":["data","total","limit","offset","has_next"],"title":"Page[ObjectV3]"},"Page_ReviewV3_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ReviewV3"},"type":"array","title":"Data","description":"Элементы текущей страницы."},"total":{"type":"integer","title":"Total","description":"Общее число элементов, подходящих под фильтры (без учёта limit/offset)."},"limit":{"type":"integer","title":"Limit","description":"Размер страницы, применённый к запросу."},"offset":{"type":"integer","title":"Offset","description":"Смещение от начала выборки, применённое к запросу."},"has_next":{"type":"boolean","title":"Has Next","description":"Есть ли ещё элементы за пределами текущей страницы."}},"type":"object","required":["data","total","limit","offset","has_next"],"title":"Page[ReviewV3]"},"PinnedOrderRequestV3":{"properties":{"ordered_review_ids":{"items":{"type":"integer"},"type":"array","maxItems":200,"title":"Ordered Review Ids","description":"Идентификаторы в нужном порядке: первый в списке — первый в выдаче. Список заменяет прежний целиком; пустой — открепить всё."}},"type":"object","required":["ordered_review_ids"],"title":"PinnedOrderRequestV3","description":"Порядок закреплённых отзывов — присылается целиком.","example":{"ordered_review_ids":[12345,67890]}},"RatingHistoryV3":{"properties":{"link_id":{"type":"integer","title":"Link Id","description":"Идентификатор ссылки (страницы объекта на площадке)."},"source_id":{"type":"integer","title":"Source Id","description":"Идентификатор площадки. Берётся из `GET /v3/sources`."},"points":{"items":{"$ref":"#/components/schemas/RatingPointV3"},"type":"array","title":"Points","description":"Точки ряда, свежая первой. Каждая — отрезок, на котором значение держалось: `measured_at` соседней точки снизу говорит, когда прежнее значение видели в последний раз."}},"type":"object","required":["link_id","source_id","points"],"title":"RatingHistoryV3","description":"Ряд изменений рейтинга по одной ссылке.","example":{"link_id":794,"points":[{"measured_at":"2026-08-27T05:21:23","rating":4.9,"rating_count":966,"review_count":286},{"measured_at":"2026-08-23T05:19:44","rating":4.8,"rating_count":941,"review_count":279}],"source_id":1}},"RatingPointV3":{"properties":{"rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating","description":"Рейтинг объекта на площадке, шкала 1–5. `null` — площадка рейтинг не публикует."},"rating_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rating Count","description":"Сколько оценок сформировали рейтинг, **по данным площадки**. Оценка — это выставленные звёзды, и всё; текст к ним не обязателен. `null` — площадка числа не публикует."},"review_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Review Count","description":"Сколько на площадке отзывов, то есть оценок с текстом или фото, **по данным площадки**. Это не то же, что число собранных нами отзывов: площадка считает и то, что мы ещё не забрали или что скрыто от сбора. `null` — площадка числа не публикует."},"measured_at":{"type":"string","format":"date-time","title":"Measured At","description":"Когда мы последний раз видели это значение — момент последней успешной сверки с площадкой. Сбор ходит дважды в сутки, поэтому свежесть здесь измеряется часами, а не минутами."}},"type":"object","required":["measured_at"],"title":"RatingPointV3","description":"Одна точка ряда: значение и дата, когда его видели в последний раз."},"RatingV3":{"properties":{"link_id":{"type":"integer","title":"Link Id","description":"Идентификатор ссылки (страницы объекта на площадке)."},"source_id":{"type":"integer","title":"Source Id","description":"Идентификатор площадки. Берётся из `GET /v3/sources`."},"rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating","description":"Рейтинг объекта на площадке, шкала 1–5. `null` — площадка рейтинг не публикует."},"rating_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rating Count","description":"Сколько оценок сформировали рейтинг, **по данным площадки**. Оценка — это выставленные звёзды, и всё; текст к ним не обязателен. `null` — площадка числа не публикует."},"review_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Review Count","description":"Сколько на площадке отзывов, то есть оценок с текстом или фото, **по данным площадки**. Это не то же, что число собранных нами отзывов: площадка считает и то, что мы ещё не забрали или что скрыто от сбора. `null` — площадка числа не публикует."},"measured_at":{"type":"string","format":"date-time","title":"Measured At","description":"Когда мы последний раз видели это значение — момент последней успешной сверки с площадкой. Сбор ходит дважды в сутки, поэтому свежесть здесь измеряется часами, а не минутами."}},"type":"object","required":["link_id","source_id","measured_at"],"title":"RatingV3","description":"Последнее известное значение рейтинга по одной ссылке.","example":{"link_id":794,"measured_at":"2026-08-27T05:21:23","rating":4.9,"rating_count":966,"review_count":286,"source_id":1}},"ReplyCheckV3":{"properties":{"reply_found":{"type":"boolean","title":"Reply Found","description":"Стоит ли под отзывом ответ организации."},"is_ours":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Ours","description":"Совпадает ли текст с тем, что публиковали через нас. `null`, когда ответа нет."},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text","description":"Текст ответа, как его показывает площадка."},"reply_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reply Date","description":"Когда ответ появился, по данным площадки (UTC, ISO 8601)."},"checked_at":{"type":"string","format":"date-time","title":"Checked At","description":"Когда мы смотрели на площадку (UTC, ISO 8601)."}},"type":"object","required":["reply_found","checked_at"],"title":"ReplyCheckV3","description":"Что стоит под отзывом на самой площадке прямо сейчас.\n\nЭто не состояние нашей очереди, а прочитанная страница площадки: мы сходили\nтуда в момент запроса. Поэтому `reply_found: false` означает ровно «сейчас\nответа под отзывом нет» — ни больше, ни меньше."},"ReplyStatsV3":{"properties":{"reviews_with_reply":{"type":"integer","title":"Reviews With Reply","description":"Число отзывов, на которые есть ответ организации."},"unanswered_negative_count":{"type":"integer","title":"Unanswered Negative Count","description":"Число отзывов с низкой оценкой без ответа."},"reply_by_rating":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Reply By Rating","description":"Распределение отвеченных отзывов по оценкам."},"last_reply_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Last Reply Date","description":"Дата самого свежего ответа организации."}},"type":"object","required":["reviews_with_reply","unanswered_negative_count"],"title":"ReplyStatsV3","description":"Сводка по ответам организации."},"ReplyV3":{"properties":{"text":{"type":"string","title":"Text","description":"Текст ответа, который должен стоять на площадке."},"status":{"type":"string","enum":["pending","publishing","published","failed","deleted"],"title":"Status","description":"Состояние вашего ответа, а не отзыва."},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"Когда запись менялась в последний раз (UTC, ISO 8601)."}},"type":"object","required":["text","status","updated_at"],"title":"ReplyV3","description":"Ответ, принятый в работу."},"ReplyWriteV3":{"properties":{"text":{"type":"string","maxLength":4000,"minLength":1,"title":"Text","description":"Текст ответа для публикации на площадке."}},"type":"object","required":["text"],"title":"ReplyWriteV3","description":"Текст ответа, который нужно опубликовать.","example":{"text":"Спасибо за отзыв!"}},"ReturnAll_FolderV3_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/FolderV3"},"type":"array","title":"Data","description":"Все элементы (пагинации нет)."}},"type":"object","required":["data"],"title":"ReturnAll[FolderV3]"},"ReturnAll_LinkV3_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/LinkV3"},"type":"array","title":"Data","description":"Все элементы (пагинации нет)."}},"type":"object","required":["data"],"title":"ReturnAll[LinkV3]"},"ReturnAll_ObjectV3_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ObjectV3"},"type":"array","title":"Data","description":"Все элементы (пагинации нет)."}},"type":"object","required":["data"],"title":"ReturnAll[ObjectV3]"},"ReturnAll_RatingHistoryV3_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/RatingHistoryV3"},"type":"array","title":"Data","description":"Все элементы (пагинации нет)."}},"type":"object","required":["data"],"title":"ReturnAll[RatingHistoryV3]"},"ReturnAll_RatingV3_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/RatingV3"},"type":"array","title":"Data","description":"Все элементы (пагинации нет)."}},"type":"object","required":["data"],"title":"ReturnAll[RatingV3]"},"ReturnAll_ReviewV3_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ReviewV3"},"type":"array","title":"Data","description":"Все элементы (пагинации нет)."}},"type":"object","required":["data"],"title":"ReturnAll[ReviewV3]"},"ReturnAll_SourceV3_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/SourceV3"},"type":"array","title":"Data","description":"Все элементы (пагинации нет)."}},"type":"object","required":["data"],"title":"ReturnAll[SourceV3]"},"ReturnAll_WebhookV3_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/WebhookV3"},"type":"array","title":"Data","description":"Все элементы (пагинации нет)."}},"type":"object","required":["data"],"title":"ReturnAll[WebhookV3]"},"ReviewIdsRequestV3":{"properties":{"review_ids":{"items":{"type":"integer"},"type":"array","maxItems":200,"minItems":1,"title":"Review Ids","description":"Идентификаторы отзывов объекта."}},"type":"object","required":["review_ids"],"title":"ReviewIdsRequestV3","description":"Набор отзывов для скрытия, возврата, закрепления или открепления.","example":{"review_ids":[12345,67890]}},"ReviewImageV2":{"properties":{"template_url":{"type":"string","title":"Template Url","description":"URL изображения на CDN площадки в исходном виде. У части площадок содержит шаблон размера (`{size}` или `{width}`/`{height}`) и потому не предназначен для прямой вставки — для показа берите `preview` или `image`."},"preview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview","description":"Готовый URL уменьшенной версии (превью) для списков и сеток."},"image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image","description":"Готовый URL полноразмерной версии для просмотра."}},"type":"object","required":["template_url"],"title":"ReviewImageV2","description":"Изображение, приложенное к отзыву.\n\n``template_url`` — ссылка площадки «как есть», и у части CDN (Яндекс,\nОстровок, TripAdvisor, 2ГИС) она содержит шаблон размера, то есть сама по\nсебе не открывается. Готовые к показу ссылки — ``preview`` и ``image``.\n\nПравила подстановки размеров держим в паре с ``ReviewImageResponse``\n(app/schemas/review.py) — при правке менять обе.","examples":[{"image":"https://avatars.mds.yandex.net/get-altay/17743308/2a0000019f85dc34d7ee3b24b4b9ec82bdbd/XXXL","preview":"https://avatars.mds.yandex.net/get-altay/17743308/2a0000019f85dc34d7ee3b24b4b9ec82bdbd/M","template_url":"https://avatars.mds.yandex.net/get-altay/17743308/2a0000019f85dc34d7ee3b24b4b9ec82bdbd/{size}"}],"example":{"image":"https://avatars.mds.yandex.net/get-altay/17743308/2a0000019f85dc34d7ee3b24b4b9ec82bdbd/XXXL","preview":"https://avatars.mds.yandex.net/get-altay/17743308/2a0000019f85dc34d7ee3b24b4b9ec82bdbd/M","template_url":"https://avatars.mds.yandex.net/get-altay/17743308/2a0000019f85dc34d7ee3b24b4b9ec82bdbd/{size}"}},"ReviewV3":{"properties":{"id":{"type":"integer","title":"Id","description":"Идентификатор отзыва в сервисе."},"link_id":{"type":"integer","title":"Link Id","description":"Идентификатор ссылки (страницы объекта на площадке)."},"source_id":{"type":"integer","title":"Source Id","description":"Идентификатор площадки, с которой собран отзыв."},"author":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author","description":"Имя автора; `null`, если анонимен."},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text","description":"Текст отзыва; `null`, если отзыв без текста."},"review_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Review Date","description":"Дата и время публикации отзыва в том виде, как их показывает площадка — местное время площадки, **не UTC** (единственное исключение; остальные даты в UTC). ISO 8601 без таймзоны."},"rating_original":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rating Original","description":"Исходная оценка в шкале площадки."},"rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating","description":"Оценка, приведённая к единой шкале 1–5. `null`, если оценки нет."},"review_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Url","description":"Прямая ссылка на отзыв на площадке. `null`, если недоступна."},"reply_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reply Text","description":"Текст официального ответа организации. `null`, если ответа нет."},"reply_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reply Date","description":"Дата и время ответа организации (UTC, ISO 8601)."},"has_images":{"type":"boolean","title":"Has Images","description":"Признак наличия изображений в отзыве."},"images":{"items":{"$ref":"#/components/schemas/ReviewImageV2"},"type":"array","title":"Images","description":"Список изображений отзыва.","default":[]},"has_videos":{"type":"boolean","title":"Has Videos","description":"Признак наличия видео в отзыве.","default":false},"videos":{"items":{"$ref":"#/components/schemas/ReviewVideoResponse"},"type":"array","title":"Videos","description":"Список видеовложений отзыва.","default":[]},"is_deleted":{"type":"boolean","title":"Is Deleted","description":"Отзыв обнаружен удалённым на площадке (приходит только когда `true`).","default":false},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At","description":"Момент обнаружения удаления (UTC, ISO 8601)."},"is_hidden":{"type":"boolean","title":"Is Hidden","description":"Отзыв скрыт в рамках объекта (приходит только когда `true`).","default":false},"is_pinned":{"type":"boolean","title":"Is Pinned","description":"Отзыв закреплён в рамках объекта (приходит только когда `true`).","default":false},"pin_position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pin Position","description":"Позиция закреплённого отзыва: меньше — выше."},"pros":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pros","description":"Блок «достоинства» (только при `split_pros_cons=true`)."},"cons":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cons","description":"Блок «недостатки» (только при `split_pros_cons=true`)."}},"type":"object","required":["id","link_id","source_id","has_images"],"title":"ReviewV3","description":"Отзыв, приведённый к общей модели."},"ReviewVideoResponse":{"properties":{"kind":{"type":"string","enum":["embed","file","hls"],"title":"Kind","description":"Тип вложения: `embed` — встраиваемый плеер площадки (открывать в sandbox-iframe), `file` — прямая ссылка на видеофайл, `hls` — HLS-поток (`.m3u8`)."},"video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Url","description":"URL видео или встраиваемого плеера в зависимости от `kind`."},"thumbnail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail","description":"URL кадра-заставки (превью) видео."},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width","description":"Ширина видео в пикселях, если известна."},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height","description":"Высота видео в пикселях, если известна."},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms","description":"Длительность видео в миллисекундах, если известна."}},"type":"object","required":["kind"],"title":"ReviewVideoResponse","description":"Schema for a review video attachment (links only, kind-discriminated).\n\n`video_url` is a plain `str` (mirrors ReviewImageResponse.image_url), NOT\nHttpUrl: an invalid URL from the DB must not raise ValidationError and 500\nthe whole review batch. Safety is enforced on the way IN (host-allowlist\nin the scraper + scheme-guard in the save path), and on the frontend, which\nonly embeds allowlisted hosts in a sandboxed iframe (see plan §8.5)."},"ReviewsPageV3":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ReviewV3"},"type":"array","title":"Data","description":"Элементы текущей страницы."},"total":{"type":"integer","title":"Total","description":"Общее число элементов, подходящих под фильтры (без учёта limit/offset)."},"limit":{"type":"integer","title":"Limit","description":"Размер страницы, применённый к запросу."},"offset":{"type":"integer","title":"Offset","description":"Смещение от начала выборки, применённое к запросу."},"has_next":{"type":"boolean","title":"Has Next","description":"Есть ли ещё элементы за пределами текущей страницы."},"access":{"anyOf":[{"$ref":"#/components/schemas/AccessInfoV3"},{"type":"null"}],"description":"Ограничение выдачи. Приходит только когда показали не всё."},"collecting":{"anyOf":[{"$ref":"#/components/schemas/CollectingInfoV3"},{"type":"null"}],"description":"Первого сбора по части площадок ещё не было. Приходит только до первого успешного сбора."}},"type":"object","required":["data","total","limit","offset","has_next"],"title":"ReviewsPageV3","description":"Страница отзывов — конверт `Page` плюс два ключа-флага."},"ReviewsSyncPageV3":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ReviewV3"},"type":"array","title":"Data","description":"Элементы текущей страницы."},"next_cursor":{"type":"string","title":"Next Cursor","description":"Курсор для следующего запроса. Приходит всегда, в том числе на последней и на пустой странице — его и нужно сохранить у себя до следующего прогона."},"has_next":{"type":"boolean","title":"Has Next","description":"Есть ли ещё элементы прямо сейчас. `false` — обход догнал текущее состояние; возвращайтесь с сохранённым курсором позже."},"access":{"anyOf":[{"$ref":"#/components/schemas/AccessInfoV3"},{"type":"null"}],"description":"Ограничение выдачи. Приходит только когда показали не всё."}},"type":"object","required":["data","next_cursor","has_next"],"title":"ReviewsSyncPageV3","description":"Страница потока изменений отзывов."},"ScrapeStatus":{"type":"string","enum":["pending","in_progress","success","failed"],"title":"ScrapeStatus","description":"Статус последнего сбора отзывов по ссылке.\n\nЗначения совпадают с DB-enum `Link.scrape_status` (`app/models/link.py`)."},"SourceV3":{"properties":{"id":{"type":"integer","title":"Id","description":"Идентификатор площадки. Им фильтруются отзывы и аналитика (`source_ids`)."},"slug":{"type":"string","title":"Slug","description":"Машинное имя площадки, стабильное: `yandex_travel`, `google`, `2gis`."},"name":{"type":"string","title":"Name","description":"Название площадки для показа человеку: `YandexTravel`."},"base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Url","description":"Базовый адрес площадки. Ссылки объекта должны вести на этот домен."},"rating_scale":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rating Scale","description":"Исходная шкала оценок площадки (например, 5 или 10). Оценки в `/reviews` уже нормализованы к шкале 1–5 (`rating`); исходное значение — в `rating_original`. `null`, если площадка не выставляет оценок."},"supports_replies":{"type":"boolean","title":"Supports Replies","description":"Площадка поддерживает публичные ответы организации на отзывы."},"supports_images":{"type":"boolean","title":"Supports Images","description":"Отзывы на площадке могут содержать изображения."},"can_publish_reply":{"type":"boolean","title":"Can Publish Reply","description":"Rewio умеет публиковать ответы на этой площадке. Отличается от `supports_replies`: тот про саму площадку, этот — про то, что ответ можете опубликовать вы, через нас."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Момент добавления площадки в сервис (UTC, ISO 8601)."}},"type":"object","required":["id","slug","name","supports_replies","supports_images","can_publish_reply","created_at"],"title":"SourceV3","description":"Площадка отзывов (/v3).","example":{"base_url":"https://travel.yandex.ru","can_publish_reply":false,"created_at":"2026-02-08T18:33:17","id":3,"name":"YandexTravel","rating_scale":5,"slug":"yandex_travel","supports_images":true,"supports_replies":true}},"SupportAccepted":{"properties":{"status":{"type":"string","title":"Status","description":"Всегда `accepted`: обращение принято и отправлено.","examples":["accepted"]}},"type":"object","required":["status"],"title":"SupportAccepted"},"SupportMessage":{"properties":{"subject":{"type":"string","maxLength":200,"minLength":2,"title":"Subject","description":"Тема обращения."},"message":{"type":"string","maxLength":5000,"minLength":5,"title":"Message","description":"Текст обращения."},"contact":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Contact","description":"Как с вами связаться, если ответ на почту аккаунта вам не подходит: телефон, Telegram, другой адрес. Необязательно."}},"type":"object","required":["subject","message"],"title":"SupportMessage"},"TestSubscriptionResponse":{"properties":{"status":{"type":"string","const":"queued","title":"Status"},"test_id":{"type":"string","title":"Test Id"}},"type":"object","required":["status","test_id"],"title":"TestSubscriptionResponse"},"TimeseriesMetaV3":{"properties":{"object_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Object Id","description":"Объект, по которому считали. `null` в папочном режиме."},"folder_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Folder Id","description":"Папка, по которой считали. `null` в объектном режиме."},"object_ids":{"items":{"type":"integer"},"type":"array","title":"Object Ids","description":"Объекты, вошедшие в расчёт. В объектном режиме — один."},"published_from":{"type":"string","format":"date","title":"Published From","description":"Фактически применённое начало периода по дате публикации, включительно."},"published_to":{"type":"string","format":"date","title":"Published To","description":"Фактически применённый конец периода, включительно."},"source_ids":{"items":{"type":"integer"},"type":"array","title":"Source Ids","description":"Фактически применённый фильтр по площадкам. Пусто — все площадки объекта."},"generated_at":{"type":"string","format":"date-time","title":"Generated At","description":"Момент расчёта данных (UTC, ISO 8601)."},"granularity":{"type":"string","title":"Granularity","description":"Применённый размер интервала ряда: `day`, `week` или `month`."}},"type":"object","required":["object_ids","published_from","published_to","source_ids","generated_at","granularity"],"title":"TimeseriesMetaV3","description":"То же плюс размер интервала."},"TimeseriesPointV3":{"properties":{"period":{"type":"string","title":"Period","description":"Начало интервала: `YYYY-MM-DD` для дня и недели, `YYYY-MM` для месяца."},"review_count":{"type":"integer","title":"Review Count","description":"Число отзывов в этом интервале."},"average_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Rating","description":"Средняя оценка в интервале, шкала 1–5."},"reply_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reply Count","description":"Число ответов организации в интервале."},"reviews_with_text":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reviews With Text","description":"Сколько отзывов интервала с текстом."},"reviews_with_images":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reviews With Images","description":"Сколько отзывов интервала с изображениями."},"rating_distribution":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Rating Distribution","description":"Распределение отзывов интервала по оценкам."},"reply_distribution":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Reply Distribution","description":"Распределение ответов интервала по оценкам."}},"type":"object","required":["period","review_count"],"title":"TimeseriesPointV3","description":"Одна точка ряда."},"TimeseriesResponseV3":{"properties":{"meta":{"$ref":"#/components/schemas/TimeseriesMetaV3"},"series":{"items":{"$ref":"#/components/schemas/TimeseriesSeriesV3"},"type":"array","title":"Series"},"access":{"anyOf":[{"$ref":"#/components/schemas/AccessInfoV3"},{"type":"null"}],"description":"Ограничение выдачи, если показали не всё."}},"type":"object","required":["meta","series"],"title":"TimeseriesResponseV3","description":"Динамика отзывов по интервалам."},"TimeseriesSeriesV3":{"properties":{"source_id":{"type":"integer","title":"Source Id","description":"Идентификатор площадки ряда; `0` — агрегированный ряд по всем площадкам."},"source_name":{"type":"string","title":"Source Name","description":"Название площадки; для `source_id = 0` — «Все источники»."},"points":{"items":{"$ref":"#/components/schemas/TimeseriesPointV3"},"type":"array","title":"Points","description":"Точки ряда в хронологическом порядке."}},"type":"object","required":["source_id","source_name","points"],"title":"TimeseriesSeriesV3","description":"Ряд одной площадки."},"WebhookCreateV3":{"properties":{"target":{"type":"string","maxLength":500,"title":"Target","description":"HTTPS-адрес, на который приходят события."},"object_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array","maxItems":200,"minItems":1},{"type":"null"}],"title":"Object Ids","description":"Присылать события только по этим объектам. Не передано — по всем вашим."},"event_types":{"items":{"type":"string","enum":["reviews.new","replies.new","scrape.run.finished"]},"type":"array","maxItems":10,"minItems":1,"title":"Event Types","description":"Какие события присылать."},"bucket_window":{"type":"string","title":"Bucket Window","description":"Как часто собирать события в одну доставку.","default":"immediate","examples":["immediate","daily_9","daily_14"]},"filters":{"$ref":"#/components/schemas/FiltersV2","description":"Что именно присылать: оценки, площадки, наличие текста и картинок."}},"type":"object","required":["target","event_types"],"title":"WebhookCreateV3","description":"Создание подписки на события.","example":{"bucket_window":"immediate","event_types":["reviews.new"],"object_ids":[20],"target":"https://example.com/hooks/rewio"}},"WebhookUpdateV3":{"properties":{"target":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Target","description":"Новый адрес доставки."},"object_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array","maxItems":200,"minItems":1},{"type":"null"}],"title":"Object Ids","description":"Новый список объектов."},"event_types":{"anyOf":[{"items":{"type":"string","enum":["reviews.new","replies.new","scrape.run.finished"]},"type":"array","maxItems":10,"minItems":1},{"type":"null"}],"title":"Event Types","description":"Новый набор событий."},"bucket_window":{"anyOf":[{"type":"string","description":"Delivery cadence. `immediate` — one POST shortly after each scrape batch; `daily_<hour>` — one digest per day at the given UTC hour (0–23), e.g. `daily_9` = 09:00 UTC, `daily_14` = 14:00 UTC.","examples":["immediate","daily_9","daily_14"]},{"type":"null"}],"title":"Bucket Window","description":"Новое окно группировки."},"filters":{"anyOf":[{"$ref":"#/components/schemas/FiltersV2"},{"type":"null"}],"description":"Новые фильтры."},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active","description":"Включить или выключить подписку."}},"type":"object","title":"WebhookUpdateV3","description":"Изменение подписки — передавайте только изменяемые поля."},"WebhookV3":{"properties":{"id":{"type":"integer","title":"Id","description":"Идентификатор подписки."},"target":{"type":"string","title":"Target","description":"Адрес доставки."},"object_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Object Ids","description":"Объекты, по которым приходят события. `null` — по всем."},"event_types":{"items":{"type":"string","enum":["reviews.new","replies.new","scrape.run.finished"]},"type":"array","title":"Event Types","description":"События подписки."},"bucket_window":{"type":"string","title":"Bucket Window","description":"Окно группировки событий в одну доставку."},"filters":{"$ref":"#/components/schemas/FiltersV2","description":"Фильтры выдачи событий."},"is_active":{"type":"boolean","title":"Is Active","description":"Включена ли подписка."},"failure_count":{"type":"integer","title":"Failure Count","description":"Сколько неудачных доставок подряд."},"last_failure_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Failure At","description":"Момент последней неудачи (UTC, ISO 8601)."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Момент создания подписки (UTC, ISO 8601)."},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"Момент последнего изменения (UTC, ISO 8601)."}},"type":"object","required":["id","target","event_types","bucket_window","filters","is_active","failure_count","created_at","updated_at"],"title":"WebhookV3","description":"Подписка на события."}},"securitySchemes":{"APIKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key"},"APIKeyCookie":{"type":"apiKey","in":"cookie","name":"rewio_session"}}},"tags":[{"name":"sources","description":"Список поддерживаемых площадок отзывов."},{"name":"objects","description":"Объекты — единицы бизнеса, отзывы по которым собираются (филиал, клиника, конкретный специалист). Создание, просмотр, изменение и удаление объектов."},{"name":"folders","description":"Папки объектов. Позволяют спросить отзывы сразу по нескольким объектам одним параметром `folder_id` — см. `GET /v3/reviews` и `GET /v3/analytics`."},{"name":"links","description":"Ссылки внутри объекта — страницы объекта на площадках, по одной на площадку. Добавление, изменение и удаление ссылок, статус сбора отзывов."},{"name":"reviews","description":"Нормализованные отзывы объекта с фильтрацией, сортировкой и пагинацией."},{"name":"hidden & pinned","description":"Скрытие ненужных и закрепление нужных отзывов внутри объекта; сами отзывы не меняются."},{"name":"replies","description":"Ответы на отзывы от лица организации: публикация, замена и снятие, плюс подключение площадок. Форма запроса одна для всех площадок."},{"name":"analytics","description":"Агрегированная аналитика по отзывам объекта: сводка и динамика."},{"name":"webhooks","description":"Webhook-уведомления о новых отзывах.\n\n**Быстрый старт:**\n1. `POST /v3/webhooks` c `{\"target\": \"https://...\"}` — создать вебхук.\n2. `POST /v3/webhooks/{id}/test` — тестовая доставка на ваш endpoint.\n3. Принимайте POST-запросы с событием `reviews.new` (дайджест новых отзывов по вашим объектам); отвечайте `2xx`.\n4. При проблемах — ответьте `2xx` быстро: мы повторяем доставку сами, а не доставленное после всех попыток пишем вам письмом.\n\n**Секрет подписи — один на аккаунт** (виден всегда): `GET /v3/webhooks/secret`; перевыпуск — `POST /v3/webhooks/rotate-secret` (старый действует ещё 24ч).\n\n**Проверка подписи** (опциональна, но рекомендуется): заголовок `X-Hrev-Signature: sha256=<hex>`, где `hex = HMAC_SHA256(secret, \"{X-Hrev-Timestamp}.\" + raw_body)`. Сравнивайте constant-time-функцией; отклоняйте запросы, у которых `|now − X-Hrev-Timestamp| > 300` секунд. Дедуплицируйте по `X-Hrev-Delivery-Id` (при ретраях один дайджест может прийти дважды). Отвечайте 2xx в течение 10 секунд; 5xx/408/429/таймаут — будет ретрай по нарастающей лестнице (30с → 30м, до 30 попыток за ~12ч), прочие 4xx — доставка помечается failed без ретраев. После 50 подряд неуспешных доставок вебхук автоматически ставится на паузу.\n\nАвторизация через **X-API-Key**."},{"name":"health","description":"Доступность API. Ключ не нужен — метод отвечает и без заголовка `X-API-Key`, поэтому им удобно отделять проблему с сетью от проблемы с ключом."},{"name":"support","description":"Написать разработчику: вопрос по API, ошибка, просьба. Работает с любым ключом, включая `read_only`. Номер аккаунта, почта и тариф подставляются сами — писать их в тексте не нужно."}]}