{"openapi":"3.1.0","info":{"title":"Bounty API — пользователи","description":"Открытый API гостя: поиск и карта, карточки объектов пяти категорий, афиша\nраздела «События», бронирование, долгосрочная аренда, чат, отзывы, профиль.\n\nВход **не нужен** для каталога, карты, афиши и карточек: их обязан видеть\nлюбой посетитель. Регистрация требуется там, где появляется он сам —\nбронирование, переписка, избранное, документы.\n\nЭтим же API пользуются веб-клиент, Android, iOS и Telegram-бот: у них один\nконтракт и один набор строк локализации.\n\n\n## Общие правила\n\n**Версия — в пути.** Все эндпоинты начинаются с `/v1`. Ломающие изменения\nвыходят новой версией пути, а не правкой текущей.\n\n**Аутентификация — `Authorization: Bearer <access>`.** Токен выдаёт\n`POST /v1/auth/login`; он живёт 15 минут, обновляется по `refresh`-токену\nчерез `POST /v1/auth/refresh`. Обмен отдаёт свежий `access` и **тот же**\n`refresh`, а срок сессии сдвигается: сессия держится, пока ей пользуются\n(Р-467). Выход и «выйти везде» закрывают сессию сразу.\n\n**Токен одного API никогда не принимается другим.** У каждой аудитории свой\nсекрет подписи, а не только claim `aud`: чужой токен не проходит проверку\nподписи, а не проверку прав.\n\n### Ответы и ошибки\n\nУспех — тело эндпоинта как есть. Ошибка — всегда один и тот же конверт:\n\n```json\n{\n  \"error\": {\n    \"code\": \"validation_error\",\n    \"message\": \"Дата выезда должна быть позже даты заезда\",\n    \"details\": {\"field\": \"date_to\"},\n    \"request_id\": \"0f1c…\"\n  }\n}\n```\n\n`code` — машинный, по нему и нужно ветвиться. `message` — для человека, он\nможет меняться. `request_id` есть в каждом ответе и в заголовке\n`X-Request-Id`: с ним обращение в поддержку находит запрос в журнале за\nсекунды.\n\nКоды: `400 validation_error`, `401 unauthorized`, `403 forbidden`,\n`404 not_found`, `409 conflict`, `422` (проверка схемы), `429 rate_limited`\n(с заголовком `Retry-After`), `500 internal_error`.\n\n### Списки\n\nПагинация **курсорная**, `OFFSET` не используется нигде:\n\n```json\n{\"items\": [...], \"next_cursor\": \"eyJ…\", \"has_more\": true}\n```\n\n`next_cursor` непрозрачен — собирать его руками нельзя, его форма не часть\nконтракта. Нет `next_cursor` — страница последняя.\n\n### Повторы и идемпотентность\n\nСоздающие запросы принимают заголовок `Idempotency-Key`. Повтор с тем же\nключом возвращает **тот же** результат, а не заводит вторую запись. Ключ\nживёт 24 часа.\n\n### Частота\n\nЛимиты считаются по адресу и по актёру. Превышение — `429` с `Retry-After` в\nсекундах. Клиент обязан ждать указанное время, а не повторять сразу.\n\n### Время, деньги и языки\n\n* **Время объекта — в его часовом поясе** и в UTC не переводится никогда.\n  Календарные даты (заезд, выезд, день события) — это `date` в поясе объекта.\n  Моменты — `timestamptz` в UTC.\n* **Деньги — в минорных единицах** (`price_minor`) вместе с кодом валюты.\n  Суммы никогда не приходят от клиента: их считает сервер.\n* **Язык ответа** — заголовок `Accept-Language` или параметр `lang`. Языки:\n  `en` (по умолчанию), `ru`, `th`, `zh-Hans`. Непереведённая строка отдаётся\n  по-английски, а переведённый контент помечается пометкой о переводе.\n\n### Особенности этого API\n\n* **Поиск по месту — строкой, а не фильтром.** Параметра `place_id` нет:\n  район и город приходят в `q` и сверяются с названием, описанием и местом\n  объекта на всех языках сразу, по словам.\n* **Realtime** — WebSocket `/v1/ws` с тем же `access`-токеном: чат,\n  уведомления, изменения брони.\n* **Фотографии — до трёх размеров** (`thumb` 480, `medium` 1600,\n  `large` 2560). `large` существует не всегда; клиент обязан пережить его\n  отсутствие и показать `medium`.","version":"26.10.19"},"paths":{"/v1/auth/email-availability":{"get":{"tags":["Аутентификация"],"summary":"Свободен ли адрес — подсказка прямо в форме регистрации","description":"Под жёстким лимитом: без него это готовая проверялка «есть ли у вас\nаккаунт на Bounty» для чужих списков адресов.","operationId":"email_availability_v1_auth_email_availability_get","parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","minLength":3,"maxLength":320,"title":"Email"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailAvailabilityResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/auth/register":{"post":{"tags":["Аутентификация"],"summary":"Регистрация: имя, фамилия, почта, пароль (Р-016)","operationId":"register_v1_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"201":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPairResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/auth/confirm-email":{"post":{"tags":["Аутентификация"],"summary":"Подтверждение адреса по ссылке из письма","operationId":"confirm_email_v1_auth_confirm_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmEmailRequest"}}},"required":true},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/auth/resend-confirmation":{"post":{"tags":["Аутентификация"],"summary":"Выслать письмо с подтверждением заново","operationId":"resend_confirmation_v1_auth_resend_confirmation_post","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/auth/login":{"post":{"tags":["Аутентификация"],"summary":"Вход по почте и паролю","operationId":"login_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPairResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/auth/refresh":{"post":{"tags":["Аутентификация"],"summary":"Обмен refresh-токена на новую пару","description":"Капчи здесь нет намеренно: обновление происходит в фоне, без участия\nчеловека, и показать ему картинку в этот момент невозможно.","operationId":"refresh_v1_auth_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshRequest"}}},"required":true},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPairResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/auth/ws-ticket":{"post":{"tags":["Аутентификация"],"summary":"Одноразовый билет для подключения к /v1/ws (docs/api.md §7)","description":"Нужен веб-клиенту: у страницы токена нет вовсе — он в cookie `HttpOnly`, и\nзаголовок `Authorization` браузерному `WebSocket` не поставить. Билет\nживёт минуту, гасится при первом использовании и не открывает ничего,\nкроме сокета.\n\nПриложениям он не нужен: у них есть токен, и они шлют его параметром.\n\nБилет требует **подтверждённой** почты (Р-217): сокет ведёт в переписку и\nуведомления, а они закрыты до подтверждения. Сам сокет проверяет это ещё\nраз — приложение приходит туда с токеном, минуя билет.","operationId":"ws_ticket_v1_auth_ws_ticket_post","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WsTicketResponse"}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/auth/logout":{"post":{"tags":["Аутентификация"],"summary":"Выход: текущая сессия завершается","operationId":"logout_v1_auth_logout_post","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/auth/logout-all":{"post":{"tags":["Аутентификация"],"summary":"Выход на всех устройствах, кроме текущего","operationId":"logout_all_v1_auth_logout_all_post","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/auth/sessions":{"get":{"tags":["Аутентификация"],"summary":"Список устройств, с которых выполнен вход","operationId":"sessions_v1_auth_sessions_get","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SessionResponse"},"type":"array","title":"Response Sessions V1 Auth Sessions Get"}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/auth/password-reset/request":{"post":{"tags":["Аутентификация"],"summary":"Запрос ссылки на смену пароля","description":"Всегда `202`, независимо от того, есть такой аккаунт или нет: разные\nответы превратили бы форму в проверялку списков адресов.","operationId":"password_reset_request_v1_auth_password_reset_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetRequest"}}},"required":true},"responses":{"202":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/auth/password-reset/confirm":{"post":{"tags":["Аутентификация"],"summary":"Установка нового пароля по ссылке из письма","description":"Все сессии завершаются: пароль меняют, когда подозревают утечку.","operationId":"password_reset_confirm_v1_auth_password_reset_confirm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetConfirm"}}},"required":true},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/auth/password/change":{"post":{"tags":["Аутентификация"],"summary":"Смена пароля изнутри аккаунта. Текущая сессия остаётся жить","operationId":"password_change_v1_auth_password_change_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordChangeRequest"}}},"required":true},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/auth/delete-request":{"post":{"tags":["Аутентификация"],"summary":"Запрос на удаление аккаунта — подтверждается письмом","description":"Код с картинки — по подозрению, как у входа и сброса пароля (Р-277,\nР-466): тело необязательное, пустая пара проходит, пока клиент не похож\nна робота. Похож — `captcha_required`, и форма показывает картинку.","operationId":"delete_request_v1_auth_delete_request_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/DeleteRequest"},{"type":"null"}],"title":"Payload"}}}},"responses":{"202":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/auth/delete-confirm":{"post":{"tags":["Аутентификация"],"summary":"Подтверждение удаления аккаунта по ссылке из письма","operationId":"delete_confirm_v1_auth_delete_confirm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmEmailRequest"}}},"required":true},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/me":{"get":{"tags":["Профиль"],"summary":"Свой профиль целиком — вместе с действующими ограничениями (находка №279)","operationId":"read_profile_v1_me_get","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileResponse"}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]},"patch":{"tags":["Профиль"],"summary":"Правка профиля","description":"Меняются только переданные поля: `model_fields_set` отличает «не\nпередали» от «передали пусто», иначе форма с одним полем стирала бы\nостальные.","operationId":"update_profile_v1_me_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileUpdateRequest"}}},"required":true},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/me/badges":{"get":{"tags":["Профиль"],"summary":"Счётчики непрочитанного: уведомления, сообщения, Bounty AI","description":"Три числа для обвязки клиента одним запросом (Р-465).\n\n* `notifications` — непрочитанные уведомления (число у колокольчика,\n  W44); гаснут после `POST /v1/notifications/read`;\n* `messages` — непрочитанные сообщения во всех переписках гостя (число\n  у значка сообщений и точка у вкладки «Профиль»); гаснут после\n  `POST /v1/chats/dialogs/{id}/read`;\n* `assistant` — сообщения Bounty AI, которых гость ещё не видел (точка\n  у вкладки «Bounty»); гаснут после `POST /v1/assistant/read`.\n\nЗапрос лёгкий — три счёта по индексам, — но дёргать его на каждом\nэкране незачем: сайт помнит ответ минуту, приложения обновляют его по\nсобытиям сокета `/v1/ws` и при возврате на экран.","operationId":"read_badges_v1_me_badges_get","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadgesResponse"}}}},"401":{"description":"Нет входа или токен истёк — `unauthorized`"},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/me/avatar":{"put":{"tags":["Профиль"],"summary":"Загрузка аватара. Изображение перекодируется, метаданные вырезаются","operationId":"set_avatar_v1_me_avatar_put","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_set_avatar_v1_me_avatar_put"}}},"required":true},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvatarResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]},"delete":{"tags":["Профиль"],"summary":"Убрать аватар","operationId":"clear_avatar_v1_me_avatar_delete","responses":{"204":{"description":"Успешный ответ"},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/me/sessions":{"get":{"tags":["Профиль"],"summary":"Список устройств","description":"Дублирует `/v1/auth/sessions`: в интерфейсе этот список живёт в настройках профиля, а не на экране входа.","operationId":"sessions_v1_me_sessions_get","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SessionResponse"},"type":"array","title":"Response Sessions V1 Me Sessions Get"}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/me/sessions/{session_id}":{"delete":{"tags":["Профиль"],"summary":"Завершить сессию на выбранном устройстве","operationId":"revoke_session_v1_me_sessions__session_id__delete","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/me/search-filters":{"get":{"tags":["Профиль"],"summary":"Сохранённые фильтры по разделам и последняя область карты (Р-017)","operationId":"read_filters_v1_me_search_filters_get","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchFiltersResponse"}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]},"put":{"tags":["Профиль"],"summary":"Сохранение фильтров. Разделы, которых нет в теле, не трогаются","operationId":"save_filters_v1_me_search_filters_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchFiltersRequest"}}},"required":true},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchFiltersResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/me/email-prefs":{"get":{"tags":["Профиль"],"summary":"Галочки писем по группам. Чего человек не трогал — по умолчанию из реестра","operationId":"read_email_prefs_v1_me_email_prefs_get","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailPrefsBody"}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]},"put":{"tags":["Профиль"],"summary":"Включить или выключить письма: {\"prefs\": {\"booking.reminder\": false}}","description":"Выключить можно всё, кроме ответов на действие самого человека\n(подтверждение почты, сброс пароля): их в настройках нет вовсе.\nНезнакомый код — `400 email_pref_unknown`.","operationId":"update_email_prefs_v1_me_email_prefs_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailPrefsUpdate"}}},"required":true},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailPrefsBody"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/me/push-prefs":{"get":{"tags":["Профиль"],"summary":"Общий выключатель пушей и галочки по группам","description":"Это настройки **аккаунта**. Разрешение пушей даёт каждое устройство само\n(`POST /v1/devices`): включённые здесь пуши приходят только на те\nустройства, где они разрешены и где человек сейчас вошёл.","operationId":"read_push_prefs_v1_me_push_prefs_get","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PushPrefsBody"}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]},"put":{"tags":["Профиль"],"summary":"Выключатель и/или галочки: {\"enabled\": true, \"prefs\": {\"message.new\": false}}","description":"Выключить можно любой пуш. Незнакомый код — `400 push_pref_unknown`.","operationId":"update_push_prefs_v1_me_push_prefs_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PushPrefsUpdate"}}},"required":true},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PushPrefsBody"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/me/transactions":{"get":{"tags":["Профиль"],"summary":"«Транзакции» (S71, W45; Р-447): оплаты и возвраты, новые сверху, как в выписке банка","description":"У операции — вид (`booking_payment`, `booking_refund`), состояние (`paid`,\n`failed`, `pending`), сумма платежа, сумма заказа и курс, способ, номер\nоперации банка, время с поясом места и «За что» (`target`). `summary` —\nитог нынешнего месяца: оплачено и возвращено.","operationId":"read_transactions_v1_me_transactions_get","parameters":[{"name":"type","in":"query","required":false,"schema":{"type":"string","description":"all · payments · refunds","default":"all","title":"Type"},"description":"all · payments · refunds"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100,"minimum":1},{"type":"null"}],"title":"Limit"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/me/transactions/{tx_id}":{"get":{"tags":["Профиль"],"summary":"Одна операция (S72, W46) — по номеру из выписки (pay_…, ref_…)","operationId":"read_transaction_v1_me_transactions__tx_id__get","parameters":[{"name":"tx_id","in":"path","required":true,"schema":{"type":"string","title":"Tx Id"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/media/{media_id}":{"get":{"tags":["Приватные файлы"],"summary":"Отдаёт приватный файл потоком","description":"Определяем владельца одним из двух способов и только потом проверяем\nправо: без билета — по токену, с билетом — по сессии, которой он выдан.","operationId":"download_v1_media__media_id__get","parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Media Id"}},{"name":"t","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"T"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/media/{media_id}/ticket":{"post":{"tags":["Приватные файлы"],"summary":"Одноразовая ссылка на 60 секунд для показа файла в <img>","description":"Право проверяется здесь, до выдачи билета: билет — способ доставки, а не\nразрешение.","operationId":"create_ticket_v1_media__media_id__ticket_post","parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Media Id"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaTicketResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/map/{path}":{"get":{"tags":["Карта"],"summary":"Ресурс карты: стиль, TileJSON, тайл, шрифт, спрайт или рельеф","description":"Отдаётся ровно тем же телом и теми же заголовками кеширования, что пришли\nот OpenFreeMap: клиент обязан кешировать тайлы так же, как при прямом\nпути, иначе запасная дорога стоила бы вдесятеро дороже прямой.","operationId":"map_resource_v1_map__path__get","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/i18n":{"get":{"tags":["Локализация"],"summary":"Набор строк целиком, уже с подстановкой недостающего из английского","description":"Клиент получает **полный** словарь, а не набор дыр, которые ему нечем\nзакрыть: непереведённый ключ приходит по-английски, и это лучше пустой\nкнопки.\n\nЯзык берётся из параметра, иначе из `Accept-Language`; неизвестный —\nанглийский. Если `version` совпадает с текущей, отвечаем `304`: набор\nстрок весит килобайты, но телефон в тайском 3G считает и их.","operationId":"get_catalog_v1_i18n_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Lang"}},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Version"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/i18n/languages":{"get":{"tags":["Локализация"],"summary":"Языки интерфейса — для экрана выбора языка (S66)","description":"Каждый назван **на самом себе**: «Тайский» ничего не говорит тому, кто\nищет тайский. Флагов у языков нет: флаг — это страна, а не язык.","operationId":"get_languages_v1_i18n_languages_get","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Languages V1 I18N Languages Get"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/places":{"get":{"tags":["Справочники"],"summary":"Иерархия мест на языке запроса","operationId":"places_v1_places_get","parameters":[{"name":"parent_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Только дети этого места","title":"Parent Id"},"description":"Только дети этого места"},{"name":"level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"country / region / district / area","title":"Level"},"description":"country / region / district / area"},{"name":"with_totals","in":"query","required":false,"schema":{"type":"boolean","description":"Считать объекты вместе со вложенными местами","default":false,"title":"With Totals"},"description":"Считать объекты вместе со вложенными местами"}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlaceResponse"},"title":"Response Places V1 Places Get"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/places/popular":{"get":{"tags":["Справочники"],"summary":"Популярные направления для главной — по числу опубликованных объектов","operationId":"popular_places_v1_places_popular_get","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PlaceResponse"},"type":"array","title":"Response Popular Places V1 Places Popular Get"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/places/{slug}":{"get":{"tags":["Справочники"],"summary":"Страница направления: место, путь сверху, что внутри, сколько чего","description":"Объявлен **после** `/v1/places/popular`: маршрут с параметром, стоящий\nраньше, перехватил бы слово `popular` как адрес места и всегда отвечал бы\n«направление не найдено».","operationId":"place_card_v1_places__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaceCardResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/amenities":{"get":{"tags":["Справочники"],"summary":"Удобства группами. С kind — только применимые к этой категории","operationId":"amenities_v1_amenities_get","parameters":[{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"stay / experience / service","title":"Kind"},"description":"stay / experience / service"}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AmenityResponse"},"title":"Response Amenities V1 Amenities Get"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/categories":{"get":{"tags":["Справочники"],"summary":"Категории впечатлений, услуг, транспорта или еды","description":"С `with_counts=true` у каждой — число опубликованных объектов: чипы над\nлентой раздела пишут его рядом с названием (макет W01). Граница та же,\nчто у ленты; остальные фильтры на число не влияют.","operationId":"categories_v1_categories_get","parameters":[{"name":"kind","in":"query","required":true,"schema":{"type":"string","description":"experience, service, transport или food","title":"Kind"},"description":"experience, service, transport или food"},{"name":"with_counts","in":"query","required":false,"schema":{"type":"boolean","description":"Добавить `listings_count` — сколько опубликованных объектов в категории (чипы раздела W01)","default":false,"title":"With Counts"},"description":"Добавить `listings_count` — сколько опубликованных объектов в категории (чипы раздела W01)"}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/app__schemas__catalog__CategoryResponse"},"title":"Response Categories V1 Categories Get"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/currencies":{"get":{"tags":["Справочники"],"summary":"Валюты отображения","operationId":"currencies_v1_currencies_get","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CurrencyResponse"},"type":"array","title":"Response Currencies V1 Currencies Get"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/fx/rates":{"get":{"tags":["Справочники"],"summary":"Курсы валют ЦБ РФ для примерной цены (Р-214)","description":"Открыт без токена: пересчёт нужен и гостю, который ещё не завёл учётную\nзапись, — именно он чаще всего и смотрит цены впервые.\n\n**Это подсказка, а не цена.** Платит человек в валюте объявления, банк\nпересчитывает по своему курсу, и клиент обязан пометить пересчёт как\nпримерный.","operationId":"fx_rates_v1_fx_rates_get","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FxRatesResponse"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/config":{"get":{"tags":["Справочники"],"summary":"Публичная конфигурация: карта, языки, валюты, лимиты, регион афиши","operationId":"config_v1_config_get","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfigResponse"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/nodes":{"get":{"tags":["Справочники"],"summary":"Серверы для выбора по пингу (Р-024, docs/nodes/architecture.md §4)","description":"`origin` — главный сервер, есть всегда, даже когда узлов ноль: клиенту\nне нужно знать его адрес из своей сборки. В `nodes` — только узлы в\nсостоянии `active`. Узел — это API и кеш файлов на одном сервере: у\nкаждого — пара адресов, и выбираются они вместе.","operationId":"nodes_v1_nodes_get","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Nodes V1 Nodes Get"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/search/listings":{"get":{"tags":["Поиск"],"summary":"Лента раздела: карточки по фильтрам, курсорная пагинация","description":"Тексты приходят на языке запроса: у объекта, заведённого по-тайски, берётся\nперевод, и в ответе стоит пометка о нём (Р-063).","operationId":"feed_v1_search_listings_get","parameters":[{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"stay / experience / service / transport / food / all","title":"Kind"},"description":"stay / experience / service / transport / food / all"},{"name":"bbox","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"minLon,minLat,maxLon,maxLat","title":"Bbox"},"description":"minLon,minLat,maxLon,maxLat"},{"name":"near","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"lat,lon","title":"Near"},"description":"lat,lon"},{"name":"radius_m","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":200000,"minimum":100},{"type":"null"}],"title":"Radius M"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Текст запроса. Ищет по названию, описанию и **месту** объекта, на всех языках сразу и по словам: «вилла патонг» найдёт виллы Патонга. Отдельного фильтра места нет (Р-282)","title":"Q"},"description":"Текст запроса. Ищет по названию, описанию и **месту** объекта, на всех языках сразу и по словам: «вилла патонг» найдёт виллы Патонга. Отдельного фильтра места нет (Р-282)"},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To"}},{"name":"guests","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":1},{"type":"null"}],"title":"Guests"}},{"name":"price_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Price Min"}},{"name":"price_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Price Max"}},{"name":"currency","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":3},{"type":"null"}],"title":"Currency"}},{"name":"property_type","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Property Type"}},{"name":"room_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Room Type"}},{"name":"bedrooms_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":0},{"type":"null"}],"title":"Bedrooms Min"}},{"name":"beds_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":0},{"type":"null"}],"title":"Beds Min"}},{"name":"bathrooms_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":0},{"type":"null"}],"title":"Bathrooms Min"}},{"name":"beach_distance_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Beach Distance Max"}},{"name":"pets_allowed","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Pets Allowed"}},{"name":"smoking_allowed","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Smoking Allowed"}},{"name":"children_allowed","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Жильё: можно с детьми","title":"Children Allowed"},"description":"Жильё: можно с детьми"},{"name":"parties_allowed","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Жильё: можно вечеринки","title":"Parties Allowed"},"description":"Жильё: можно вечеринки"},{"name":"long_stay","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Long Stay"}},{"name":"category_id","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"integer"}},{"type":"null"}],"title":"Category Id"}},{"name":"duration_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Duration Max"}},{"name":"languages","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Languages"}},{"name":"group_size_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Group Size Max"}},{"name":"same_day","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Same Day"}},{"name":"price_unit","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price Unit"}},{"name":"vehicle_kind","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Vehicle Kind"}},{"name":"transmission","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transmission"}},{"name":"seats_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":60,"minimum":1},{"type":"null"}],"title":"Seats Min"}},{"name":"food_format","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Food Format"}},{"name":"diets","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Отметки меню; нужны все сразу","title":"Diets"},"description":"Отметки меню; нужны все сразу"},{"name":"alcohol","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Alcohol"}},{"name":"amenities","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Коды удобств; нужны все сразу","title":"Amenities"},"description":"Коды удобств; нужны все сразу"},{"name":"instant_book","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Instant Book"}},{"name":"rating_min","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":5,"minimum":0},{"type":"null"}],"title":"Rating Min"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"relevance / price_asc / price_desc / rating / distance / new","title":"Sort"},"description":"relevance / price_asc / price_desc / rating / distance / new"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":1},{"type":"null"}],"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__search__FeedResponse"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{},{"bearerAuth":[]}]}},"/v1/search/map":{"get":{"tags":["Поиск"],"summary":"Метки и кластеры карты по тем же фильтрам, что и лента","description":"Объекты в режиме `city_only` точки не имеют вовсе и на карту не попадают\n(Р-040) — их видно в ленте по своему городу.","operationId":"map_view_v1_search_map_get","parameters":[{"name":"zoom","in":"query","required":true,"schema":{"type":"integer","maximum":20,"minimum":0,"description":"Зум карты: до 12 — кластеры, дальше метки","title":"Zoom"},"description":"Зум карты: до 12 — кластеры, дальше метки"},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"stay / experience / service / transport / food / all","title":"Kind"},"description":"stay / experience / service / transport / food / all"},{"name":"bbox","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"minLon,minLat,maxLon,maxLat","title":"Bbox"},"description":"minLon,minLat,maxLon,maxLat"},{"name":"near","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"lat,lon","title":"Near"},"description":"lat,lon"},{"name":"radius_m","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":200000,"minimum":100},{"type":"null"}],"title":"Radius M"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Текст запроса. Ищет по названию, описанию и **месту** объекта, на всех языках сразу и по словам: «вилла патонг» найдёт виллы Патонга. Отдельного фильтра места нет (Р-282)","title":"Q"},"description":"Текст запроса. Ищет по названию, описанию и **месту** объекта, на всех языках сразу и по словам: «вилла патонг» найдёт виллы Патонга. Отдельного фильтра места нет (Р-282)"},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To"}},{"name":"guests","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":1},{"type":"null"}],"title":"Guests"}},{"name":"price_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Price Min"}},{"name":"price_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Price Max"}},{"name":"currency","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":3},{"type":"null"}],"title":"Currency"}},{"name":"property_type","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Property Type"}},{"name":"room_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Room Type"}},{"name":"bedrooms_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":0},{"type":"null"}],"title":"Bedrooms Min"}},{"name":"beds_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":0},{"type":"null"}],"title":"Beds Min"}},{"name":"bathrooms_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":0},{"type":"null"}],"title":"Bathrooms Min"}},{"name":"beach_distance_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Beach Distance Max"}},{"name":"pets_allowed","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Pets Allowed"}},{"name":"smoking_allowed","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Smoking Allowed"}},{"name":"children_allowed","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Жильё: можно с детьми","title":"Children Allowed"},"description":"Жильё: можно с детьми"},{"name":"parties_allowed","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Жильё: можно вечеринки","title":"Parties Allowed"},"description":"Жильё: можно вечеринки"},{"name":"long_stay","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Long Stay"}},{"name":"category_id","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"integer"}},{"type":"null"}],"title":"Category Id"}},{"name":"duration_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Duration Max"}},{"name":"languages","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Languages"}},{"name":"group_size_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Group Size Max"}},{"name":"same_day","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Same Day"}},{"name":"price_unit","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price Unit"}},{"name":"vehicle_kind","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Vehicle Kind"}},{"name":"transmission","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transmission"}},{"name":"seats_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":60,"minimum":1},{"type":"null"}],"title":"Seats Min"}},{"name":"food_format","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Food Format"}},{"name":"diets","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Отметки меню; нужны все сразу","title":"Diets"},"description":"Отметки меню; нужны все сразу"},{"name":"alcohol","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Alcohol"}},{"name":"amenities","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Коды удобств; нужны все сразу","title":"Amenities"},"description":"Коды удобств; нужны все сразу"},{"name":"instant_book","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Instant Book"}},{"name":"rating_min","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":5,"minimum":0},{"type":"null"}],"title":"Rating Min"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"relevance / price_asc / price_desc / rating / distance / new","title":"Sort"},"description":"relevance / price_asc / price_desc / rating / distance / new"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":1},{"type":"null"}],"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__search__MapResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/search/count":{"get":{"tags":["Поиск"],"summary":"Сколько вариантов подходит — для кнопки «Показать N вариантов»","description":"Отдельным лёгким запросом, а не полем ленты: панель фильтров пересчитывает\nчисло на каждой галочке, и тянуть ради этого двадцать карточек с\nфотографиями незачем.","operationId":"count_v1_search_count_get","parameters":[{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"stay / experience / service / transport / food / all","title":"Kind"},"description":"stay / experience / service / transport / food / all"},{"name":"bbox","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"minLon,minLat,maxLon,maxLat","title":"Bbox"},"description":"minLon,minLat,maxLon,maxLat"},{"name":"near","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"lat,lon","title":"Near"},"description":"lat,lon"},{"name":"radius_m","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":200000,"minimum":100},{"type":"null"}],"title":"Radius M"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Текст запроса. Ищет по названию, описанию и **месту** объекта, на всех языках сразу и по словам: «вилла патонг» найдёт виллы Патонга. Отдельного фильтра места нет (Р-282)","title":"Q"},"description":"Текст запроса. Ищет по названию, описанию и **месту** объекта, на всех языках сразу и по словам: «вилла патонг» найдёт виллы Патонга. Отдельного фильтра места нет (Р-282)"},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To"}},{"name":"guests","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":1},{"type":"null"}],"title":"Guests"}},{"name":"price_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Price Min"}},{"name":"price_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Price Max"}},{"name":"currency","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":3},{"type":"null"}],"title":"Currency"}},{"name":"property_type","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Property Type"}},{"name":"room_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Room Type"}},{"name":"bedrooms_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":0},{"type":"null"}],"title":"Bedrooms Min"}},{"name":"beds_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":0},{"type":"null"}],"title":"Beds Min"}},{"name":"bathrooms_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":0},{"type":"null"}],"title":"Bathrooms Min"}},{"name":"beach_distance_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Beach Distance Max"}},{"name":"pets_allowed","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Pets Allowed"}},{"name":"smoking_allowed","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Smoking Allowed"}},{"name":"children_allowed","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Жильё: можно с детьми","title":"Children Allowed"},"description":"Жильё: можно с детьми"},{"name":"parties_allowed","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Жильё: можно вечеринки","title":"Parties Allowed"},"description":"Жильё: можно вечеринки"},{"name":"long_stay","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Long Stay"}},{"name":"category_id","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"integer"}},{"type":"null"}],"title":"Category Id"}},{"name":"duration_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Duration Max"}},{"name":"languages","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Languages"}},{"name":"group_size_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Group Size Max"}},{"name":"same_day","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Same Day"}},{"name":"price_unit","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price Unit"}},{"name":"vehicle_kind","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Vehicle Kind"}},{"name":"transmission","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transmission"}},{"name":"seats_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":60,"minimum":1},{"type":"null"}],"title":"Seats Min"}},{"name":"food_format","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Food Format"}},{"name":"diets","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Отметки меню; нужны все сразу","title":"Diets"},"description":"Отметки меню; нужны все сразу"},{"name":"alcohol","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Alcohol"}},{"name":"amenities","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Коды удобств; нужны все сразу","title":"Amenities"},"description":"Коды удобств; нужны все сразу"},{"name":"instant_book","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Instant Book"}},{"name":"rating_min","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":5,"minimum":0},{"type":"null"}],"title":"Rating Min"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"relevance / price_asc / price_desc / rating / distance / new","title":"Sort"},"description":"relevance / price_asc / price_desc / rating / distance / new"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":1},{"type":"null"}],"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountResponse"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/search/price-range":{"get":{"tags":["Поиск"],"summary":"Границы ползунка цены раздела — в валюте человека (Р-275)","description":"Остальные фильтры сюда не приходят намеренно: края ползунка, прыгающие от\nкаждой галочки, не дают его двигать. Пересчёт тот же, что у фильтра цены\n(Р-218), — край не обещает цену, которой фильтр не найдёт.","operationId":"price_range_v1_search_price_range_get","parameters":[{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Раздел; без него — все пять","title":"Kind"},"description":"Раздел; без него — все пять"},{"name":"currency","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":3},{"type":"null"}],"description":"Валюта человека","title":"Currency"},"description":"Валюта человека"}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceRangeResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/search/suggest":{"get":{"tags":["Поиск"],"summary":"Подсказки строки поиска: места и объекты","description":"Ищет по **переводам** названий мест, а не по кодам: человек пишет «Пхукет»\nили «Phuket», а не `phuket-province`.","operationId":"suggest_v1_search_suggest_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":120,"title":"Q"}},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuggestResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/events/categories":{"get":{"tags":["События"],"summary":"Справочник категорий раздела на языке запроса","description":"Объявлен **до** `/{slug}`: маршрут с параметром, стоящий раньше, перехватил\nбы слово `categories` как адрес события.","operationId":"categories_v1_events_categories_get","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/app__schemas__events__CategoryResponse"},"type":"array","title":"Response Categories V1 Events Categories Get"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/events/calendar":{"get":{"tags":["События"],"summary":"Полоска календаря над лентой: сколько событий в каждом дне","description":"Считается **с теми же фильтрами**, что и лента: выбранная категория\nменяет числа в полоске, иначе день с цифрой «12» открывался бы пустым.\nДень самого запроса в расчёт не идёт — полоска показывает всё окно.\n\nВ сегодняшнем дне не считается **то, что уже закончилось** (находка\n№171) — ровно как в ленте. Остальных дней окна отсечка не касается:\nона привязана к сегодняшнему числу, а не к началу окна.","operationId":"calendar_v1_events_calendar_get","parameters":[{"name":"first","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Первый день окна; по умолчанию сегодня","title":"First"},"description":"Первый день окна; по умолчанию сегодня"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":60,"title":"Days"}},{"name":"day","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"День афиши **в поясе площадки** (правило №16). Без него — весь промежуток","title":"Day"},"description":"День афиши **в поясе площадки** (правило №16). Без него — весь промежуток"},{"name":"day_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Начало промежутка дней","title":"Day From"},"description":"Начало промежутка дней"},{"name":"day_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Конец промежутка дней","title":"Day To"},"description":"Конец промежутка дней"},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Коды категорий; подходит любая из перечисленных","title":"Category"},"description":"Коды категорий; подходит любая из перечисленных"},{"name":"entry","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"free / paid / any","title":"Entry"},"description":"free / paid / any"},{"name":"time","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"morning / day / evening / any","title":"Time"},"description":"morning / day / evening / any"},{"name":"audience","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"family / adults / any","title":"Audience"},"description":"family / adults / any"},{"name":"crowd","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"intimate / small / medium / large; подходит любая","title":"Crowd"},"description":"intimate / small / medium / large; подходит любая"},{"name":"event_lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Язык события: ru / en / th / zh-Hans / multi (разноязычное) / any","title":"Event Lang"},"description":"Язык события: ru / en / th / zh-Hans / multi (разноязычное) / any"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Текст запроса. Ищет по названию, описанию, площадке и **месту** события, на всех языках и по словам","title":"Q"},"description":"Текст запроса. Ищет по названию, описанию, площадке и **месту** события, на всех языках и по словам"},{"name":"bbox","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"minLon,minLat,maxLon,maxLat","title":"Bbox"},"description":"minLon,minLat,maxLon,maxLat"},{"name":"near","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"lat,lon","title":"Near"},"description":"lat,lon"},{"name":"radius_m","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":200000,"minimum":100},{"type":"null"}],"title":"Radius M"}},{"name":"timezone","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Пояс, в котором считается «сегодня». По умолчанию — Asia/Bangkok","title":"Timezone"},"description":"Пояс, в котором считается «сегодня». По умолчанию — Asia/Bangkok"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":1},{"type":"null"}],"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalendarResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/events/upcoming":{"get":{"tags":["События"],"summary":"Ближайшие события — по одному на событие, а не по дням","description":"Для витрин, которые показывают афишу не целиком: ряд на главной, блок в\nписьме, экран приложения. Лента им не годится — её единица день, и\nежедневный ночной рынок занял бы весь ряд своими датами: в ближайших\nпятидесяти днях его двадцать два.\n\nКарточка та же, что в ленте, и несёт свой ближайший подходящий день.\nВитрине хватает первой страницы; лента «Событий» без выбранного дня\n(Р-465) листает дальше по `next_cursor` — порядок тот же, что у ленты\nпо дням: день, время начала, событие.\n\nСмотрит на **окно в ближайшие 30 дней** (`days`). «Ближайшие события» —\nэто то, что происходит на днях; событие через полгода в такой ряд не\nпросится, даже если оно единственное. Окно заодно режет цену запроса: без\nнего отбор читал бы все дни всех событий до горизонта раскрытия\nрасписаний, а это сто восемьдесят дней на каждое.\n\nОбъявлен **до** `/{slug}`: маршрут с параметром, стоящий раньше, принял бы\nслово `upcoming` за адрес события.","operationId":"upcoming_v1_events_upcoming_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":1},{"type":"null"}],"title":"Limit"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"description":"Окно поиска в днях от сегодня. Не действует, если задан день или конец промежутка","default":30,"title":"Days"},"description":"Окно поиска в днях от сегодня. Не действует, если задан день или конец промежутка"},{"name":"with_total","in":"query","required":false,"schema":{"type":"boolean","description":"Добавить `total` — сколько всего **событий** подходит в окне","default":false,"title":"With Total"},"description":"Добавить `total` — сколько всего **событий** подходит в окне"},{"name":"day","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"День афиши **в поясе площадки** (правило №16). Без него — весь промежуток","title":"Day"},"description":"День афиши **в поясе площадки** (правило №16). Без него — весь промежуток"},{"name":"day_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Начало промежутка дней","title":"Day From"},"description":"Начало промежутка дней"},{"name":"day_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Конец промежутка дней","title":"Day To"},"description":"Конец промежутка дней"},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Коды категорий; подходит любая из перечисленных","title":"Category"},"description":"Коды категорий; подходит любая из перечисленных"},{"name":"entry","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"free / paid / any","title":"Entry"},"description":"free / paid / any"},{"name":"time","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"morning / day / evening / any","title":"Time"},"description":"morning / day / evening / any"},{"name":"audience","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"family / adults / any","title":"Audience"},"description":"family / adults / any"},{"name":"crowd","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"intimate / small / medium / large; подходит любая","title":"Crowd"},"description":"intimate / small / medium / large; подходит любая"},{"name":"event_lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Язык события: ru / en / th / zh-Hans / multi (разноязычное) / any","title":"Event Lang"},"description":"Язык события: ru / en / th / zh-Hans / multi (разноязычное) / any"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Текст запроса. Ищет по названию, описанию, площадке и **месту** события, на всех языках и по словам","title":"Q"},"description":"Текст запроса. Ищет по названию, описанию, площадке и **месту** события, на всех языках и по словам"},{"name":"bbox","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"minLon,minLat,maxLon,maxLat","title":"Bbox"},"description":"minLon,minLat,maxLon,maxLat"},{"name":"near","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"lat,lon","title":"Near"},"description":"lat,lon"},{"name":"radius_m","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":200000,"minimum":100},{"type":"null"}],"title":"Radius M"}},{"name":"timezone","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Пояс, в котором считается «сегодня». По умолчанию — Asia/Bangkok","title":"Timezone"},"description":"Пояс, в котором считается «сегодня». По умолчанию — Asia/Bangkok"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpcomingResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/events/map":{"get":{"tags":["События"],"summary":"Метки и кружки карты по тем же фильтрам, что и лента","description":"**Событие приходит один раз** — своим ближайшим подходящим днём, а не\nкаждым. Лента идёт по дням, и еженедельная вечеринка стоит в ней\nпятнадцатью карточками; на карте те пятнадцать легли бы в одну точку\nстопкой, и человек видел бы одну метку, под которой спрятаны четырнадцать\nтаких же.\n\n**Прошлые дни и прошедшие часы в карту не идут.** Без заданного дня\nотсчёт начинается с сегодняшнего по поясу площадок, и из сегодняшнего\nвыпадает уже закончившееся (находка №171): карта отвечает на вопрос\n«куда пойти», а не «что тут было». Метка события при этом не пропадает —\nоно приходит своим следующим днём.\n\nСобытие без точки на карту не попадает вовсе — площадку могли записать\nодним адресом, и ставить её в случайное место значило бы соврать о том,\nкуда идти.\n\nОбъявлен **до** `/{slug}`: маршрут с параметром, стоящий раньше, принял бы\nслово `map` за адрес события.","operationId":"map_view_v1_events_map_get","parameters":[{"name":"zoom","in":"query","required":true,"schema":{"type":"integer","maximum":20,"minimum":0,"description":"Зум карты: до 12 — кружки, дальше метки","title":"Zoom"},"description":"Зум карты: до 12 — кружки, дальше метки"},{"name":"day","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"День афиши **в поясе площадки** (правило №16). Без него — весь промежуток","title":"Day"},"description":"День афиши **в поясе площадки** (правило №16). Без него — весь промежуток"},{"name":"day_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Начало промежутка дней","title":"Day From"},"description":"Начало промежутка дней"},{"name":"day_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Конец промежутка дней","title":"Day To"},"description":"Конец промежутка дней"},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Коды категорий; подходит любая из перечисленных","title":"Category"},"description":"Коды категорий; подходит любая из перечисленных"},{"name":"entry","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"free / paid / any","title":"Entry"},"description":"free / paid / any"},{"name":"time","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"morning / day / evening / any","title":"Time"},"description":"morning / day / evening / any"},{"name":"audience","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"family / adults / any","title":"Audience"},"description":"family / adults / any"},{"name":"crowd","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"intimate / small / medium / large; подходит любая","title":"Crowd"},"description":"intimate / small / medium / large; подходит любая"},{"name":"event_lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Язык события: ru / en / th / zh-Hans / multi (разноязычное) / any","title":"Event Lang"},"description":"Язык события: ru / en / th / zh-Hans / multi (разноязычное) / any"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Текст запроса. Ищет по названию, описанию, площадке и **месту** события, на всех языках и по словам","title":"Q"},"description":"Текст запроса. Ищет по названию, описанию, площадке и **месту** события, на всех языках и по словам"},{"name":"bbox","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"minLon,minLat,maxLon,maxLat","title":"Bbox"},"description":"minLon,minLat,maxLon,maxLat"},{"name":"near","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"lat,lon","title":"Near"},"description":"lat,lon"},{"name":"radius_m","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":200000,"minimum":100},{"type":"null"}],"title":"Radius M"}},{"name":"timezone","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Пояс, в котором считается «сегодня». По умолчанию — Asia/Bangkok","title":"Timezone"},"description":"Пояс, в котором считается «сегодня». По умолчанию — Asia/Bangkok"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":1},{"type":"null"}],"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__events__MapResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/events":{"get":{"tags":["События"],"summary":"Лента раздела: карточки событий выбранного дня, курсорная пагинация","description":"Единица ленты — **день события**, а не само событие: еженедельная\nвечеринка попадает в ленту каждого своего вторника. Порядок внутри дня —\nпо времени начала; события «весь день» идут последними.\n\nБез заданного дня лента начинается с **сегодняшнего** по поясу площадок:\nпрошедшие дни остаются в базе, но афише отвечать нечем — туда уже не\nсходить. По той же причине из сегодняшнего дня выпадает **то, что уже\nзакончилось** (находка №171): концерт, доигравший в 14:00, не ответ на\nвопрос «куда пойти» в 19:00. Полоска календаря считает с той же отсечкой\n— иначе она обещала бы над лентой больше, чем лента показывает.\n\nСпросили конкретный день — отвечаем на его вопрос целиком, включая уже\nпрошедшее: «что было сегодня» тоже законный вопрос.\n\nТексты приходят на языке запроса, у переведённых стоит пометка (Р-063).","operationId":"feed_v1_events_get","parameters":[{"name":"with_total","in":"query","required":false,"schema":{"type":"boolean","description":"Добавить `total` — число подходящих **событий**","default":false,"title":"With Total"},"description":"Добавить `total` — число подходящих **событий**"},{"name":"day","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"День афиши **в поясе площадки** (правило №16). Без него — весь промежуток","title":"Day"},"description":"День афиши **в поясе площадки** (правило №16). Без него — весь промежуток"},{"name":"day_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Начало промежутка дней","title":"Day From"},"description":"Начало промежутка дней"},{"name":"day_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Конец промежутка дней","title":"Day To"},"description":"Конец промежутка дней"},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Коды категорий; подходит любая из перечисленных","title":"Category"},"description":"Коды категорий; подходит любая из перечисленных"},{"name":"entry","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"free / paid / any","title":"Entry"},"description":"free / paid / any"},{"name":"time","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"morning / day / evening / any","title":"Time"},"description":"morning / day / evening / any"},{"name":"audience","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"family / adults / any","title":"Audience"},"description":"family / adults / any"},{"name":"crowd","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"intimate / small / medium / large; подходит любая","title":"Crowd"},"description":"intimate / small / medium / large; подходит любая"},{"name":"event_lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Язык события: ru / en / th / zh-Hans / multi (разноязычное) / any","title":"Event Lang"},"description":"Язык события: ru / en / th / zh-Hans / multi (разноязычное) / any"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Текст запроса. Ищет по названию, описанию, площадке и **месту** события, на всех языках и по словам","title":"Q"},"description":"Текст запроса. Ищет по названию, описанию, площадке и **месту** события, на всех языках и по словам"},{"name":"bbox","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"minLon,minLat,maxLon,maxLat","title":"Bbox"},"description":"minLon,minLat,maxLon,maxLat"},{"name":"near","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"lat,lon","title":"Near"},"description":"lat,lon"},{"name":"radius_m","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":200000,"minimum":100},{"type":"null"}],"title":"Radius M"}},{"name":"timezone","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Пояс, в котором считается «сегодня». По умолчанию — Asia/Bangkok","title":"Timezone"},"description":"Пояс, в котором считается «сегодня». По умолчанию — Asia/Bangkok"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":1},{"type":"null"}],"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__events__FeedResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/events/{slug}":{"get":{"tags":["События"],"summary":"Страница события по адресу","description":"Черновик и снятое событие отдают `404`, а не «скрыто»: ответ «есть, но не\nпокажу» рассказывает о том, чего гостю знать не нужно.\n\nЧасы приходят вместе с `timezone_notice` — поясом площадки и пояснением о\nразнице с поясом гостя (правило №16). Показать «с 20:00» без пояса — та же\nошибка, что показать цену без валюты.","operationId":"event_v1_events__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/listings/{listing_id}/availability":{"get":{"tags":["Объекты"],"summary":"Календарь объекта: свободные даты, цена дня, минимальный срок","operationId":"availability_v1_listings__listing_id__availability_get","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Listing Id"}},{"name":"from","in":"query","required":true,"schema":{"type":"string","format":"date","title":"From"}},{"name":"to","in":"query","required":true,"schema":{"type":"string","format":"date","title":"To"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailabilityResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/listings/{listing_id}/slots":{"get":{"tags":["Объекты"],"summary":"Свободные выходы впечатления или окна услуги","operationId":"slots_v1_listings__listing_id__slots_get","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Listing Id"}},{"name":"from","in":"query","required":true,"schema":{"type":"string","format":"date","title":"From"}},{"name":"to","in":"query","required":true,"schema":{"type":"string","format":"date","title":"To"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlotsResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/listings/{listing_id}/quote":{"post":{"tags":["Объекты"],"summary":"Расчёт стоимости построчно","description":"Даты заняты — приходит `available: false` и `conflict_dates`, а не пустой\nответ: гость должен видеть, какие именно даты мешают, и подвинуть их.","operationId":"quote_v1_listings__listing_id__quote_post","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Listing Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteRequest"}}}},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/listings/{key}":{"get":{"tags":["Объекты"],"summary":"Полная карточка объекта — по адресу или идентификатору","description":"Вход не нужен: выбирать можно без регистрации (Р-013). Вошедшему\nдополнительно видно, лежит ли объект у него в избранном.\n\nМаршрут объявлен **после** `/{listing_id}/availability` и соседей: иначе\nон перехватил бы их пути, приняв «availability» за адрес объекта.","operationId":"listing_card_v1_listings__key__get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Listing Card V1 Listings  Key  Get"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{},{"bearerAuth":[]}]}},"/v1/listings/{key}/similar":{"get":{"tags":["Объекты"],"summary":"Похожие рядом — тот же тип в том же месте","operationId":"listing_similar_v1_listings__key__similar_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Listing Similar V1 Listings  Key  Similar Get"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/bookings":{"post":{"tags":["Бронирования"],"summary":"Создаёт бронь. Мгновенная сразу подтверждена, по запросу — pending","operationId":"create_booking_v1_bookings_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingCreate"}}}},"responses":{"201":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingDetail"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]},"get":{"tags":["Бронирования"],"summary":"Мои поездки, новые сверху","description":"`scope` отбирает по ходу поездки. Без него список остаётся прежним — всё\nподряд: это умолчание держит старых клиентов, которые про `scope` не\nзнают. Порядок от `scope` не зависит, см. `booking_service.page`.","operationId":"my_bookings_v1_bookings_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/BookingStatus"},{"type":"null"}],"title":"Status"}},{"name":"scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(upcoming|completed|cancelled|past|all)$"},{"type":"null"}],"description":"Вкладки S63: upcoming — живые и не закончившиеся, completed — завершённые (в том числе неявка), cancelled — отменённые, отклонённые и просроченные; past — completed и cancelled вместе; all — всё (умолчание)","title":"Scope"},"description":"Вкладки S63: upcoming — живые и не закончившиеся, completed — завершённые (в том числе неявка), cancelled — отменённые, отклонённые и просроченные; past — completed и cancelled вместе; all — всё (умолчание)"},{"name":"with_counts","in":"query","required":false,"schema":{"type":"boolean","description":"Добавить `counts` — числа на трёх вкладках","default":false,"title":"With Counts"},"description":"Добавить `counts` — числа на трёх вкладках"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":1},{"type":"null"}],"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingPage"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/bookings/{booking_id}":{"get":{"tags":["Бронирования"],"summary":"Карточка брони. Адрес открывается только по подтверждённой","operationId":"booking_card_v1_bookings__booking_id__get","parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Booking Id"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingDetail"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/bookings/{booking_id}/refund-preview":{"get":{"tags":["Бронирования"],"summary":"Сколько вернётся, если отменить прямо сейчас","description":"Отдельным эндпоинтом, а не текстом в карточке: сумма зависит от момента,\nи гость должен видеть её **до** нажатия, а не узнавать после.","operationId":"refund_preview_v1_bookings__booking_id__refund_preview_get","parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Booking Id"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefundBody"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/bookings/{booking_id}/cancel":{"post":{"tags":["Бронирования"],"summary":"Отмена гостем. В ответе — сумма возврата","operationId":"cancel_booking_v1_bookings__booking_id__cancel_post","parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Booking Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelRequest"}}}},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefundBody"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/bookings/{booking_id}/guests":{"get":{"tags":["Бронирования"],"summary":"Кто едет: список проживающих (Р-197)","description":"Приходит **заполненным наполовину**: первая строка — сам заказчик, из его\nпрофиля, остальные пустые по числу людей в брони. Заставлять человека\nпереписывать в форму собственные имя и возраст, которые сервис и так\nзнает, — верный способ получить незаполненную форму.","operationId":"read_guests_v1_bookings__booking_id__guests_get","parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Booking Id"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StayGuestBody"},"title":"Response Read Guests V1 Bookings  Booking Id  Guests Get"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]},"put":{"tags":["Бронирования"],"summary":"Переписывает список участников целиком — и телефон для связи (Р-352)","description":"Пустые строки не сохраняются. У объекта с `guest_details = required`\nданные всех участников обязательны и стереть их правкой нельзя —\n`400 guest_details_required`. `contact_phone` не передан — не меняется,\nпустой — `400 phone_required`.\n\n**Правится только до оплаты** (Р-352): оплатой человек подтвердил, кого и\nкак везут, и партнёр по этим данным оформляет страховку. Оплаченная или\nзакрытая бронь отвечает `409 guests_locked`.","operationId":"write_guests_v1_bookings__booking_id__guests_put","parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Booking Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StayGuestsRequest"}}}},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StayGuestBody"},"title":"Response Write Guests V1 Bookings  Booking Id  Guests Put"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/bookings/{booking_id}/qr":{"get":{"tags":["Бронирования"],"summary":"Билет заселения (Р-066)","description":"Клиент рисует QR из строки сам: картинка с сервера не нужна и лишний раз\nсветит бронь в кешах. Рядом с кодом печатается номер брони — им заселяют,\nкогда камера не справилась.","operationId":"booking_ticket_v1_bookings__booking_id__qr_get","parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Booking Id"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/rentals":{"get":{"tags":["Долгосрочная аренда"],"summary":"Мои долгосрочные заявки","operationId":"read_rentals_v1_rentals_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RentalPage"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/rentals/{booking_id}":{"get":{"tags":["Долгосрочная аренда"],"summary":"Состояние сделки: что уже сделано, чей сейчас ход и все её чеки","operationId":"read_rental_v1_rentals__booking_id__get","parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Booking Id"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RentalDetail"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/rentals/{booking_id}/document":{"get":{"tags":["Долгосрочная аренда"],"summary":"Договор потоком. Прямой ссылки на приватный файл не существует","operationId":"download_document_v1_rentals__booking_id__document_get","parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Booking Id"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/rentals/{booking_id}/sign":{"post":{"tags":["Долгосрочная аренда"],"summary":"Согласие с договором — и конец пути (Р-194)","description":"Подписывает **гость**: партнёр расписался тем, что приложил договор и\nзакрепил за ним номер с датами. С этой подписью договор заключён,\nизменению не подлежит, а его дни становятся занятыми.\n\nПосле срока (семь дней от приложения) — `409 sign_expired`: подпись\nбольше не принимается, и партнёр решает, прислать договор заново или\nотменить сделку.","operationId":"sign_v1_rentals__booking_id__sign_post","parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Booking Id"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RentalBody"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/rentals/{booking_id}/cancel":{"post":{"tags":["Долгосрочная аренда"],"summary":"Отказ от сделки — до подписи (Р-194)","description":"После подписи договор заключён между сторонами, и расторгают его они\nсами: сервис не сторона этой бумаги. Такой вызов — `409 already_signed`.","operationId":"cancel_v1_rentals__booking_id__cancel_post","parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Booking Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RentalCancel"}}}},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RentalBody"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/dialogs":{"get":{"tags":["Чат"],"summary":"Мои диалоги, свежие сверху; с q — только те, где нашлось","operationId":"list_dialogs_v1_dialogs_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2,"maxLength":100},{"type":"null"}],"description":"Поиск (нехватка №39): имя хозяина, название объекта, номер брони, тема обращения, текст сообщений — оригинал и перевод на языке запроса. Скрытые контакты не ищутся","title":"Q"},"description":"Поиск (нехватка №39): имя хозяина, название объекта, номер брони, тема обращения, текст сообщений — оригинал и перевод на языке запроса. Скрытые контакты не ищутся"}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DialogList"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]},"post":{"tags":["Чат"],"summary":"Открывает переписку с бизнесом — по бизнесу, объекту или брони","description":"Переписка **одна на пару «гость — бизнес»** (Р-484): со страницы\nбизнеса, с объявления и из брони открывается одна и та же, объект к ней\nне прикрепляется — о нём пишут ссылкой. Ответ — переписка целиком, как в\nсписке.","operationId":"open_dialog_v1_dialogs_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DialogOpen"}}}},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DialogBody"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/dialogs/support":{"post":{"tags":["Чат"],"summary":"Обращение в поддержку. Открытое обращение у человека одно","operationId":"open_support_v1_dialogs_support_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportOpen"}}},"required":true},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DialogBody"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/dialogs/{dialog_id}/messages":{"get":{"tags":["Чат"],"summary":"Лента сообщений, новые снизу","description":"`before_id` листает историю вверх, `after_id` добирает пропущенное вперёд:\nклиент, у которого не открылся сокет, спрашивает «что было после этого\nномера», а не «последние тридцать».\n\n`with_deleted` — по запросу, а не всегда: ленту читают и клиенты, которые\nзаглушку рисовать не умеют (лента заказа, выпущенные приложения), — у них\nудалённое вышло бы пустым пузырём.","operationId":"history_v1_dialogs__dialog_id__messages_get","parameters":[{"name":"dialog_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Dialog Id"}},{"name":"before_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"История вверх: «дай N до этого id»","title":"Before Id"},"description":"История вверх: «дай N до этого id»"},{"name":"after_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Добор вперёд: «дай всё после этого id»","title":"After Id"},"description":"Добор вперёд: «дай всё после этого id»"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Limit"}},{"name":"with_deleted","in":"query","required":false,"schema":{"type":"boolean","description":"Вместе с удалёнными — заглушкой `deleted: true` без текста и файла (нехватка №57); без флага их нет, как раньше","default":false,"title":"With Deleted"},"description":"Вместе с удалёнными — заглушкой `deleted: true` без текста и файла (нехватка №57); без флага их нет, как раньше"}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessagePage"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]},"post":{"tags":["Чат"],"summary":"Отправляет сообщение","description":"Перевод для собеседника ставится **после ответа** (Р-064): это сетевой\nвызов к модели, и держать на нём отправителя незачем. Оригинал уйдёт\nсразу, перевод догонит событием `message.translated`.","operationId":"send_message_v1_dialogs__dialog_id__messages_post","parameters":[{"name":"dialog_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Dialog Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageSend"}}}},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageBody"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/dialogs/{dialog_id}/files":{"post":{"tags":["Чат"],"summary":"Пакет документов: до десяти файлов и двадцать мегабайт суммарно (Р-205)","description":"Каждый файл сначала загружается обычным `POST /v1/uploads`, а сюда\nприходят их идентификаторы. Отправка одна: для человека это одно действие,\nи в переписке оно должно выглядеть одним событием.\n\nЛимит скорости — тот же, что у сообщений: пакет считается одной отправкой,\nиначе десять файлов упирались бы в секундный потолок на середине.","operationId":"send_files_v1_dialogs__dialog_id__files_post","parameters":[{"name":"dialog_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Dialog Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FilesSend"}}}},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MessageBody"},"title":"Response Send Files V1 Dialogs  Dialog Id  Files Post"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/dialogs/{dialog_id}/messages/{message_id}":{"delete":{"tags":["Чат"],"summary":"Убирает СВОЁ сообщение из переписки","description":"Человек написал не то и хочет это убрать — обычное дело, и запрещать\nнезачем. Из базы сообщение при этом не пропадает (правило №6): спор о\nброне разбирается через месяцы, и «гость удалил сообщение» не должно\nозначать «доказательств нет».\n\nСистемную запись — подтверждение брони, оплату — удалить нельзя: по ней\nобе стороны восстанавливают, что происходило и когда.","operationId":"delete_message_v1_dialogs__dialog_id__messages__message_id__delete","parameters":[{"name":"dialog_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Dialog Id"}},{"name":"message_id","in":"path","required":true,"schema":{"type":"integer","title":"Message Id"}}],"responses":{"204":{"description":"Успешный ответ"},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/dialogs/{dialog_id}/read":{"post":{"tags":["Чат"],"summary":"Помечает прочитанным до указанного сообщения включительно","operationId":"mark_read_v1_dialogs__dialog_id__read_post","parameters":[{"name":"dialog_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Dialog Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__chat__ReadRequest"}}}},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mark Read V1 Dialogs  Dialog Id  Read Post"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/uploads":{"post":{"tags":["Чат"],"summary":"Загружает вложение до отправки сообщения","description":"Файлы в WebSocket не летят вовсе: разрыв связи посреди отправки терял бы\nи файл, и сообщение сразу.","operationId":"upload_v1_uploads_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_v1_uploads_post"}}},"required":true},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/messages/{message_id}/file":{"get":{"tags":["Чат"],"summary":"Приватное вложение диалога: голосовое или документ","description":"Отдаётся **потоком после проверки прав**, а не ссылкой: файл лежит в\nприватном бакете, и ссылка из истории браузера без действующей сессии\nучастника ничего не откроет (правило №7).","operationId":"attachment_v1_messages__message_id__file_get","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"integer","title":"Message Id"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/notifications":{"get":{"tags":["Уведомления"],"summary":"Лента: ключи и параметры, тексты собирает клиент (docs/api.md §3)","description":"Название объекта в параметрах — уже на языке запроса (находка №85).","operationId":"feed_v1_notifications_get","parameters":[{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":1},{"type":"null"}],"title":"Limit"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationPage"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/notifications/read":{"post":{"tags":["Уведомления"],"summary":"Отметить уведомления прочитанными — до up_to_id включительно или все","description":"Ответ — `{\"read\": сколько отмечено, \"unread\": сколько осталось}`: число у\nколокольчика (`/v1/me/badges`) клиент берёт отсюда, без второго запроса.","operationId":"mark_read_v1_notifications_read_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__notifications__ReadRequest"}}},"required":true},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Mark Read V1 Notifications Read Post"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/devices":{"get":{"tags":["Уведомления"],"summary":"Устройства, куда сейчас уходят пуши: с действующей сессией (Р-424)","operationId":"list_devices_v1_devices_get","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/DeviceBody"},"type":"array","title":"Response List Devices V1 Devices Get"}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]},"post":{"tags":["Уведомления"],"summary":"Регистрация пуш-токена. Повторный запуск приложения — обновление","description":"Устройство записывается **вместе с сессией** (Р-424): пуш уходит, пока\nсессия жива. Вышел человек или вошёл заново — клиент присылает токен ещё\nраз, и устройство переезжает на новую сессию. Платформы — `web`,\n`android`, `ios`.","operationId":"register_device_v1_devices_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceRegister"}}},"required":true},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceBody"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/devices/forget":{"post":{"tags":["Уведомления"],"summary":"Выключить пуши на этом устройстве — по его токену (Р-424)","description":"Браузер знает свой токен, но не идентификатор строки. Чужой или\nнезнакомый токен — тот же `204`: устройство и так молчит.","operationId":"forget_this_device_v1_devices_forget_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceForget"}}},"required":true},"responses":{"204":{"description":"Успешный ответ"},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/devices/{device_id}":{"delete":{"tags":["Уведомления"],"summary":"Забыть своё устройство: пуши на него больше не уходят (Р-424)","operationId":"forget_device_v1_devices__device_id__delete","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Device Id"}}],"responses":{"204":{"description":"Успешный ответ"},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/unsubscribe":{"get":{"tags":["Уведомления"],"summary":"Отписка по подписанной ссылке, без входа: выключает все уведомления роли (Р-404)","description":"Ссылка одна на все четыре роли — гостя, партнёра, модератора и админа:\nроль и человек лежат в токене.","operationId":"unsubscribe_v1_unsubscribe_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","minLength":16,"title":"Token"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnsubscribeResult"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/listings/{listing_id}/reviews":{"get":{"tags":["Отзывы"],"summary":"Отзывы объекта и средние по критериям","description":"Порядок, отбор по оценке и поиск нужны отдельной странице отзывов\n(Р-225): на карточке объекта тем же эндпоинтом берутся три лучших.\nСредние по критериям и счётчик отбор **не меняет** — они по всему объекту.","operationId":"listing_reviews_v1_listings__listing_id__reviews_get","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Listing Id"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":1},{"type":"null"}],"title":"Limit"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","description":"Порядок: recent — свежие, best — лучшие, worst — худшие","default":"recent","title":"Sort"},"description":"Порядок: recent — свежие, best — лучшие, worst — худшие"},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"description":"Только с этой оценкой","title":"Rating"},"description":"Только с этой оценкой"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"description":"Поиск по тексту отзыва","title":"Q"},"description":"Поиск по тексту отзыва"}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListingReviews"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/reviews/pending":{"get":{"tags":["Отзывы"],"summary":"По каким поездкам можно оставить отзыв и до какого момента","operationId":"pending_v1_reviews_pending_get","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PendingBooking"},"type":"array","title":"Response Pending V1 Reviews Pending Get"}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/reviews":{"post":{"tags":["Отзывы"],"summary":"Отзыв об объекте по завершённой поездке","description":"Ответ отдаётся автору, поэтому в нём виден и ещё не раскрытый отзыв: свой\nтекст человек имеет право увидеть сразу.","operationId":"create_review_v1_reviews_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewCreate"}}},"required":true},"responses":{"201":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewBody"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/reviews/{review_id}":{"patch":{"tags":["Отзывы"],"summary":"Правит свой отзыв — пока он не опубликован","description":"После публикации правка запрещена, и это не придирка. Раскрытие слепое:\nобе стороны пишут не глядя друг на друга, партнёр отвечает на конкретный\nтекст. Разрешить менять текст после ответа — значит позволить поменять\nвопрос, на который уже ответили.","operationId":"update_review_v1_reviews__review_id__patch","parameters":[{"name":"review_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Review Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewUpdate"}}}},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewBody"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]},"delete":{"tags":["Отзывы"],"summary":"Автор забирает свой отзыв обратно","description":"Разрешено и после публикации: промолчать человек вправе всегда, а вот\nпереписать сказанное задним числом — нет. Удаление мягкое (правило №6):\nстрока и текст остаются, из показа и из рейтинга отзыв уходит.","operationId":"delete_review_v1_reviews__review_id__delete","parameters":[{"name":"review_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Review Id"}}],"responses":{"204":{"description":"Успешный ответ"},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/reviews/my":{"get":{"tags":["Отзывы"],"summary":"Мои отзывы и опубликованные отзывы обо мне","operationId":"my_reviews_v1_reviews_my_get","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MyReviews"}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/report-reasons":{"get":{"tags":["Жалобы"],"summary":"Причины для вида цели — в порядке формы, «другое» последним","operationId":"report_reasons_v1_report_reasons_get","parameters":[{"name":"target_kind","in":"query","required":false,"schema":{"enum":["listing","partner","review"],"type":"string","default":"listing","title":"Target Kind"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReportReason"},"title":"Response Report Reasons V1 Report Reasons Get"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/reports":{"post":{"tags":["Жалобы"],"summary":"Жалоба на объект, бизнес или отзыв. Повтор до разбора — счётчик, а не новая","operationId":"create_report_v1_reports_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportCreate"}}},"required":true},"responses":{"201":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportAccepted"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/partners/{partner_id}":{"get":{"tags":["Бизнес"],"summary":"Карточка бизнеса и его объекты одним ответом","description":"Одним, потому что страница без объектов — это пустая страница: два\nзапроса означали бы, что человек сначала видит название компании, а через\nмгновение под ним появляются виллы и всё подпрыгивает.","operationId":"partner_page_v1_partners__partner_id__get","parameters":[{"name":"partner_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Partner Id"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerPage"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{},{"bearerAuth":[]}]}},"/v1/partners/{partner_id}/reviews":{"get":{"tags":["Бизнес"],"summary":"Отзывы по всем объектам бизнеса, свежие сверху","description":"Одной лентой, а не по объектам: человек хочет понять, как эта компания\nработает вообще, а не листать отзывы двадцати вилл по очереди.","operationId":"partner_reviews_v1_partners__partner_id__reviews_get","parameters":[{"name":"partner_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Partner Id"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerReviews"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/bookings/{booking_id}/payment":{"post":{"tags":["Оплата"],"summary":"Начинает оплату и возвращает адрес страницы банка","description":"Платить можно только подтверждённую бронь: пока партнёр не ответил, он\nещё может отказать, и деньги пришлось бы возвращать.","operationId":"start_payment_v1_bookings__booking_id__payment_post","parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Booking Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentStart"}}}},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentStarted"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/payments/confirm":{"get":{"tags":["Оплата"],"summary":"Проверяет платёж после возврата из банка","description":"Номер платежа приходит из адреса, а состояние — из запроса к провайдеру:\nадрес человек правит руками, и «оплачено» в нём не значит ничего.","operationId":"confirm_payment_v1_payments_confirm_get","parameters":[{"name":"payment_id","in":"query","required":true,"schema":{"type":"string","minLength":8,"maxLength":128,"title":"Payment Id"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentResult"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/ego/v1/health":{"get":{"tags":["Витрина в EGO"],"summary":"Проверка здоровья модуля. EGO зовёт её раз в минуту","description":"Подписи не требует намеренно: по этому ответу в разделе «Модули» рисуется\n«онлайн», и он обязан зависеть от сервиса, а не от ключа.","operationId":"health_ego_v1_health_get","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Health Ego V1 Health Get"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/ego/v1/search_listings":{"post":{"tags":["Витрина в EGO"],"summary":"Поиск объектов одной из пяти категорий по фильтрам","operationId":"search_listings_ego_v1_search_listings_post","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Search Listings Ego V1 Search Listings Post"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/ego/v1/listing_details":{"post":{"tags":["Витрина в EGO"],"summary":"Карточка объекта по адресу или идентификатору из выдачи","operationId":"listing_details_ego_v1_listing_details_post","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Listing Details Ego V1 Listing Details Post"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/ego/v1/search_events":{"post":{"tags":["Витрина в EGO"],"summary":"Афиша города по фильтрам: день, категория, вход, время, язык","operationId":"search_events_ego_v1_search_events_post","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Search Events Ego V1 Search Events Post"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/ego/v1/upcoming_events":{"post":{"tags":["Витрина в EGO"],"summary":"Ближайшие события подборкой — по одному на событие","operationId":"upcoming_events_ego_v1_upcoming_events_post","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Upcoming Events Ego V1 Upcoming Events Post"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/ego/v1/event_details":{"post":{"tags":["Витрина в EGO"],"summary":"Страница события по адресу из выдачи","operationId":"event_details_ego_v1_event_details_post","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Event Details Ego V1 Event Details Post"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/ego/v1/account/status":{"post":{"tags":["Витрина в EGO: аккаунт и брони"],"summary":"Вошёл ли человек в Bounty, а если нет — есть ли аккаунт на его почту","operationId":"account_status_ego_v1_account_status_post","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Account Status Ego V1 Account Status Post"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/ego/v1/account/connect":{"post":{"tags":["Витрина в EGO: аккаунт и брони"],"summary":"Войти в аккаунт на почту из EGO или завести его одним действием","operationId":"account_connect_ego_v1_account_connect_post","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Account Connect Ego V1 Account Connect Post"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/ego/v1/account/profile":{"post":{"tags":["Витрина в EGO: аккаунт и брони"],"summary":"Кто человек в Bounty и сколько у него броней впереди","operationId":"account_profile_ego_v1_account_profile_post","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Account Profile Ego V1 Account Profile Post"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/ego/v1/account/logout":{"post":{"tags":["Витрина в EGO: аккаунт и брони"],"summary":"Выйти: ключ EGO гасится, аккаунт остаётся","operationId":"account_logout_ego_v1_account_logout_post","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Account Logout Ego V1 Account Logout Post"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/ego/v1/listing/slots":{"post":{"tags":["Витрина в EGO: аккаунт и брони"],"summary":"Выходы объекта на день или на две недели вперёд","operationId":"listing_slots_ego_v1_listing_slots_post","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Listing Slots Ego V1 Listing Slots Post"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/ego/v1/booking/quote":{"post":{"tags":["Витрина в EGO: аккаунт и брони"],"summary":"Сколько будет стоить бронь и что спросят перед ней","operationId":"booking_quote_ego_v1_booking_quote_post","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Booking Quote Ego V1 Booking Quote Post"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/ego/v1/booking/create":{"post":{"tags":["Витрина в EGO: аккаунт и брони"],"summary":"Оформить бронь — тем же обработчиком, что POST /v1/bookings сайта","description":"Ключ идемпотентности — тот, что прислал EGO (`Idempotency-Key`): двойное\nнажатие и повтор из-за сети дают одну бронь.\n\nОтказ по делу (места разобрали, нет телефона, не хватает участников)\nприходит ответом `created: false` с причиной словами: окно EGO показывает\nчеловеку только текст ответа, а текст ошибки — нет. Попытка откатывается\nцеликом: бронь либо записана вся, либо её нет.","operationId":"booking_create_ego_v1_booking_create_post","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Booking Create Ego V1 Booking Create Post"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/ego/v1/bookings/mine":{"post":{"tags":["Витрина в EGO: аккаунт и брони"],"summary":"Свои брони, новые сверху: впереди, прошедшие или все","operationId":"bookings_mine_ego_v1_bookings_mine_post","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Bookings Mine Ego V1 Bookings Mine Post"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/ego/v1/bookings/details":{"post":{"tags":["Витрина в EGO: аккаунт и брони"],"summary":"Карточка своей брони: статус, чек, оплата, отмена, адрес, шаги","operationId":"bookings_details_ego_v1_bookings_details_post","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Bookings Details Ego V1 Bookings Details Post"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/ego/v1/bookings/pay":{"post":{"tags":["Витрина в EGO: аккаунт и брони"],"summary":"Ссылка «Оплатить» по своей брони — и сколько, и на каких условиях","operationId":"bookings_pay_ego_v1_bookings_pay_post","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Bookings Pay Ego V1 Bookings Pay Post"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/ego/v1/bookings/messages":{"post":{"tags":["Витрина в EGO: аккаунт и брони"],"summary":"Лента заказа: реплики человека и партнёра, новые снизу","description":"Открыл ленту в окне — прочитал: счётчик непрочитанного на сайте гаснет.","operationId":"bookings_messages_ego_v1_bookings_messages_post","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Bookings Messages Ego V1 Bookings Messages Post"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/ego/v1/bookings/message":{"post":{"tags":["Витрина в EGO: аккаунт и брони"],"summary":"Написать партнёру в ленту заказа — тем же обработчиком, что у сайта","operationId":"bookings_message_ego_v1_bookings_message_post","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Bookings Message Ego V1 Bookings Message Post"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/ego/v1/bookings/cancel_preview":{"post":{"tags":["Витрина в EGO: аккаунт и брони"],"summary":"Сколько вернётся, если отменить прямо сейчас, и по какому правилу","operationId":"bookings_cancel_preview_ego_v1_bookings_cancel_preview_post","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Bookings Cancel Preview Ego V1 Bookings Cancel Preview Post"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/ego/v1/bookings/cancel":{"post":{"tags":["Витрина в EGO: аккаунт и брони"],"summary":"Отменить свою бронь — тем же обработчиком, что у сайта","operationId":"bookings_cancel_ego_v1_bookings_cancel_post","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Bookings Cancel Ego V1 Bookings Cancel Post"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/favorite-lists":{"get":{"tags":["Избранное"],"summary":"Списки избранного вместе с числом объектов в каждом","operationId":"read_lists_v1_favorite_lists_get","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/FavoriteListResponse"},"type":"array","title":"Response Read Lists V1 Favorite Lists Get"}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]},"post":{"tags":["Избранное"],"summary":"Новый список: «Пхукет февраль», «Идеи на лето»","operationId":"create_list_v1_favorite_lists_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteListRequest"}}},"required":true},"responses":{"201":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteListResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/favorite-lists/{list_id}":{"patch":{"tags":["Избранное"],"summary":"Переименование списка","operationId":"rename_list_v1_favorite_lists__list_id__patch","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"List Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteListRequest"}}}},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteListResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]},"delete":{"tags":["Избранное"],"summary":"Удаление списка вместе с закладками в нём","description":"Список по умолчанию удалить нельзя: в него падает всё, что добавляют\nсердечком из ленты, и без него добавление некуда девать.","operationId":"delete_list_v1_favorite_lists__list_id__delete","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"List Id"}}],"responses":{"204":{"description":"Успешный ответ"},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/favorites":{"get":{"tags":["Избранное"],"summary":"Объекты избранного — теми же карточками, что и в ленте, плюс цена на момент добавления","operationId":"read_favorites_v1_favorites_get","parameters":[{"name":"list_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Только этот список","title":"List Id"},"description":"Только этот список"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":1},{"type":"null"}],"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoritesPage"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]},"post":{"tags":["Избранное"],"summary":"Положить объект в избранное","description":"Повторное добавление ошибкой не считается: двойной тап по сердечку — это\nдвойной тап, а не попытка обмануть сервис.","operationId":"add_favorite_v1_favorites_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteRequest"}}}},"responses":{"201":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/favorites/{listing_id}":{"delete":{"tags":["Избранное"],"summary":"Убрать объект из избранного — из всех своих списков сразу","operationId":"remove_favorite_v1_favorites__listing_id__delete","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Listing Id"}}],"responses":{"204":{"description":"Успешный ответ"},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/leads":{"post":{"tags":["Заявки на подбор"],"summary":"Оставить заявку: имя, способ связи и контакт, комментарий по желанию","operationId":"create_lead_v1_leads_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadRequest"}}},"required":true},"responses":{"201":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadResponse"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{},{"bearerAuth":[]}]}},"/v1/assistant":{"get":{"tags":["Bounty AI"],"summary":"Работает ли помощник, сколько сообщений осталось в окне и что можно прислать","operationId":"read_state_v1_assistant_get","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Read State V1 Assistant Get"}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/assistant/messages":{"get":{"tags":["Bounty AI"],"summary":"Лента от старых к новым. before — листать назад, after — новые","description":"Лента одна, тем нет (Р-431): `thread_id` у сообщений — наследство\nпрежних тем, клиенту разделять по нему нечего.","operationId":"read_messages_v1_assistant_messages_get","parameters":[{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Before"}},{"name":"after","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"After"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100,"minimum":1},{"type":"null"}],"title":"Limit"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Read Messages V1 Assistant Messages Get"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]},"post":{"tags":["Bounty AI"],"summary":"Сообщение помощнику. 202 — вопрос сохранён, ответ пишется в фоне","description":"В ответе — сообщение гостя, заготовка ответа (`status: pending`) и окно\nлимита. Готовый ответ приходит событием `assistant.message` по `/v1/ws`;\nбез сокета — `GET /v1/assistant/messages?after=…`. Повтор с тем же\n`Idempotency-Key` возвращает то же сообщение и не тратит лимит дважды.\n\nОшибки: `503 assistant_unavailable`; `429 assistant_limit`\n(`details.resets_at`); `409 assistant_busy`; `400 assistant_message_empty`\n/ `assistant_text_too_long` / `assistant_files_too_many` /\n`assistant_files_too_large_total`; `404 assistant_file_not_found`.","operationId":"send_v1_assistant_messages_post","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/SendRequest"}}}},"responses":{"202":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]},"delete":{"tags":["Bounty AI"],"summary":"«Очистить переписку»: прежнее скрыто у гостя, в базе остаётся (правило №6)","operationId":"clear_v1_assistant_messages_delete","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Clear V1 Assistant Messages Delete"}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/assistant/greeting":{"post":{"tags":["Bounty AI"],"summary":"Заход в помощника: приветствие, если оно положено (Р-489, assistant.md §11.7)","description":"Клиент зовёт при каждом открытии помощника — приложение при запуске, сайт\nна странице `/ai` — с точкой устройства, если доступ к геолокации уже\nдан (запрашивать разрешение ради приветствия не нужно). Первый заход за\nокно лимита (6 ч) — в ответе новое сообщение `kind: proactive`,\n`trigger: greeting` (блоки `greeting`, `events`, `suggestions`); оно же\nуходит событием `assistant.message` на остальные устройства. Иначе —\n`{\"message\": null}`. Лимит сообщений не тратится. Точка сохраняется как\n«последнее известное место» на 30 дней в любом случае.","operationId":"greeting_v1_assistant_greeting_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GreetingRequest"}}},"required":true},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Greeting V1 Assistant Greeting Post"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/assistant/messages/{message_id}":{"get":{"tags":["Bounty AI"],"summary":"Одно сообщение — проверить, готов ли ответ, без сокета","operationId":"read_message_v1_assistant_messages__message_id__get","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"integer","title":"Message Id"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Read Message V1 Assistant Messages  Message Id  Get"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/assistant/files":{"post":{"tags":["Bounty AI"],"summary":"Файл до сообщения: фото, документ (PDF, DOCX, XLSX, CSV, TXT) или голосовое","description":"Тип определяется по содержимому, а не по `kind`: `kind=voice` лишь говорит,\nчто это запись (ffmpeg приведёт её к mp3). Всё ложится в приватный бакет.\nОшибки: `assistant_file_type`, `assistant_file_too_large`,\n`assistant_pdf_too_long`, `assistant_voice_too_long`,\n`assistant_voice_unavailable`, `assistant_unavailable`.","operationId":"upload_v1_assistant_files_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_v1_assistant_files_post"}}},"required":true},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Upload V1 Assistant Files Post"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/assistant/files/{file_id}":{"get":{"tags":["Bounty AI"],"summary":"Файл потоком после проверки владельца (правило №7). Чужой — 404","operationId":"download_v1_assistant_files__file_id__get","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"File Id"}},{"name":"size","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"thumb — превью фото","title":"Size"},"description":"thumb — превью фото"}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/assistant/messages/{message_id}/retry":{"post":{"tags":["Bounty AI"],"summary":"«Спросить ещё раз»: неудачный ответ снова пишется. Тратит одно сообщение","operationId":"retry_v1_assistant_messages__message_id__retry_post","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"integer","title":"Message Id"}}],"responses":{"202":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/assistant/messages/{message_id}/stop":{"post":{"tags":["Bounty AI"],"summary":"«Остановить ответ» (Р-447): заготовка — в «Вы остановили ответ» (stopped)","description":"Клиенты кнопку больше не показывают (Р-461): пока помощник отвечает,\nотправить новое нельзя — ждут ответа. Эндпоинт оставлен для совместимости.\n\nСообщение возвращается в лимит — помощник не ответил. Ответ, который\nуже готов, не трогается и возвращается как есть. Задача, которая пишет\nответ, бросает работу на ближайшем шаге; следующий вопрос можно\nотправлять сразу. Повторить — `POST …/retry`.","operationId":"stop_v1_assistant_messages__message_id__stop_post","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"integer","title":"Message Id"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Stop V1 Assistant Messages  Message Id  Stop Post"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/assistant/messages/{message_id}/offer":{"post":{"tags":["Bounty AI"],"summary":"Ответ на предложение помощника (Р-449): уведомление или заметка","description":"`accept` у `reminder_offer` ставит уведомление (`local_time` —\n«Другое время»), у `note_offer` записывает заметку (`title`, `text` —\nпоправленные гостем). `skip` — крестик: предложение скрывается. Блок\nполучает `state` и номер созданного (`reminder_id`, `note_id`) на всех\nустройствах; повторный ответ ничего не меняет. Лимит не тратится.\n\nОшибки: `404 assistant_message_not_found` (нет такого предложения),\n`reminder_invalid`, `reminders_too_many`, `note_invalid`, `notes_too_many`.","operationId":"answer_offer_v1_assistant_messages__message_id__offer_post","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"integer","title":"Message Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfferAnswer"}}}},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Answer Offer V1 Assistant Messages  Message Id  Offer Post"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/assistant/messages/{message_id}/feedback":{"post":{"tags":["Bounty AI"],"summary":"👍/👎 ответу. У 👎 — причина (wrong, useless, other) и текст","operationId":"feedback_v1_assistant_messages__message_id__feedback_post","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"integer","title":"Message Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackRequest"}}}},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Feedback V1 Assistant Messages  Message Id  Feedback Post"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/assistant/messages/{message_id}/checklist":{"post":{"tags":["Bounty AI"],"summary":"Галочка чек-листа. Сохраняется — видна с любого устройства","operationId":"checklist_v1_assistant_messages__message_id__checklist_post","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"integer","title":"Message Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChecklistRequest"}}}},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Checklist V1 Assistant Messages  Message Id  Checklist Post"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/assistant/read":{"post":{"tags":["Bounty AI"],"summary":"Прочитано до сообщения включительно — гаснет счётчик на пункте меню","operationId":"read_v1_assistant_read_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__assistant__ReadRequest"}}},"required":true},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Read V1 Assistant Read Post"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/assistant/settings":{"get":{"tags":["Bounty AI"],"summary":"Настройки помощника гостя: сообщения первым, голос, озвучка, память","operationId":"read_settings_v1_assistant_settings_get","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Read Settings V1 Assistant Settings Get"}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]},"patch":{"tags":["Bounty AI"],"summary":"Настройки помощника. Меняется только присланное","description":"* `proactive` — «Bounty AI пишет первым»: `all`, `trips`, `off`;\n* `voice` — голос помощника: `female`, `male` (Р-429);\n* `voice_reply` — отвечать голосом на голосовое (Р-429);\n* `ask_location` — можно ли спрашивать точное местоположение (Р-432);\n  «Не сейчас» у запроса выключает само.","operationId":"change_settings_v1_assistant_settings_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsRequest"}}},"required":true},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Change Settings V1 Assistant Settings Patch"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/assistant/memory":{"get":{"tags":["Bounty AI"],"summary":"Что помнит Bounty AI о госте","operationId":"read_memory_v1_assistant_memory_get","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Read Memory V1 Assistant Memory Get"}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]},"delete":{"tags":["Bounty AI"],"summary":"Забыть всё, что помощник помнит о госте. Ответ — 204 без тела","operationId":"forget_everything_v1_assistant_memory_delete","responses":{"204":{"description":"Успешный ответ"},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/assistant/memory/{fact_id}":{"delete":{"tags":["Bounty AI"],"summary":"Забыть один факт памяти помощника. Ответ — 204 без тела","operationId":"forget_fact_v1_assistant_memory__fact_id__delete","parameters":[{"name":"fact_id","in":"path","required":true,"schema":{"type":"integer","title":"Fact Id"}}],"responses":{"204":{"description":"Успешный ответ"},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/assistant/messages/{message_id}/speech":{"post":{"tags":["Bounty AI"],"summary":"Озвучить ответ помощника или одну его фразу (Р-429, docs/assistant.md §8а)","description":"Без `block` — ответ целиком, тепло; с `block` — фраза блока `phrases`\n(`item` — её номер) или «Покажите водителю», медленно и чётко. Голос —\nгостя (`voice` в настройках). Звук создаётся один раз: повтор и другое\nустройство получают тот же файл. Лимит сообщений не тратится.\n\nОшибки: `503 assistant_speech_unavailable`, `400 assistant_speech_empty`,\n`502 assistant_speech_failed`, `404 assistant_message_not_found`.","operationId":"speech_v1_assistant_messages__message_id__speech_post","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"integer","title":"Message Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeechRequest"}}}},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Speech V1 Assistant Messages  Message Id  Speech Post"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]},"get":{"tags":["Bounty AI"],"summary":"Озвучка потоком — для <audio src> и системного плеера (Р-429, §8а)","description":"Звук уже есть — отдаётся файл из хранилища с длиной; нет — звук идёт\nпрямо из OpenAI, пока тот говорит (первый звук через полторы секунды, а\nне через десять), и в конце сохраняется файлом. Что озвучить — как у\n`POST`. Отказы те же, кодом ответа: `503`, `400`, `404`.","operationId":"speech_stream_v1_assistant_messages__message_id__speech_get","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"integer","title":"Message Id"}},{"name":"block","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Номер блока; пусто — весь ответ","title":"Block"},"description":"Номер блока; пусто — весь ответ"},{"name":"item","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Номер фразы в `phrases`","title":"Item"},"description":"Номер фразы в `phrases`"}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/assistant/messages/{message_id}/location-request":{"post":{"tags":["Bounty AI"],"summary":"Ответ на «Поделиться местоположением?» (Р-432) — пометка в блоке","description":"Точку гость присылает обычным сообщением с `location`; здесь только\n`shared` или `declined`: кнопки гаснут на всех устройствах, модель видит\nответ в истории и после отказа не спрашивает снова. Лимит не тратится.\nОтвет — сообщение. Другое значение или нет запроса — `404`.","operationId":"answer_location_request_v1_assistant_messages__message_id__location_request_post","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"integer","title":"Message Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationAnswer"}}}},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Answer Location Request V1 Assistant Messages  Message Id  Location Request Post"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/assistant/messages/{message_id}/save-plan":{"post":{"tags":["Bounty AI"],"summary":"«Сохранить в планы» у предложенного плана (Р-428, docs/plans.md §5.3)","description":"План сохраняет гость — помощник лишь предлагает. Повтор вернёт тот же\nплан: номер сохранённого записывается в блок (`saved_plan_id`), и кнопка\nна любом устройстве становится «Открыть план».","operationId":"save_plan_v1_assistant_messages__message_id__save_plan_post","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"integer","title":"Message Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavePlanRequest"}}}},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Save Plan V1 Assistant Messages  Message Id  Save Plan Post"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/plans":{"get":{"tags":["Планы и уведомления"],"summary":"Планы гостя: ещё не прошедшие — по дате начала, прошедшие — свежие сверху","operationId":"list_plans_v1_plans_get","parameters":[{"name":"scope","in":"query","required":false,"schema":{"type":"string","description":"upcoming · past","default":"upcoming","title":"Scope"},"description":"upcoming · past"}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Plans V1 Plans Get"}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]},"post":{"tags":["Планы и уведомления"],"summary":"Новый план","description":"Шаги можно прислать сразу; уведомления шагов, чьё время уже прошло, не ставятся — причина в `warnings`.","operationId":"create_plan_v1_plans_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanCreate"}}}},"responses":{"201":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/plans/{plan_id}":{"get":{"tags":["Планы и уведомления"],"summary":"План целиком: дни с шагами и бронями гостя, уведомления, точки карты, пометка пояса (timezone_notice)","operationId":"read_plan_v1_plans__plan_id__get","parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Plan Id"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]},"patch":{"tags":["Планы и уведомления"],"summary":"Название, даты, заметка","description":"Даты, отрезающие шаги, — `400 plan_invalid` (`details.reason: excludes_items`, `details.days`).","operationId":"change_plan_v1_plans__plan_id__patch","parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Plan Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanPatch"}}}},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]},"delete":{"tags":["Планы и уведомления"],"summary":"Удалить план (мягко) — его шаги и уведомления следом","operationId":"delete_plan_v1_plans__plan_id__delete","parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Plan Id"}}],"responses":{"204":{"description":"Успешный ответ"},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/plans/{plan_id}/items":{"post":{"tags":["Планы и уведомления"],"summary":"Новый шаг. Ответ — план целиком и номер шага","operationId":"add_item_v1_plans__plan_id__items_post","parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Plan Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemBody"}}}},"responses":{"201":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/plans/{plan_id}/items/{item_id}":{"patch":{"tags":["Планы и уведомления"],"summary":"Правка шага, его уведомления (remind_before) и галочки «сделано»","operationId":"change_item_v1_plans__plan_id__items__item_id__patch","parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Plan Id"}},{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemBody"}}}},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]},"delete":{"tags":["Планы и уведомления"],"summary":"Удалить шаг (мягко) с его уведомлением","operationId":"delete_item_v1_plans__plan_id__items__item_id__delete","parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Plan Id"}},{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/reminders":{"get":{"tags":["Планы и уведомления"],"summary":"Действующие уведомления по времени, сработавшие за 30 дней и пометка каждого пояса (zones)","operationId":"list_reminders_v1_reminders_get","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]},"post":{"tags":["Планы и уведомления"],"summary":"Уведомление на точное время. Такое же уже стоит — created: false и оно","operationId":"create_reminder_v1_reminders_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReminderCreate"}}},"required":true},"responses":{"201":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/reminders/{reminder_id}":{"patch":{"tags":["Планы и уведомления"],"summary":"Новое время или текст. У уведомления шага время идёт за шагом","operationId":"change_reminder_v1_reminders__reminder_id__patch","parameters":[{"name":"reminder_id","in":"path","required":true,"schema":{"type":"integer","title":"Reminder Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReminderPatch"}}}},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]},"delete":{"tags":["Планы и уведомления"],"summary":"Снять уведомление. В базе остаётся со статусом cancelled (правило №6)","operationId":"cancel_reminder_v1_reminders__reminder_id__delete","parameters":[{"name":"reminder_id","in":"path","required":true,"schema":{"type":"integer","title":"Reminder Id"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/notes":{"get":{"tags":["Заметки"],"summary":"Заметки: закреплённые сверху, дальше — по последней правке","description":"`q` — поиск (найденное — по весу: слово в заголовке важнее, чем в\nтексте; у заметки — `mark`, слово для подсветки), `filter` — «Все»,\n«Закреплённые», «От Bounty AI».","operationId":"list_notes_v1_notes_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":80,"description":"Слова в заголовке или тексте","default":"","title":"Q"},"description":"Слова в заголовке или тексте"},{"name":"filter","in":"query","required":false,"schema":{"type":"string","description":"all · pinned · ai","default":"all","title":"Filter"},"description":"all · pinned · ai"}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]},"post":{"tags":["Заметки"],"summary":"Новая заметка. Ошибки: note_invalid, notes_too_many (500 на человека)","operationId":"create_note_v1_notes_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteCreate"}}}},"responses":{"201":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/notes/{note_id}":{"get":{"tags":["Заметки"],"summary":"Одна заметка; удалённая — тоже (deleted: true), чтобы её можно было вернуть","operationId":"read_note_v1_notes__note_id__get","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Note Id"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]},"patch":{"tags":["Заметки"],"summary":"Правка заметки: заголовок, текст, привязка, «Закрепить»","operationId":"change_note_v1_notes__note_id__patch","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Note Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotePatch"}}}},"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]},"delete":{"tags":["Заметки"],"summary":"Удалить — мягко (правило №6): вернуть можно POST …/restore","operationId":"delete_note_v1_notes__note_id__delete","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Note Id"}}],"responses":{"204":{"description":"Успешный ответ"},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/notes/{note_id}/restore":{"post":{"tags":["Заметки"],"summary":"«Вернуть» удалённую заметку (карточка в ленте Bounty AI)","operationId":"restore_note_v1_notes__note_id__restore_post","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Note Id"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"401":{"description":"Нет входа, токен истёк или сессия закрыта — `unauthorized`. Обновите пару `POST /v1/auth/refresh` и повторите; не вышло — на вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"unauthorized","message":"Требуется авторизация","request_id":"0f1c2b7e9a4d4c1e"}}}}},"403":{"description":"Вход есть, но действие недоступно: почта не подтверждена — `email_not_confirmed`, аккаунт ограничен — `account_restricted`, нет прав — `forbidden`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"email_not_confirmed","message":"Подтвердите почту, чтобы продолжить","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/connect":{"get":{"tags":["Связь и карта сайта"],"summary":"Офис, где оформляют SIM-карту, и тарифы на языке запроса","description":"Тексты тарифа — перевод на язык запроса, если он готов, иначе оригинал\nмодератора. Покупки через сервис нет: оформление в офисе, по паспорту.","operationId":"connect_v1_connect_get","responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectResponse"}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}},"/v1/seo/{name}":{"get":{"tags":["Связь и карта сайта"],"summary":"Готовый файл карты сайта: sitemap.xml или его часть sitemap-N.xml","description":"Файл собирает фоновая задача раз в три часа (Р-423). Ещё не собран или\nимя чужое — `404`.","operationId":"sitemap_file_v1_seo__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Успешный ответ","content":{"application/json":{"schema":{}}}},"400":{"description":"Неверные параметры или тело запроса — `validation_error`; в `details.fields` — какие поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"validation_error","message":"Проверьте заполненные поля","request_id":"0f1c2b7e9a4d4c1e"}}}}},"404":{"description":"Нет такого объекта или он вам не принадлежит — `not_found`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"not_found","message":"Не найдено","request_id":"0f1c2b7e9a4d4c1e"}}}}},"429":{"description":"Слишком часто — `rate_limited`. Подождите столько секунд, сколько в заголовке `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"rate_limited","message":"Слишком много запросов","request_id":"0f1c2b7e9a4d4c1e"}}}}},"500":{"description":"Сбой на стороне сервиса — `internal_error`; `request_id` — для поддержки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":{"code":"internal_error","message":"Внутренняя ошибка","request_id":"0f1c2b7e9a4d4c1e"}}}}}}}}},"components":{"schemas":{"AmenityResponse":{"properties":{"id":{"type":"integer","title":"Id"},"code":{"type":"string","title":"Code"},"group":{"type":"string","title":"Group"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"is_filter":{"type":"boolean","title":"Is Filter"},"name":{"type":"string","title":"Name"}},"type":"object","required":["id","code","group","is_filter","name"],"title":"AmenityResponse","description":"Удобство. `is_filter` — показывать ли его в панели фильтров."},"AvailabilityDay":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"available":{"type":"boolean","title":"Available"},"price_minor":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Minor","description":"Цена ночи **после правил** — та, что попадёт в чек"},"base_price_minor":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Base Price Minor","description":"Цена до правил. Без неё разницу нечем объяснить"},"rules":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Rules","description":"Правила, подействовавшие на этот день: сезон и выходные"},"special":{"type":"boolean","title":"Special","description":"Цена дня отличается от обычной цены объекта — правилом или вручную (№111)","default":false},"min_nights":{"type":"integer","title":"Min Nights"},"units_left":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Units Left","description":"Сколько единиц осталось (Р-121). null у объекта с одной единицей"}},"type":"object","required":["date","available","min_nights"],"title":"AvailabilityDay"},"AvailabilityMark":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"today":{"type":"boolean","title":"Today"}},"type":"object","required":["date","today"],"title":"AvailabilityMark","description":"С какого дня объект свободен (Р-275). День — в поясе объекта (правило №16).\n\nУ жилья и транспорта — первый день без занятой ночи, у впечатления,\nуслуги и еды — день ближайшего выхода с местами. `today` — это сегодня\nпо календарю объекта."},"AvailabilityResponse":{"properties":{"listing_id":{"type":"string","format":"uuid","title":"Listing Id"},"timezone":{"type":"string","title":"Timezone"},"regular_price_minor":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Regular Price Minor","description":"Обычная цена объекта — от неё отличается «особая» (№111)"},"timezone_notice":{"$ref":"#/components/schemas/TimezoneNoticeBody"},"currency":{"type":"string","title":"Currency"},"days":{"items":{"$ref":"#/components/schemas/AvailabilityDay"},"type":"array","title":"Days"}},"type":"object","required":["listing_id","timezone","timezone_notice","currency","days"],"title":"AvailabilityResponse"},"AvatarResponse":{"properties":{"avatar_url":{"type":"string","title":"Avatar Url"}},"type":"object","required":["avatar_url"],"title":"AvatarResponse","description":"Ссылка на аватар в публичном бакете."},"BadgesResponse":{"properties":{"notifications":{"type":"integer","title":"Notifications","description":"Непрочитанные уведомления — число у колокольчика","examples":[3]},"messages":{"type":"integer","title":"Messages","description":"Непрочитанные сообщения во всех переписках гостя — число у значка сообщений","examples":[2]},"assistant":{"type":"integer","title":"Assistant","description":"Ответы и сообщения Bounty AI, которых гость ещё не видел — точка у вкладки «Bounty»","examples":[0]}},"type":"object","required":["notifications","messages","assistant"],"title":"BadgesResponse","description":"Счётчики непрочитанного для шапки и нижнего меню (Р-465)."},"Body_set_avatar_v1_me_avatar_put":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File","description":"Изображение: JPEG, PNG, HEIC или WebP"}},"type":"object","required":["file"],"title":"Body_set_avatar_v1_me_avatar_put"},"Body_upload_v1_assistant_files_post":{"properties":{"kind":{"type":"string","title":"Kind","description":"photo · document · voice","default":"document"},"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_v1_assistant_files_post"},"Body_upload_v1_uploads_post":{"properties":{"kind":{"type":"string","title":"Kind","description":"photo / voice / document"},"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["kind","file"],"title":"Body_upload_v1_uploads_post"},"BookingBrief":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"code":{"type":"string","title":"Code"},"status":{"type":"string","title":"Status"},"kind":{"type":"string","title":"Kind"},"booking_kind":{"type":"string","title":"Booking Kind","description":"nightly / contract (Р-122). У контракта расчёт идёт вне сервиса (В-34)","default":"nightly"},"date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"},"date_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To"},"nights":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Nights"},"starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts At"},"ends_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ends At","description":"Конец выхода у брони впечатления, услуги, еды (нехватка №35)"},"guests":{"type":"integer","title":"Guests"},"total":{"$ref":"#/components/schemas/MoneyBody"},"payment_status":{"type":"string","title":"Payment Status","description":"Оплата: none · authorized · paid · partially_refunded · refunded","default":"none"},"respond_by":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Respond By","description":"Докуда хозяин отвечает на запрос. Плашка «Ответит до» — пока `status = pending`"},"pay_by":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Pay By","description":"Докуда ждём оплату подтверждённой брони (Р-183). Плашка «Оплатить до» — пока `status = confirmed` и `payment_status = none`"},"pay_expired":{"type":"boolean","title":"Pay Expired","description":"Подтверждённую бронь не оплатили к сроку, и она закрылась (Р-400)","default":false},"review_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Review Until","description":"До какого момента можно написать отзыв; пусто — нельзя или уже написан"},"has_review":{"type":"boolean","title":"Has Review","description":"Гость уже оставил отзыв по этой брони","default":false},"listing":{"$ref":"#/components/schemas/ListingBrief"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","code","status","kind","guests","total","listing","created_at"],"title":"BookingBrief","description":"Бронь в списке поездок."},"BookingCounts":{"properties":{"upcoming":{"type":"integer","title":"Upcoming"},"completed":{"type":"integer","title":"Completed"},"cancelled":{"type":"integer","title":"Cancelled"}},"type":"object","required":["upcoming","completed","cancelled"],"title":"BookingCounts","description":"Числа на вкладках списка (S63) — по тем же правилам, что `scope`."},"BookingCreate":{"properties":{"listing_id":{"type":"string","format":"uuid","title":"Listing Id"},"date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"},"date_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To"},"slot_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Slot Id"},"contract_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Contract Id"},"guests_adults":{"type":"integer","maximum":50.0,"minimum":1.0,"title":"Guests Adults","default":1},"guests_children":{"type":"integer","maximum":50.0,"minimum":0.0,"title":"Guests Children","default":0},"guests_infants":{"type":"integer","maximum":10.0,"minimum":0.0,"title":"Guests Infants","default":0},"pets":{"type":"integer","maximum":10.0,"minimum":0.0,"title":"Pets","default":0},"guest_message":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Guest Message"},"guests_details":{"items":{"$ref":"#/components/schemas/GuestDetails"},"type":"array","maxItems":50,"title":"Guests Details"},"contact_phone":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Contact Phone"},"rates":{"items":{"$ref":"#/components/schemas/RatePick"},"type":"array","maxItems":20,"title":"Rates"},"extras":{"items":{"$ref":"#/components/schemas/ExtraPick"},"type":"array","maxItems":20,"title":"Extras"}},"additionalProperties":false,"type":"object","required":["listing_id"],"title":"BookingCreate","description":"Запрос на бронь. Требует заголовка `Idempotency-Key`."},"BookingDetail":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"code":{"type":"string","title":"Code"},"status":{"type":"string","title":"Status"},"kind":{"type":"string","title":"Kind"},"booking_kind":{"type":"string","title":"Booking Kind","description":"nightly / contract (Р-122). У контракта расчёт идёт вне сервиса (В-34)","default":"nightly"},"date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"},"date_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To"},"nights":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Nights"},"starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts At"},"ends_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ends At","description":"Конец выхода у брони впечатления, услуги, еды (нехватка №35)"},"guests":{"type":"integer","title":"Guests"},"total":{"$ref":"#/components/schemas/MoneyBody"},"payment_status":{"type":"string","title":"Payment Status"},"respond_by":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Respond By","description":"Докуда хозяин отвечает на запрос. Плашка «Ответит до» — пока `status = pending`"},"pay_by":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Pay By","description":"Докуда ждём оплату подтверждённой брони (Р-183). Плашка «Оплатить до» — пока `status = confirmed` и `payment_status = none`"},"pay_expired":{"type":"boolean","title":"Pay Expired","description":"Подтверждённую бронь не оплатили к сроку, и она закрылась (Р-400)","default":false},"review_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Review Until","description":"До какого момента можно написать отзыв; пусто — нельзя или уже написан"},"has_review":{"type":"boolean","title":"Has Review","description":"Гость уже оставил отзыв по этой брони","default":false},"listing":{"$ref":"#/components/schemas/ListingBrief"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"lines":{"items":{"$ref":"#/components/schemas/QuoteLine"},"type":"array","title":"Lines"},"deposit":{"anyOf":[{"$ref":"#/components/schemas/MoneyBody"},{"type":"null"}]},"free_cancel_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Free Cancel Until"},"free_cancel_last_day":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Free Cancel Last Day","description":"Последний день бесплатной отмены, включительно, в поясе объекта (Р-243)"},"policy":{"anyOf":[{"$ref":"#/components/schemas/PolicyBody"},{"type":"null"}],"description":"Условия, действующие сегодня"},"policies":{"items":{"$ref":"#/components/schemas/PolicyBody"},"type":"array","title":"Policies","description":"Все условия, которые могут сработать между сегодня и выездом (Р-204): основные и сезонные, попадающие на даты поездки"},"timezone_notice":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Timezone Notice","description":"Пометка о поясе объекта (правило №16): `label` — чьё это время, `hint` — пояснение о разнице, когда пояс гостя другой"},"pay_closed":{"type":"boolean","title":"Pay Closed","description":"Время на оплату вышло: форма банка гаснет за минуту до `pay_by` (Р-396), оплатить уже нельзя (`409 booking_payment_expired`)","default":false},"guest_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Guest Message"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"directions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Directions"},"directions_original":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Directions Original","description":"Оригинал «как добраться», когда `directions` пришло переводом; `null` — показан оригинал (сейчас это поле не переводится)"},"point":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Point","description":"Точка объекта `{lat, lon}` для карты — та же, что на странице объекта (Р-201)"},"checkin_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checkin From"},"checkout_until":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checkout Until"},"required_documents":{"items":{"type":"string"},"type":"array","title":"Required Documents","description":"«Что взять с собой» — коды документов объекта (`passport`, `deposit_cash`…), подписи — строками `listing.checkin_doc.<код>` (нехватка №55)"},"house_rules":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"House Rules","description":"Правила дома на языке запроса, где перевод готов (№90)"},"can_cancel":{"type":"boolean","title":"Can Cancel"},"can_check_in_now":{"type":"boolean","title":"Can Check In Now","description":"Примут ли код на стойке прямо сейчас. Показом кода не управляет (Р-158)"},"guest_details":{"additionalProperties":true,"type":"object","title":"Guest Details","description":"Данные участников: режим объекта (optional/required), сколько нужно и заполнено, можно ли платить (`ready`) и править (`editable` — до оплаты, Р-352)"},"contact_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Phone","description":"Телефон для связи по заказу (Р-352). Правится до оплаты вместе с участниками"},"confirmed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Confirmed At"},"paid_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Paid At"},"cancelled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Cancelled At"},"declined_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Declined At"},"checkin_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Checkin At"},"checkout_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Checkout At"},"cancelled_by_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancelled By Kind"},"thread_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Thread Id"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"details":{"additionalProperties":true,"type":"object","title":"Details"},"pay_options":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Pay Options"},"snapshot":{"additionalProperties":true,"type":"object","title":"Snapshot","description":"Снимок покупки на момент оформления (Р-161): объект, единица фонда, партнёр, условия и политика отмены. Не меняется никогда — чек обязан показывать то, что человек купил тогда, а не сегодняшнюю карточку. Адреса в снимке нет: он хранится зашифрованным"}},"type":"object","required":["id","code","status","kind","guests","total","payment_status","listing","created_at","lines","can_cancel","can_check_in_now"],"title":"BookingDetail","description":"Карточка брони.\n\n`address` и `directions` приходят **только по подтверждённой броне**: точка\nна карте говорит, где объект, а адрес — как в него попасть, и до\nподтверждения это чужие сведения."},"BookingPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BookingBrief"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"},"has_more":{"type":"boolean","title":"Has More","default":false},"counts":{"anyOf":[{"$ref":"#/components/schemas/BookingCounts"},{"type":"null"}],"description":"Только при `with_counts=true`"}},"type":"object","required":["items"],"title":"BookingPage"},"BookingStatus":{"type":"string","enum":["pending","confirmed","declined","expired","cancelled_by_user","cancelled_by_partner","checked_in","completed","no_show"],"title":"BookingStatus"},"BookingTerms":{"properties":{"daily":{"type":"boolean","title":"Daily"},"long_term_months":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Long Term Months"}},"type":"object","required":["daily"],"title":"BookingTerms","description":"Как объект бронируется (Р-275) — метка в углу карточки.\n\n`daily` — посуточно (жильё и транспорт); `long_term_months` — самый\nкороткий срок действующего предложения аренды, если объект сдаётся надолго."},"CalendarDay":{"properties":{"day":{"type":"string","format":"date","title":"Day","description":"День в поясе площадок"},"total":{"type":"integer","title":"Total","description":"Сколько дней событий подходит по фильтрам — число в клетке полоски"}},"type":"object","required":["day","total"],"title":"CalendarDay","description":"Один день полоски календаря: дата и сколько в ней событий."},"CalendarResponse":{"properties":{"days":{"items":{"$ref":"#/components/schemas/CalendarDay"},"type":"array","title":"Days","description":"Дни окна по порядку, от `first` (по умолчанию — сегодня)"},"timezone":{"type":"string","title":"Timezone","description":"Пояс, в котором считается «сегодня»","examples":["Asia/Bangkok"]},"today":{"type":"string","format":"date","title":"Today","description":"Сегодня в этом поясе — клетка «Сегодня» полоски"}},"type":"object","required":["days","timezone","today"],"title":"CalendarResponse","description":"Полоска календаря над лентой.\n\nСчитается **с теми же фильтрами**, что и лента: число, обещающее события\nтам, где их по фильтрам нет, — обещание, которое раздел не сдержит."},"CancelRequest":{"properties":{"reason_code":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Reason Code"},"comment":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Comment"}},"type":"object","title":"CancelRequest"},"ChecklistRequest":{"properties":{"item_id":{"type":"string","title":"Item Id"},"done":{"type":"boolean","title":"Done"}},"type":"object","required":["item_id","done"],"title":"ChecklistRequest"},"ConfigResponse":{"properties":{"map":{"$ref":"#/components/schemas/MapConfig"},"languages":{"items":{"type":"string"},"type":"array","title":"Languages"},"default_language":{"type":"string","title":"Default Language"},"currencies":{"items":{"type":"string"},"type":"array","title":"Currencies"},"base_currency":{"type":"string","title":"Base Currency"},"search":{"$ref":"#/components/schemas/SearchLimits"},"online_payments_enabled":{"type":"boolean","title":"Online Payments Enabled","description":"Приём платежей включён (рубильник payments_terminal не в off)"},"service_fee_percent":{"type":"number","title":"Service Fee Percent"},"max_upload_mb":{"type":"integer","title":"Max Upload Mb"},"review_window_days":{"type":"integer","title":"Review Window Days","description":"Сколько дней после поездки открыто окно отзыва (Р-422)","default":14},"assistant_enabled":{"type":"boolean","title":"Assistant Enabled","description":"Работает ли Bounty AI: показывать ли пункт меню вошедшему гостю (Р-426)","default":false},"region":{"anyOf":[{"$ref":"#/components/schemas/RegionInfo"},{"type":"null"}],"description":"Регион афиши (Р-459): место уровня region у стартовой точки карты"}},"type":"object","required":["map","default_language","base_currency","search","online_payments_enabled","service_fee_percent","max_upload_mb"],"title":"ConfigResponse","description":"Публичная конфигурация клиента."},"ConfirmEmailRequest":{"properties":{"token":{"type":"string","maxLength":128,"minLength":32,"title":"Token"}},"type":"object","required":["token"],"title":"ConfirmEmailRequest","description":"Подтверждение адреса по ссылке из письма."},"ConnectResponse":{"properties":{"office":{"$ref":"#/components/schemas/Office"},"tariffs":{"items":{"$ref":"#/components/schemas/SimTariff"},"type":"array","title":"Tariffs","description":"Тарифы, которые продаются в офисе; пусто — цены называют на месте"}},"type":"object","required":["office"],"title":"ConnectResponse"},"CountResponse":{"properties":{"count":{"type":"integer","title":"Count"}},"type":"object","required":["count"],"title":"CountResponse","description":"Число вариантов для кнопки «Показать N»."},"CurrencyResponse":{"properties":{"code":{"type":"string","title":"Code"},"symbol":{"type":"string","title":"Symbol"},"minor_units":{"type":"integer","title":"Minor Units"}},"type":"object","required":["code","symbol","minor_units"],"title":"CurrencyResponse"},"DeleteRequest":{"properties":{"captcha_id":{"type":"string","maxLength":64,"title":"Captcha Id","default":""},"captcha_answer":{"type":"string","maxLength":16,"title":"Captcha Answer","default":""}},"type":"object","title":"DeleteRequest","description":"Запрос на удаление аккаунта: только код с картинки, и тот по подозрению."},"DeviceBody":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"platform":{"type":"string","title":"Platform"},"app_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Version"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"current":{"type":"boolean","title":"Current","description":"Устройство этой сессии (Р-424)","default":false},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"last_seen_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Seen At"}},"type":"object","required":["id","platform"],"title":"DeviceBody"},"DeviceForget":{"properties":{"push_token":{"type":"string","maxLength":4096,"minLength":10,"title":"Push Token"}},"additionalProperties":false,"type":"object","required":["push_token"],"title":"DeviceForget","description":"Выключить пуши на этом устройстве: токен, который оно получило (Р-424)."},"DeviceRegister":{"properties":{"push_token":{"type":"string","maxLength":4096,"minLength":10,"title":"Push Token"},"platform":{"type":"string","title":"Platform","description":"android / ios / web"},"app_version":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"App Version"},"language":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Language"},"timezone":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Timezone"}},"additionalProperties":false,"type":"object","required":["push_token","platform"],"title":"DeviceRegister","description":"Регистрация пуш-токена.\n\n`timezone` — пояс **самого устройства** (Р-088). По нему считаются тихие\nчасы: у гостя пояса в профиле нет, и телефон — единственный, кто знает его\nнастоящее время."},"DialogBody":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"kind":{"type":"string","title":"Kind"},"status":{"type":"string","title":"Status"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"listing_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Listing Id","description":"Объект ленты заказа (`booking`); у переписки с бизнесом — null (Р-484)"},"listing_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Listing Title"},"listing_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Listing Slug","description":"Чтобы из ленты заказа открыть сам объект"},"listing_photo":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Listing Photo","description":"Размеры первого снимка объекта; `large` может отсутствовать"},"booking_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Booking Id"},"partner_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Partner Id"},"partner_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partner Name"},"partner_logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partner Logo Url"},"partner_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partner Kind","description":"Раздел бизнеса (stay · experience · service · transport · food) — подпись строки (Р-484)"},"unread":{"type":"integer","title":"Unread","default":0},"last_message_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Message At"},"last_message_preview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Message Preview","description":"Последняя реплика без значков (нехватка №38): текст, у голосового — длительность «0:12», у документа — имя файла"},"last_message_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Message Type","description":"Вид последнего сообщения: text · photo · voice · document · event — по нему клиент рисует значок у превью"},"last_event_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Event Code"},"last_event_payload":{"additionalProperties":true,"type":"object","title":"Last Event Payload"},"contacts_hidden":{"type":"boolean","title":"Contacts Hidden","description":"Всегда `false`: контакты не скрываются (Р-485), поле — ради старых клиентов","default":false},"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic","description":"Тема обращения в поддержку кодом (Р-476); у прочих — null"},"last_message_mine":{"type":"boolean","title":"Last Message Mine","description":"Последнее сообщение написал сам гость — «Вы: …» (№56)","default":false}},"type":"object","required":["id","kind","status"],"title":"DialogBody"},"DialogList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/DialogBody"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"DialogList"},"DialogOpen":{"properties":{"partner_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Partner Id","description":"Бизнес — со страницы бизнеса"},"listing_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Listing Id","description":"Объект — с объявления"},"booking_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Booking Id","description":"Бронь — бизнес этой брони"}},"additionalProperties":false,"type":"object","title":"DialogOpen","description":"Открыть переписку с бизнесом (Р-484): по бизнесу, объекту или брони.\n\nПереписка с бизнесом у гостя одна: все три пути ведут в неё, объект и\nбронь только подсказывают, с каким бизнесом говорить."},"EmailAvailabilityResponse":{"properties":{"available":{"type":"boolean","title":"Available"}},"type":"object","required":["available"],"title":"EmailAvailabilityResponse","description":"Свободен ли адрес.\n\nОтвечает только на форме регистрации и под лимитом: без этого эндпоинт\nпревращается в проверялку «есть ли у вас аккаунт на Bounty» для чужих\nсписков адресов."},"EmailPrefGroup":{"properties":{"group":{"type":"string","title":"Group","description":"Группа в настройках: bookings, payments, security…"},"items":{"items":{"$ref":"#/components/schemas/EmailPrefItem"},"type":"array","title":"Items"}},"type":"object","required":["group","items"],"title":"EmailPrefGroup"},"EmailPrefItem":{"properties":{"code":{"type":"string","title":"Code","description":"Код письма из реестра, `docs/emails.md` §4"},"enabled":{"type":"boolean","title":"Enabled"},"default":{"type":"boolean","title":"Default","description":"Включено ли оно у нового аккаунта"}},"type":"object","required":["code","enabled","default"],"title":"EmailPrefItem"},"EmailPrefsBody":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/EmailPrefGroup"},"type":"array","title":"Groups"}},"type":"object","required":["groups"],"title":"EmailPrefsBody","description":"Галочки писем человека по группам (Р-404)."},"EmailPrefsUpdate":{"properties":{"prefs":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Prefs"}},"type":"object","title":"EmailPrefsUpdate","description":"Какие письма включить или выключить: `{код: да/нет}`.\n\nНезнакомый код или письмо, которое нельзя выключить (ответ на действие\nчеловека), — `400 email_pref_unknown`."},"EventCard":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"slug":{"type":"string","title":"Slug","description":"Адрес страницы: `/v1/events/{slug}`","examples":["golf-den-s-champs-7123"]},"title":{"type":"string","title":"Title","description":"Название на языке запроса","examples":["Гольф-день с Champs"]},"category":{"$ref":"#/components/schemas/app__schemas__events__CategoryResponse"},"photo":{"anyOf":[{"$ref":"#/components/schemas/app__schemas__events__PhotoResponse"},{"type":"null"}],"description":"Обложка; в ленте — `thumb`"},"day":{"type":"string","format":"date","title":"Day","description":"День события в поясе площадки (правило №16)"},"time_from":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Time From","description":"Начало; `null` — весь день","examples":["19:00:00"]},"time_to":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Time To","description":"Конец; раньше начала — заканчивается на следующие сутки","examples":["23:00:00"]},"timezone":{"type":"string","title":"Timezone","description":"Пояс площадки — в нём дни и часы","examples":["Asia/Bangkok"]},"schedule":{"$ref":"#/components/schemas/ScheduleResponse"},"venue":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venue","description":"Площадка","examples":["Kata Walking Street"]},"place":{"anyOf":[{"$ref":"#/components/schemas/app__schemas__events__PlaceBrief"},{"type":"null"}]},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat","description":"Широта точки; без точки событие не попадает на карту"},"lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lon","description":"Долгота точки"},"price":{"$ref":"#/components/schemas/PriceResponse"},"crowd":{"type":"string","title":"Crowd","description":"Людность: `intimate`, `small`, `medium`, `large` — шкала из четырёх делений","examples":["medium"]},"audience":{"type":"string","title":"Audience","description":"Публика: `family`, `adults`, `any`","examples":["family"]},"langs":{"items":{"type":"string"},"type":"array","title":"Langs","description":"Языки события","examples":[["th","en"]]},"original_lang":{"type":"string","title":"Original Lang","description":"Язык оригинала текста","examples":["ru"]},"translation":{"anyOf":[{"$ref":"#/components/schemas/app__schemas__events__TranslationMark"},{"type":"null"}],"description":"Пометка перевода; `null` — текст на языке оригинала"}},"type":"object","required":["id","slug","title","category","day","timezone","schedule","price","crowd","audience","original_lang"],"title":"EventCard","description":"Карточка ленты: одно событие в один свой день.\n\nПлашка даты — `day`; строка времени — `time_from`/`time_to` и повтор из\n`schedule`; метка «Сейчас» — сегодня по `timezone`, начало прошло, конец\nещё нет (конец раньше начала — «до утра»)."},"EventDayBrief":{"properties":{"day":{"type":"string","format":"date","title":"Day","description":"День в поясе площадки"},"time_from":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Time From","description":"Начало в этот день (бывает своё)"},"time_to":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Time To","description":"Конец в этот день"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note","description":"Заметка редакции к этому дню"}},"type":"object","required":["day"],"title":"EventDayBrief","description":"Ближайшие дни события — для блока «когда ещё» на странице."},"EventResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"editorial":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Editorial"},"category":{"$ref":"#/components/schemas/app__schemas__events__CategoryResponse"},"photos":{"items":{"$ref":"#/components/schemas/app__schemas__events__PhotoResponse"},"type":"array","title":"Photos"},"schedule":{"$ref":"#/components/schemas/ScheduleResponse"},"next_day":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Next Day"},"days":{"items":{"$ref":"#/components/schemas/EventDayBrief"},"type":"array","title":"Days"},"time_from":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Time From"},"time_to":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Time To"},"timezone_notice":{"$ref":"#/components/schemas/TimezoneNotice"},"venue":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venue"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"place":{"anyOf":[{"$ref":"#/components/schemas/app__schemas__events__PlaceBrief"},{"type":"null"}]},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lon"},"price":{"$ref":"#/components/schemas/PriceResponse"},"crowd":{"type":"string","title":"Crowd"},"audience":{"type":"string","title":"Audience"},"langs":{"items":{"type":"string"},"type":"array","title":"Langs"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"listings":{"items":{"$ref":"#/components/schemas/LinkedListing"},"type":"array","title":"Listings"},"original_lang":{"type":"string","title":"Original Lang"},"translation":{"anyOf":[{"$ref":"#/components/schemas/app__schemas__events__TranslationMark"},{"type":"null"}]},"seo":{"anyOf":[{"$ref":"#/components/schemas/SeoTags"},{"type":"null"}]}},"type":"object","required":["id","slug","title","category","schedule","timezone_notice","price","crowd","audience","original_lang"],"title":"EventResponse","description":"Страница события."},"ExtraBody":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"code":{"type":"string","title":"Code"},"title":{"type":"string","title":"Title"},"price_minor":{"type":"integer","title":"Price Minor"},"per_unit":{"type":"boolean","title":"Per Unit"},"max_qty":{"type":"integer","title":"Max Qty"},"sort":{"type":"integer","title":"Sort"}},"type":"object","required":["id","code","title","price_minor","per_unit","max_qty","sort"],"title":"ExtraBody","description":"Доп. услуга объекта (Р-354): разовая (галочка) или поштучная до `max_qty`."},"ExtraPick":{"properties":{"extra_id":{"type":"string","format":"uuid","title":"Extra Id"},"qty":{"type":"integer","maximum":999.0,"minimum":1.0,"title":"Qty"}},"type":"object","required":["extra_id","qty"],"title":"ExtraPick","description":"Сколько штук доп. услуги берёт гость (Р-354). Цена — из базы.\n\nПотолок здесь общий, а у каждой услуги свой (`max_qty`) — его проверяет\nядро: схема не знает, о какой услуге речь."},"FavoriteCard":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"slug":{"type":"string","title":"Slug"},"kind":{"type":"string","title":"Kind"},"title":{"type":"string","title":"Title"},"lang":{"type":"string","title":"Lang"},"original_lang":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Lang"},"translation":{"anyOf":[{"$ref":"#/components/schemas/app__schemas__search__TranslationMark"},{"type":"null"}]},"photo":{"anyOf":[{"$ref":"#/components/schemas/app__schemas__search__PhotoResponse"},{"type":"null"}]},"price_from_minor":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price From Minor"},"currency":{"type":"string","title":"Currency"},"rating_avg":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating Avg"},"rating_count":{"type":"integer","title":"Rating Count"},"reviews_count":{"type":"integer","title":"Reviews Count"},"place":{"anyOf":[{"$ref":"#/components/schemas/app__schemas__search__PlaceBrief"},{"type":"null"}]},"distance_m":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Distance M"},"instant_book":{"type":"boolean","title":"Instant Book"},"is_featured":{"type":"boolean","title":"Is Featured"},"is_favorite":{"type":"boolean","title":"Is Favorite"},"terms":{"anyOf":[{"$ref":"#/components/schemas/BookingTerms"},{"type":"null"}]},"availability":{"anyOf":[{"$ref":"#/components/schemas/AvailabilityMark"},{"type":"null"}]},"facts":{"anyOf":[{"$ref":"#/components/schemas/StayFacts"},{"type":"null"}]},"list_id":{"type":"string","format":"uuid","title":"List Id"},"added_at":{"type":"string","format":"date-time","title":"Added At"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"price_at_add_minor":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price At Add Minor"},"price_changed_minor":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Changed Minor"}},"type":"object","required":["id","slug","kind","title","lang","currency","rating_count","reviews_count","instant_book","is_featured","is_favorite","list_id","added_at"],"title":"FavoriteCard","description":"Карточка избранного — та же, что в ленте, плюс история закладки.\n\n`price_changed_minor` — на сколько изменилась цена с момента добавления:\nгость отложил виллу за 3 200 бат и должен увидеть, что теперь она 4 500,\nа не винить свою память."},"FavoriteListRequest":{"properties":{"title":{"type":"string","maxLength":80,"minLength":1,"title":"Title"}},"type":"object","required":["title"],"title":"FavoriteListRequest","description":"Название списка. Заводит и переименовывает."},"FavoriteListResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"title":{"type":"string","title":"Title"},"is_default":{"type":"boolean","title":"Is Default"},"listings_count":{"type":"integer","title":"Listings Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","title","is_default","listings_count","created_at"],"title":"FavoriteListResponse","description":"Один список избранного."},"FavoriteRequest":{"properties":{"listing_id":{"type":"string","format":"uuid","title":"Listing Id"},"list_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"List Id"},"note":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Note"}},"type":"object","required":["listing_id"],"title":"FavoriteRequest","description":"Добавление объекта в избранное.\n\nБез `list_id` объект падает в список по умолчанию: в ленте выбора папки\nнет вовсе, там есть только сердечко."},"FavoriteResponse":{"properties":{"list_id":{"type":"string","format":"uuid","title":"List Id"},"listing_id":{"type":"string","format":"uuid","title":"Listing Id"}},"type":"object","required":["list_id","listing_id"],"title":"FavoriteResponse","description":"Куда положили."},"FavoritesPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/FavoriteCard"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"},"has_more":{"type":"boolean","title":"Has More"}},"type":"object","required":["items","has_more"],"title":"FavoritesPage","description":"Страница избранного."},"FeedbackRequest":{"properties":{"rating":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rating","description":"1 — 👍, -1 — 👎, пусто — снять"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"wrong · useless · other"},"comment":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Comment"}},"type":"object","title":"FeedbackRequest"},"FilesSend":{"properties":{"upload_ids":{"items":{"type":"string","format":"uuid"},"type":"array","maxItems":10,"minItems":1,"title":"Upload Ids"}},"additionalProperties":false,"type":"object","required":["upload_ids"],"title":"FilesSend","description":"Пакет документов: до десяти файлов и двадцать мегабайт суммарно (Р-205).\n\nТекста здесь нет намеренно: подпись к десяти файлам сразу — это подпись ни\nк одному из них. Слова отправляются отдельным сообщением, и у них своё\nместо в ленте."},"FxRatesResponse":{"properties":{"base":{"type":"string","title":"Base"},"date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date"},"fetched_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Fetched At"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"rates":{"additionalProperties":{"type":"number"},"type":"object","title":"Rates","default":{}}},"type":"object","required":["base"],"title":"FxRatesResponse","description":"Курсы валют для пересчёта цены (Р-214, Р-337).\n\nОтдаются **действующие** курсы, в рублях за единицу: назначенные\nсупер-админом там, где они назначены, официальные во всём остальном. Клиент\nсчитает из них кросс-курс сам: приводить набор к валюте объявления сервер не\nможет, потому что объявлений на странице десятки и валюты у них разные.\n\n**Ссылки на источник здесь нет** (Р-337): действует курс сервиса, и второе\nчисло рядом человек прочитал бы как «настоящую» цену. Поле `source_url`\nубрано вместе с кнопкой «курсы ЦБ РФ» из окна пересчёта.\n\n`rates` пуст, если курсов ещё нет вовсе. Это нормальное состояние только\nчто поднятого сервиса, а не ошибка: пересчёт тогда просто не показывается."},"GreetingRequest":{"properties":{"location":{"anyOf":[{"$ref":"#/components/schemas/Location"},{"type":"null"}],"description":"Точка устройства сейчас — только если доступ к геолокации уже дан"},"timezone":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Timezone","description":"Пояс устройства (IANA) — на случай, если места нет"}},"type":"object","title":"GreetingRequest","description":"Заход в помощника (Р-489)."},"GuestDetails":{"properties":{"full_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Full Name"},"birth_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Birth Date"},"age":{"anyOf":[{"type":"integer","maximum":120.0,"minimum":0.0},{"type":"null"}],"title":"Age"},"citizenship":{"anyOf":[{"type":"string","maxLength":2,"minLength":2},{"type":"null"}],"title":"Citizenship"},"document_kind":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Document Kind"},"document_number":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Document Number"},"is_primary":{"type":"boolean","title":"Is Primary","default":false}},"type":"object","title":"GuestDetails","description":"Участник заказа.\n\nИмя не обязательно само по себе (Р-352): строку, где не заполнено ничего,\nсервис просто отбрасывает, а обязательны ли данные, решает объект. Отказ\n422 за пустое имя в третьей строке у объекта, где данные необязательны,\nзапирал бы бронь на ровном месте."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ItemBody":{"properties":{"day":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Day"},"time_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time From"},"time_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time To"},"title":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Title"},"note":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Note"},"place":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Place"},"ref":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Ref"},"remind_before":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Remind Before","description":"За сколько минут до начала: 0, 15, 30, 60, 120, 180, 1440"},"done":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Done"}},"type":"object","title":"ItemBody","description":"Шаг. Не присланное поле при правке не меняется; `remind_before: null` —\nснять уведомление шага."},"LeadRequest":{"properties":{"captcha_id":{"type":"string","maxLength":64,"title":"Captcha Id","default":""},"captcha_answer":{"type":"string","maxLength":16,"title":"Captcha Answer","default":""},"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"contact_kind":{"type":"string","title":"Contact Kind","description":"phone / whatsapp / telegram / line"},"contact":{"type":"string","maxLength":64,"minLength":1,"title":"Contact","description":"Номер телефона или имя в мессенджере"},"comment":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Comment"}},"type":"object","required":["name","contact_kind","contact"],"title":"LeadRequest","description":"Имя, способ связи, контакт и необязательный комментарий."},"LeadResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"}},"type":"object","required":["id"],"title":"LeadResponse","description":"Заявка принята. Больше гостю знать нечего: дальше с ним свяжутся."},"LinkedListing":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"slug":{"type":"string","title":"Slug"},"kind":{"type":"string","title":"Kind"},"title":{"type":"string","title":"Title"},"photo":{"anyOf":[{"$ref":"#/components/schemas/app__schemas__events__PhotoResponse"},{"type":"null"}]},"price_from_minor":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price From Minor"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"rating_avg":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating Avg"},"reviews_count":{"type":"integer","title":"Reviews Count","default":0},"place":{"anyOf":[{"$ref":"#/components/schemas/app__schemas__events__PlaceBrief"},{"type":"null"}]},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"}},"type":"object","required":["id","slug","kind","title"],"title":"LinkedListing","description":"Объект сервиса, привязанный к событию («Источник»).\n\nДанных ровно столько, сколько нужно карточке в ряду: цена, фотография,\nназвание, категория и метки. Что показывать из них — решает клиент по\n`kind`: у жилья это цена за ночь, у еды — формат заведения."},"ListingBrief":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"kind":{"type":"string","title":"Kind"},"title":{"type":"string","title":"Title"},"slug":{"type":"string","title":"Slug"},"photo":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Photo"},"place":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Place"},"timezone":{"type":"string","title":"Timezone"},"rating_avg":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating Avg","description":"Средняя оценка объекта, 1–5"},"reviews_count":{"type":"integer","title":"Reviews Count","description":"Сколько опубликованных отзывов","default":0}},"type":"object","required":["id","kind","title","slug","timezone"],"title":"ListingBrief","description":"Объект в карточке брони — столько, сколько нужно, чтобы его узнать."},"ListingReviews":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ReviewBody"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"},"has_more":{"type":"boolean","title":"Has More","default":false},"rating_avg":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating Avg"},"reviews_count":{"type":"integer","title":"Reviews Count","default":0},"criteria":{"additionalProperties":{"type":"number"},"type":"object","title":"Criteria","description":"Средняя по каждому критерию"},"sort":{"type":"string","title":"Sort","description":"Каким порядком отдана страница: recent, best или worst","default":"recent"}},"type":"object","required":["items"],"title":"ListingReviews","description":"Отзывы объекта плюс то, ради чего их открывают, — средние по критериям."},"ListingSuggestion":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"slug":{"type":"string","title":"Slug"},"kind":{"type":"string","title":"Kind"},"title":{"type":"string","title":"Title"},"photo":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Photo","description":"Обложка объекта тем же видом, что в ленте: `urls` по размерам, `avg_color`; нет снимков — null"}},"type":"object","required":["id","slug","kind","title"],"title":"ListingSuggestion"},"Location":{"properties":{"lat":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Lat"},"lng":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Lng"}},"type":"object","required":["lat","lng"],"title":"Location"},"LocationAnswer":{"properties":{"state":{"type":"string","title":"State","description":"shared — поделился точкой, declined — «Не сейчас»"}},"type":"object","required":["state"],"title":"LocationAnswer"},"LoginRequest":{"properties":{"captcha_id":{"type":"string","maxLength":64,"title":"Captcha Id","default":""},"captcha_answer":{"type":"string","maxLength":16,"title":"Captcha Answer","default":""},"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":128,"minLength":1,"title":"Password"}},"type":"object","required":["email","password"],"title":"LoginRequest","description":"Вход по почте и паролю."},"MapConfig":{"properties":{"style_url":{"type":"string","title":"Style Url"},"tiles_origin":{"type":"string","title":"Tiles Origin"},"default_lat":{"type":"number","title":"Default Lat"},"default_lon":{"type":"number","title":"Default Lon"},"default_zoom":{"type":"integer","title":"Default Zoom"},"points_zoom":{"type":"integer","title":"Points Zoom"}},"type":"object","required":["style_url","tiles_origin","default_lat","default_lon","default_zoom","points_zoom"],"title":"MapConfig","description":"Карта: стиль, тайлы и стартовый вид.\n\nСтиль и тайлы приходят с сервера, а не зашиты в приложение: адрес\nпоставщика меняется, а обновление в магазине идёт две недели."},"MapPoint":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"slug":{"type":"string","title":"Slug"},"kind":{"type":"string","title":"Kind"},"title":{"type":"string","title":"Title"},"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"price_minor":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Minor"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"rating_avg":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating Avg"},"reviews_count":{"type":"integer","title":"Reviews Count","default":0},"photo":{"anyOf":[{"$ref":"#/components/schemas/app__schemas__search__PhotoResponse"},{"type":"null"}]},"photos":{"items":{"$ref":"#/components/schemas/app__schemas__search__PhotoResponse"},"type":"array","title":"Photos","description":"До пяти снимков (первый — обложка): карточка на карте листает их по кругу"},"place":{"anyOf":[{"$ref":"#/components/schemas/app__schemas__search__PlaceBrief"},{"type":"null"}],"description":"Место объекта: «Панва · Пхукет · Таиланд»"}},"type":"object","required":["id","slug","kind","title","lat","lon"],"title":"MapPoint","description":"Метка объекта. Координаты точные, без смещения (Р-040)."},"MediaTicketResponse":{"properties":{"url":{"type":"string","title":"Url"},"expires_in":{"type":"integer","title":"Expires In"}},"type":"object","required":["url","expires_in"],"title":"MediaTicketResponse","description":"Одноразовая ссылка на приватный файл.\n\nЖивёт 60 секунд и срабатывает **один раз**: вставленная в `<img>` она\nотработает, а скопированная в другой браузер — уже нет."},"MessageBody":{"properties":{"id":{"type":"integer","title":"Id"},"dialog_id":{"type":"string","format":"uuid","title":"Dialog Id"},"sender_kind":{"type":"string","title":"Sender Kind"},"sender_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Sender Id"},"type":{"type":"string","title":"Type"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text","description":"Что показывать: перевод, если он есть, иначе оригинал"},"text_original":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text Original","description":"Как написал человек. Заполнено, только когда есть перевод"},"translated":{"type":"boolean","title":"Translated","description":"Текст показан в переводе (Р-064)","default":false},"lang":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"},"contacts_hidden":{"type":"boolean","title":"Contacts Hidden","description":"Всегда `false`: контакты не скрываются (Р-485), поле — ради старых клиентов","default":false},"listing_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Listing Id","description":"Объект, с которого гость написал (Р-484)"},"listing":{"anyOf":[{"$ref":"#/components/schemas/app__schemas__chat__ListingCard"},{"type":"null"}],"description":"Его карточка; объект снят — `null` при заполненном `listing_id`"},"is_official":{"type":"boolean","title":"Is Official","description":"Сообщение администрации","default":false},"links":{"items":{"$ref":"#/components/schemas/MessageLink"},"type":"array","title":"Links","description":"Ссылки показанного текста `text` (Р-484)"},"links_original":{"items":{"$ref":"#/components/schemas/MessageLink"},"type":"array","title":"Links Original","description":"Ссылки оригинала `text_original`, когда есть перевод"},"system_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System Code"},"payload":{"additionalProperties":true,"type":"object","title":"Payload"},"reply_to_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reply To Id"},"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Name"},"file_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"File Size"},"duration_sec":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Sec"},"waveform":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Waveform","description":"Волна громкости голосового: 48 уровней 0–100 (нехватка №40). Пусто у документа и фото и у голосовых до 15.10.2026"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"deleted":{"type":"boolean","title":"Deleted","description":"Удалено автором (№57): заглушка без текста, файла и перевода","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"},"read_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Read At"}},"type":"object","required":["id","dialog_id","sender_kind","type","created_at"],"title":"MessageBody"},"MessageLink":{"properties":{"text":{"type":"string","title":"Text","description":"Кусок текста как он стоит в сообщении — его и подсветить"},"url":{"type":"string","title":"Url","description":"Куда вести: у `www.…` — с `https://`"},"trusted":{"type":"boolean","title":"Trusted","description":"Адрес Bounty — открыть сразу; иначе — окно «Ссылка ведёт на другой сайт»"}},"type":"object","required":["text","url","trusted"],"title":"MessageLink","description":"Ссылка в тексте сообщения (Р-484)."},"MessagePage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MessageBody"},"type":"array","title":"Items"},"has_more":{"type":"boolean","title":"Has More","default":false}},"type":"object","required":["items"],"title":"MessagePage","description":"Лента сообщений, новые снизу."},"MessageResponse":{"properties":{"ok":{"type":"boolean","title":"Ok","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"MessageResponse","description":"Короткий ответ на действие без содержимого."},"MessageSend":{"properties":{"text":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Text"},"upload_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Upload Id"},"reply_to_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reply To Id"},"listing_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Listing Id","description":"Карточка объекта над сообщением (Р-484): гость пишет с объявления. Только в переписке с бизнесом и только объект этого бизнеса — иначе `400 validation_error`"}},"additionalProperties":false,"type":"object","title":"MessageSend","description":"Отправка сообщения. Файл сначала загружается отдельным запросом."},"Money":{"properties":{"minor":{"type":"integer","title":"Minor","description":"Сумма в минимальных единицах: 50000 = ฿500"},"currency":{"type":"string","title":"Currency"}},"type":"object","required":["minor","currency"],"title":"Money"},"MoneyBody":{"properties":{"minor":{"type":"integer","title":"Minor"},"currency":{"type":"string","title":"Currency"},"formatted":{"type":"string","title":"Formatted"}},"type":"object","required":["minor","currency","formatted"],"title":"MoneyBody","description":"Сумма всегда тремя полями: иначе клиент округлит её по-своему."},"MyReviews":{"properties":{"written":{"items":{"$ref":"#/components/schemas/ReviewBody"},"type":"array","title":"Written"},"received":{"items":{"$ref":"#/components/schemas/ReviewBody"},"type":"array","title":"Received"}},"type":"object","title":"MyReviews","description":"Мои отзывы и отзывы обо мне — на одном экране, как в кабинете."},"NoteCreate":{"properties":{"title":{"type":"string","maxLength":200,"title":"Title"},"text":{"type":"string","maxLength":5100,"title":"Text","default":""},"ref":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Ref","description":"Привязка: `{kind: booking | plan | listing, id}`"},"pinned":{"type":"boolean","title":"Pinned","default":false}},"type":"object","required":["title"],"title":"NoteCreate"},"NotePatch":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Title"},"text":{"anyOf":[{"type":"string","maxLength":5100},{"type":"null"}],"title":"Text"},"ref":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Ref"},"pinned":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Pinned"}},"type":"object","title":"NotePatch","description":"Меняется только присланное; `ref: null` снимает привязку."},"NotificationBody":{"properties":{"id":{"type":"integer","title":"Id"},"type":{"type":"string","title":"Type"},"title_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title Key"},"body_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Key"},"params":{"additionalProperties":true,"type":"object","title":"Params"},"entity_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Kind"},"entity_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Entity Id"},"read_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Read At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","type","created_at"],"title":"NotificationBody"},"NotificationPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/NotificationBody"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"},"has_more":{"type":"boolean","title":"Has More","default":false},"unread":{"type":"integer","title":"Unread","description":"Сколько непрочитанных всего","default":0}},"type":"object","required":["items"],"title":"NotificationPage"},"OfferAnswer":{"properties":{"block_id":{"type":"string","maxLength":40,"minLength":1,"title":"Block Id","description":"`id` блока предложения"},"action":{"type":"string","title":"Action","description":"accept — принять, skip — отказаться"},"local_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Local Time","description":"Другое время уведомления, `ГГГГ-ММ-ДДTЧЧ:ММ` в поясе места"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone","description":"Пояс другого времени"},"title":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Title","description":"Поправленный заголовок"},"text":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Text","description":"Поправленный текст"}},"type":"object","required":["block_id","action"],"title":"OfferAnswer","description":"Ответ на предложение помощника (Р-449): «Поставить», «Сохранить» — или крестик."},"Office":{"properties":{"name":{"type":"string","title":"Name"},"address":{"type":"string","title":"Address"},"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"google_maps_url":{"type":"string","title":"Google Maps Url"},"yandex_maps_url":{"type":"string","title":"Yandex Maps Url"},"hours":{"$ref":"#/components/schemas/OfficeHours"}},"type":"object","required":["name","address","lat","lon","google_maps_url","yandex_maps_url","hours"],"title":"Office"},"OfficeHours":{"properties":{"days":{"type":"string","title":"Days","description":"Дни работы: `daily` — каждый день"},"opens":{"type":"string","title":"Opens","description":"Открывается, «ЧЧ:ММ» по поясу офиса","examples":["10:00"]},"closes":{"type":"string","title":"Closes","description":"Закрывается, «ЧЧ:ММ» по поясу офиса","examples":["15:00"]},"timezone":{"type":"string","title":"Timezone","description":"Пояс офиса","examples":["Asia/Bangkok"]},"utc_offset":{"type":"string","title":"Utc Offset","description":"Пометка пояса рядом со временем","examples":["UTC+7"]},"text":{"type":"string","title":"Text","description":"Готовая строка на языке запроса","examples":["Каждый день 10:00–15:00"]}},"type":"object","required":["days","opens","closes","timezone","utc_offset","text"],"title":"OfficeHours","description":"Часы работы офиса — в его поясе (правило №16, нехватка №41)."},"OwnRestriction":{"properties":{"type":{"type":"string","title":"Type"},"reason_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason Code"},"starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["type"],"title":"OwnRestriction","description":"Действующее ограничение — как его видит сам человек (находка №279)."},"PartnerCard":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"display_name":{"type":"string","title":"Display Name"},"kind":{"type":"string","title":"Kind","description":"company или individual"},"business_kind":{"type":"string","title":"Business Kind","description":"Категория аккаунта: stay / experience / service"},"about":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"About"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"verified":{"type":"boolean","title":"Verified","description":"Документы бизнеса проверены модерацией","default":false},"since":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since","description":"Дата начала работы в сервисе"},"rating_avg":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating Avg"},"rating_count":{"type":"integer","title":"Rating Count","default":0},"listings_count":{"type":"integer","title":"Listings Count","default":0},"response_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Response Rate","description":"Доля отвеченных обращений, %"},"response_time_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Response Time Min"},"bookings_done":{"type":"integer","title":"Bookings Done","description":"Сколько поездок состоялось: только завершённые","default":0},"timezone":{"type":"string","title":"Timezone"},"policies":{"items":{"$ref":"#/components/schemas/PolicyBody"},"type":"array","title":"Policies","description":"Условия отмены бизнеса: основная и сезонные (Р-215). Отменяемость — часть выбора, и знать её надо до брони, а не на кнопке оплаты"}},"type":"object","required":["id","display_name","kind","business_kind","timezone"],"title":"PartnerCard","description":"Бизнес глазами гостя."},"PartnerPage":{"properties":{"partner":{"$ref":"#/components/schemas/PartnerCard"},"listings":{"items":{"$ref":"#/components/schemas/app__schemas__search__ListingCard"},"type":"array","title":"Listings"}},"type":"object","required":["partner"],"title":"PartnerPage","description":"Карточка бизнеса вместе с его объектами.\n\nОдним ответом, а не двумя запросами: страница без объектов — это пустая\nстраница, и показывать её отдельно незачем."},"PartnerReviews":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ReviewBody"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"},"has_more":{"type":"boolean","title":"Has More","default":false}},"type":"object","title":"PartnerReviews","description":"Отзывы по всем объектам бизнеса, курсором."},"PasswordChangeRequest":{"properties":{"current_password":{"type":"string","maxLength":128,"minLength":1,"title":"Current Password"},"new_password":{"type":"string","maxLength":128,"minLength":8,"title":"New Password"}},"type":"object","required":["current_password","new_password"],"title":"PasswordChangeRequest","description":"Смена пароля изнутри аккаунта."},"PasswordResetConfirm":{"properties":{"token":{"type":"string","maxLength":128,"minLength":32,"title":"Token"},"password":{"type":"string","maxLength":128,"minLength":8,"title":"Password"}},"type":"object","required":["token","password"],"title":"PasswordResetConfirm","description":"Установка нового пароля по ссылке из письма."},"PasswordResetRequest":{"properties":{"captcha_id":{"type":"string","maxLength":64,"title":"Captcha Id","default":""},"captcha_answer":{"type":"string","maxLength":16,"title":"Captcha Answer","default":""},"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"PasswordResetRequest","description":"Запрос ссылки на смену пароля."},"PaymentResult":{"properties":{"paid":{"type":"boolean","title":"Paid"},"booking_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Booking Id"},"payment_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Status"}},"type":"object","required":["paid"],"title":"PaymentResult"},"PaymentStart":{"properties":{"return_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Return Url","description":"Адрес возврата. Пустой — вернём на карточку брони в вебе"},"policy_accepted":{"type":"boolean","title":"Policy Accepted","description":"Гость видел условия отмены и согласился с ними","default":true}},"type":"object","title":"PaymentStart","description":"Куда вернуть человека после банка — и видел ли он условия отмены."},"PaymentStarted":{"properties":{"payment_id":{"type":"string","title":"Payment Id"},"url":{"type":"string","title":"Url","description":"Страница банка — сюда уводят человека"},"status":{"type":"string","title":"Status"}},"type":"object","required":["payment_id","url","status"],"title":"PaymentStarted"},"PendingBooking":{"properties":{"booking_id":{"type":"string","format":"uuid","title":"Booking Id"},"listing_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Listing Id"},"listing_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Listing Title"},"date_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date From"},"date_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date To"},"review_until":{"type":"string","format":"date-time","title":"Review Until","description":"Докуда принимается отзыв"}},"type":"object","required":["booking_id","review_until"],"title":"PendingBooking","description":"Бронь, по которой ещё можно написать отзыв."},"PlaceCardResponse":{"properties":{"id":{"type":"integer","title":"Id"},"parent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Id"},"level":{"type":"string","title":"Level"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"listings_count":{"type":"integer","title":"Listings Count","description":"Объектов, привязанных к самому месту"},"listings_total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Listings Total","description":"Объектов вместе со всем, что внутри. Заполняется только при `with_totals=true`: у региона собственных объявлений обычно нет, и без этого числа список регионов выглядит пустым"},"name_full":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Full"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"center":{"anyOf":[{"$ref":"#/components/schemas/PlacePoint"},{"type":"null"}]},"path":{"items":{"$ref":"#/components/schemas/PlaceResponse"},"type":"array","title":"Path","default":[]},"children":{"items":{"$ref":"#/components/schemas/PlaceResponse"},"type":"array","title":"Children","default":[]},"counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Counts","default":{}}},"type":"object","required":["id","level","slug","name","listings_count"],"title":"PlaceCardResponse","description":"Направление целиком: страница «жильё на Пхукете», а не строка справочника.\n\n`path` — путь сверху вниз без самого места: «Таиланд → Пхукет». Без него\nстраница висит в выдаче без контекста, а «Ката» есть не только на Пхукете.\n\n`counts` считается **вместе со всем, что внутри**: у «Пхукета» без\nвложенных мест вышел бы ноль там, где на самом деле сотни объектов."},"PlacePoint":{"properties":{"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"}},"type":"object","required":["lat","lon"],"title":"PlacePoint","description":"Центр направления — стартовая точка карты раздела."},"PlaceResponse":{"properties":{"id":{"type":"integer","title":"Id"},"parent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Id"},"level":{"type":"string","title":"Level"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"listings_count":{"type":"integer","title":"Listings Count","description":"Объектов, привязанных к самому месту"},"listings_total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Listings Total","description":"Объектов вместе со всем, что внутри. Заполняется только при `with_totals=true`: у региона собственных объявлений обычно нет, и без этого числа список регионов выглядит пустым"}},"type":"object","required":["id","level","slug","name","listings_count"],"title":"PlaceResponse","description":"Место справочника на языке запроса."},"PlaceSuggestion":{"properties":{"id":{"type":"integer","title":"Id"},"slug":{"type":"string","title":"Slug"},"level":{"type":"string","title":"Level"},"name":{"type":"string","title":"Name"},"listings_count":{"type":"integer","title":"Listings Count"}},"type":"object","required":["id","slug","level","name","listings_count"],"title":"PlaceSuggestion"},"PlanCreate":{"properties":{"title":{"type":"string","maxLength":200,"title":"Title"},"date_from":{"type":"string","title":"Date From","description":"Первый день, ГГГГ-ММ-ДД, в поясе места"},"date_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date To","description":"Последний день; пусто — один день"},"note":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Note"},"items":{"items":{"additionalProperties":true,"type":"object"},"type":"array","maxItems":100,"title":"Items"}},"type":"object","required":["title","date_from"],"title":"PlanCreate"},"PlanPatch":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Title"},"date_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date From"},"date_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date To"},"note":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Note"}},"type":"object","title":"PlanPatch"},"PolicyBody":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"season_from":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Season From"},"season_to":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Season To"},"terms":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Terms","description":"Оговорки словами: сезон, перенос дат, залог"},"free_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Free Days","description":"За сколько суток отмена бесплатна; null — бесплатной нет"},"rules":{"items":{"$ref":"#/components/schemas/PolicyRuleBody"},"type":"array","title":"Rules","default":[]}},"type":"object","title":"PolicyBody","description":"Условия отмены, с которыми гость согласился при оплате (Р-204).\n\nПриходят **снимком из брони**, а не из объекта: партнёр вправе переписать\nполитику завтра, а человек соглашался с сегодняшней — и видел он именно её.\n\nСезон — день и месяц числом `MMDD` (20 декабря это `1220`), без года: он\nповторяется каждый год. Пусто — основные условия бизнеса."},"PolicyRuleBody":{"properties":{"days_before":{"type":"integer","title":"Days Before"},"refund_percent":{"type":"integer","title":"Refund Percent"}},"type":"object","required":["days_before","refund_percent"],"title":"PolicyRuleBody","description":"Порог политики: за столько-то суток возвращается столько-то."},"PriceRangeResponse":{"properties":{"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"min_minor":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Minor"},"max_minor":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Minor"},"histogram":{"items":{"type":"integer"},"type":"array","title":"Histogram","description":"Сколько объектов в каждом из 24 отрезков шкалы ползунка: шкала квадратичная от нуля (ручка в положении p означает цену max_minor · p²), отрезок i — p от i/24 до (i+1)/24. Пусто, когда цен нет"}},"type":"object","title":"PriceRangeResponse","description":"Границы ползунка цены раздела (Р-275) — в минорных единицах `currency`.\n\nПусто (`null`), когда в разделе нет ни одной цены, которую можно\nпересчитать в эту валюту: ползунку тогда не из чего строить шкалу."},"PriceResponse":{"properties":{"entry":{"type":"string","title":"Entry","description":"`free` — свободный вход, `paid` — платный","examples":["paid"]},"amount_minor":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Amount Minor","description":"Цена «от» в минорных единицах; у свободного входа — `null`, не ноль","examples":[50000]},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency","description":"Код валюты цены","examples":["THB"]},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note","description":"Что числом не выражается: «с депозитом на бар»","examples":["Уличная еда — от ฿40"]}},"type":"object","required":["entry"],"title":"PriceResponse","description":"Вход: свободный или платный.\n\n`amount_minor` в минорных единицах — как везде в проекте. `note` — то, что\nчислом не выражается («с депозитом на бар»), и стоит рядом с ценой, а не\nвместо неё."},"ProfileResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"email_confirmed":{"type":"boolean","title":"Email Confirmed"},"status":{"type":"string","title":"Status"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"birth_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Birth Date"},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"phone_confirmed":{"type":"boolean","title":"Phone Confirmed"},"citizenship":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Citizenship"},"residence_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Residence Country"},"billing_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Address"},"emergency_contact":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emergency Contact"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"verification_status":{"type":"string","title":"Verification Status"},"verified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Verified At"},"notify_push":{"type":"boolean","title":"Notify Push"},"notify_email":{"type":"boolean","title":"Notify Email"},"notify_marketing":{"type":"boolean","title":"Notify Marketing"},"bookings_count":{"type":"integer","title":"Bookings Count"},"rating_avg":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating Avg"},"rating_count":{"type":"integer","title":"Rating Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"restrictions":{"items":{"$ref":"#/components/schemas/OwnRestriction"},"type":"array","title":"Restrictions"}},"type":"object","required":["id","email","email_confirmed","status","first_name","last_name","avatar_url","birth_date","gender","phone","phone_confirmed","citizenship","residence_country","billing_address","emergency_contact","language","currency","verification_status","verified_at","notify_push","notify_email","notify_marketing","bookings_count","rating_avg","rating_count","created_at"],"title":"ProfileResponse","description":"Профиль как его видит сам пользователь."},"ProfileUpdateRequest":{"properties":{"first_name":{"anyOf":[{"type":"string","maxLength":50,"minLength":1},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string","maxLength":50,"minLength":1},{"type":"null"}],"title":"Last Name"},"birth_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Birth Date"},"gender":{"anyOf":[{"type":"string","pattern":"^(male|female|other)$"},{"type":"null"}],"title":"Gender"},"phone":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Phone"},"citizenship":{"anyOf":[{"type":"string","maxLength":2,"minLength":2},{"type":"null"}],"title":"Citizenship"},"residence_country":{"anyOf":[{"type":"string","maxLength":2,"minLength":2},{"type":"null"}],"title":"Residence Country"},"billing_address":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Billing Address"},"emergency_contact":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Emergency Contact"},"language":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Language"},"currency":{"anyOf":[{"type":"string","maxLength":3,"minLength":3},{"type":"null"}],"title":"Currency"},"notify_push":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify Push"},"notify_email":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify Email"},"notify_marketing":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify Marketing"}},"type":"object","title":"ProfileUpdateRequest","description":"Правка профиля. Незаданные поля не трогаются.\n\nОтличать «не передали» от «передали пусто» обязательно: иначе форма,\nотправляющая только изменённое поле, стирала бы всё остальное.\nПоэтому здесь `model_fields_set`, а не значения по умолчанию."},"PushPrefGroup":{"properties":{"group":{"type":"string","title":"Group","description":"Группа в настройках: bookings, payments, security…"},"items":{"items":{"$ref":"#/components/schemas/PushPrefItem"},"type":"array","title":"Items"}},"type":"object","required":["group","items"],"title":"PushPrefGroup"},"PushPrefItem":{"properties":{"code":{"type":"string","title":"Code","description":"Код пуша из реестра, `docs/push.md` §3"},"enabled":{"type":"boolean","title":"Enabled"},"default":{"type":"boolean","title":"Default","description":"Включён ли он у нового аккаунта"}},"type":"object","required":["code","enabled","default"],"title":"PushPrefItem"},"PushPrefsBody":{"properties":{"enabled":{"type":"boolean","title":"Enabled","description":"Общий выключатель: выключен — не уходит ни один пуш"},"groups":{"items":{"$ref":"#/components/schemas/PushPrefGroup"},"type":"array","title":"Groups"}},"type":"object","required":["enabled","groups"],"title":"PushPrefsBody","description":"Пуши человека: общий выключатель и галочки по группам (Р-424)."},"PushPrefsUpdate":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"prefs":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Prefs"}},"type":"object","title":"PushPrefsUpdate","description":"Что поменять: выключатель и/или галочки `{код: да/нет}`.\n\nНезнакомый код или пуш, не положенный по правам, — `400 push_pref_unknown`."},"QuoteLine":{"properties":{"code":{"type":"string","title":"Code"},"title":{"type":"string","title":"Title"},"amount":{"$ref":"#/components/schemas/MoneyBody"},"qty":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Qty"},"unit":{"anyOf":[{"$ref":"#/components/schemas/MoneyBody"},{"type":"null"}]},"days":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Days"},"notes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["code","title","amount"],"title":"QuoteLine","description":"Строка расчёта. У ночей их столько, сколько наборов правил в сроке."},"QuoteRequest":{"properties":{"date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"},"date_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To"},"slot_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Slot Id"},"guests":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Guests","default":1},"rates":{"items":{"$ref":"#/components/schemas/RatePick"},"type":"array","maxItems":20,"title":"Rates"},"extras":{"items":{"$ref":"#/components/schemas/ExtraPick"},"type":"array","maxItems":20,"title":"Extras"}},"type":"object","title":"QuoteRequest","description":"Запрос расчёта: у жилья — даты, у впечатления и услуги — выход."},"QuoteResponse":{"properties":{"available":{"type":"boolean","title":"Available"},"currency":{"type":"string","title":"Currency"},"nights":{"type":"integer","title":"Nights"},"lines":{"items":{"$ref":"#/components/schemas/QuoteLine"},"type":"array","title":"Lines"},"total":{"$ref":"#/components/schemas/MoneyBody"},"deposit":{"anyOf":[{"$ref":"#/components/schemas/MoneyBody"},{"type":"null"}]},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"dates_unavailable / min_nights / max_nights / too_far / slot_closed / not_enough_seats / slot_taken / table_too_small"},"conflict_dates":{"anyOf":[{"items":{"type":"string","format":"date"},"type":"array"},{"type":"null"}],"title":"Conflict Dates"},"min_nights":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Nights"}},"type":"object","required":["available","currency","nights","lines","total"],"title":"QuoteResponse","description":"Расчёт. При `available: false` смотрят `reason` и подробности к нему."},"RateBody":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"code":{"type":"string","title":"Code"},"title":{"type":"string","title":"Title"},"price_minor":{"type":"integer","title":"Price Minor"},"is_base":{"type":"boolean","title":"Is Base"},"sort":{"type":"integer","title":"Sort"}},"type":"object","required":["id","code","title","price_minor","is_base","sort"],"title":"RateBody","description":"Тариф объекта: «Взрослый», «Ребёнок», «Всё включено» (Р-293)."},"RatePick":{"properties":{"rate_id":{"type":"string","format":"uuid","title":"Rate Id"},"qty":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Qty"}},"type":"object","required":["rate_id","qty"],"title":"RatePick","description":"Сколько мест какого тарифа берёт гость (Р-293).\n\nЦена в запросе не участвует: её берут из базы. Иначе взрослый билет за\nодин бат смог бы купить кто угодно, кто умеет править форму."},"RefreshRequest":{"properties":{"refresh_token":{"type":"string","maxLength":128,"minLength":32,"title":"Refresh Token"}},"type":"object","required":["refresh_token"],"title":"RefreshRequest","description":"Обмен refresh-токена на новую пару."},"RefundBody":{"properties":{"amount":{"$ref":"#/components/schemas/MoneyBody"},"percent":{"type":"integer","title":"Percent"},"free":{"type":"boolean","title":"Free","description":"Отмена попала в бесплатное окно"},"reason":{"type":"string","title":"Reason","description":"free_window / policy / cancelled_by_partner"},"days_until":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Until","description":"Суток до заезда в поясе объекта"},"free_cancel_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Free Cancel Until"},"policy":{"anyOf":[{"$ref":"#/components/schemas/PolicyBody"},{"type":"null"}]},"policy_seasonal":{"type":"boolean","title":"Policy Seasonal","description":"Сейчас действуют сезонные условия, а не основные (Р-204)","default":false}},"type":"object","required":["amount","percent","free","reason"],"title":"RefundBody"},"RegionInfo":{"properties":{"id":{"type":"integer","title":"Id"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"path":{"items":{"type":"string"},"type":"array","title":"Path","description":"От страны к региону"}},"type":"object","required":["id","slug","name"],"title":"RegionInfo","description":"Регион афиши: «Пхукет · Таиланд» на первом экране (Р-459)."},"RegisterRequest":{"properties":{"captcha_id":{"type":"string","maxLength":64,"title":"Captcha Id","default":""},"captcha_answer":{"type":"string","maxLength":16,"title":"Captcha Answer","default":""},"first_name":{"type":"string","maxLength":50,"minLength":1,"title":"First Name"},"last_name":{"type":"string","maxLength":50,"minLength":1,"title":"Last Name"},"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":128,"minLength":8,"title":"Password"},"accept_terms":{"type":"boolean","title":"Accept Terms","description":"Согласие с условиями — без него регистрации нет"},"marketing_opt_in":{"type":"boolean","title":"Marketing Opt In","description":"Согласие на рассылки. По умолчанию выключено","default":false}},"type":"object","required":["first_name","last_name","email","password","accept_terms"],"title":"RegisterRequest","description":"Регистрация: имя, фамилия, почта, пароль."},"ReminderCreate":{"properties":{"local":{"type":"string","title":"Local","description":"Дата и время в поясе места: 2026-11-13T07:30"},"text":{"type":"string","maxLength":600,"title":"Text"},"tz":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tz","description":"Пояс места; пусто — Asia/Bangkok"},"plan_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Plan Id"}},"type":"object","required":["local","text"],"title":"ReminderCreate"},"ReminderPatch":{"properties":{"local":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Local"},"text":{"anyOf":[{"type":"string","maxLength":600},{"type":"null"}],"title":"Text"}},"type":"object","title":"ReminderPatch"},"RentalBody":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"booking_id":{"type":"string","format":"uuid","title":"Booking Id"},"stage":{"type":"string","title":"Stage","description":"negotiating / awaiting_document / awaiting_signatures / signed / cancelled. living / handover / completed — стадии прежнего пути: встречаются у договоров, закрытых до Р-194, и новыми не становятся"},"months":{"type":"integer","title":"Months"},"price_minor":{"type":"integer","title":"Price Minor"},"deposit_minor":{"type":"integer","title":"Deposit Minor"},"currency":{"type":"string","title":"Currency"},"document_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Name"},"document_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Document Size"},"has_document":{"type":"boolean","title":"Has Document","default":false},"guest_signed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Guest Signed At"},"partner_signed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Partner Signed At"},"sign_deadline_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Sign Deadline At"},"sign_expired":{"type":"boolean","title":"Sign Expired","description":"Срок вышел: подпись больше не принимается","default":false},"deposit_paid_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deposit Paid At"},"settled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Settled At"},"cancelled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Cancelled At"},"cancel_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancel Reason"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"terminated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Terminated At"},"terminated_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Terminated By","description":"guest / partner"},"terminate_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Terminate Reason"},"handover_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Handover At"}},"type":"object","required":["id","booking_id","stage","months","price_minor","deposit_minor","currency"],"title":"RentalBody","description":"Состояние сделки."},"RentalBrief":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"booking_id":{"type":"string","format":"uuid","title":"Booking Id"},"stage":{"type":"string","title":"Stage","description":"negotiating / awaiting_document / awaiting_signatures / signed / cancelled. living / handover / completed — стадии прежнего пути: встречаются у договоров, закрытых до Р-194, и новыми не становятся"},"months":{"type":"integer","title":"Months"},"price_minor":{"type":"integer","title":"Price Minor"},"deposit_minor":{"type":"integer","title":"Deposit Minor"},"currency":{"type":"string","title":"Currency"},"document_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Name"},"document_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Document Size"},"has_document":{"type":"boolean","title":"Has Document","default":false},"guest_signed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Guest Signed At"},"partner_signed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Partner Signed At"},"sign_deadline_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Sign Deadline At"},"sign_expired":{"type":"boolean","title":"Sign Expired","description":"Срок вышел: подпись больше не принимается","default":false},"deposit_paid_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deposit Paid At"},"settled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Settled At"},"cancelled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Cancelled At"},"cancel_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancel Reason"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"terminated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Terminated At"},"terminated_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Terminated By","description":"guest / partner"},"terminate_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Terminate Reason"},"handover_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Handover At"},"code":{"type":"string","title":"Code"},"listing_id":{"type":"string","format":"uuid","title":"Listing Id"},"listing_title":{"type":"string","title":"Listing Title"},"listing_slug":{"type":"string","title":"Listing Slug"},"listing_photo":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Listing Photo","description":"Первый снимок объекта размерами `thumb`/`medium`/`large` (нехватка №44)"},"partner_name":{"type":"string","title":"Partner Name"},"partner_legal_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partner Legal Name"},"date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"},"date_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To"},"waiting_for":{"type":"string","title":"Waiting For","description":"guest / partner / none — чей сейчас ход"},"price":{"anyOf":[{"$ref":"#/components/schemas/MoneyBody"},{"type":"null"}]},"deposit":{"anyOf":[{"$ref":"#/components/schemas/MoneyBody"},{"type":"null"}]}},"type":"object","required":["id","booking_id","stage","months","price_minor","deposit_minor","currency","code","listing_id","listing_title","listing_slug","partner_name","waiting_for"],"title":"RentalBrief","description":"Сделка в списке гостя."},"RentalCancel":{"properties":{"reason":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Reason"}},"type":"object","title":"RentalCancel"},"RentalDetail":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"booking_id":{"type":"string","format":"uuid","title":"Booking Id"},"stage":{"type":"string","title":"Stage","description":"negotiating / awaiting_document / awaiting_signatures / signed / cancelled. living / handover / completed — стадии прежнего пути: встречаются у договоров, закрытых до Р-194, и новыми не становятся"},"months":{"type":"integer","title":"Months"},"price_minor":{"type":"integer","title":"Price Minor"},"deposit_minor":{"type":"integer","title":"Deposit Minor"},"currency":{"type":"string","title":"Currency"},"document_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Name"},"document_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Document Size"},"has_document":{"type":"boolean","title":"Has Document","default":false},"guest_signed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Guest Signed At"},"partner_signed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Partner Signed At"},"sign_deadline_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Sign Deadline At"},"sign_expired":{"type":"boolean","title":"Sign Expired","description":"Срок вышел: подпись больше не принимается","default":false},"deposit_paid_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deposit Paid At"},"settled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Settled At"},"cancelled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Cancelled At"},"cancel_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancel Reason"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"terminated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Terminated At"},"terminated_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Terminated By","description":"guest / partner"},"terminate_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Terminate Reason"},"handover_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Handover At"},"code":{"type":"string","title":"Code"},"listing_id":{"type":"string","format":"uuid","title":"Listing Id"},"listing_title":{"type":"string","title":"Listing Title"},"listing_slug":{"type":"string","title":"Listing Slug"},"listing_photo":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Listing Photo","description":"Первый снимок объекта размерами `thumb`/`medium`/`large` (нехватка №44)"},"partner_name":{"type":"string","title":"Partner Name"},"partner_legal_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partner Legal Name"},"date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"},"date_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To"},"waiting_for":{"type":"string","title":"Waiting For","description":"guest / partner / none — чей сейчас ход"},"price":{"anyOf":[{"$ref":"#/components/schemas/MoneyBody"},{"type":"null"}]},"deposit":{"anyOf":[{"$ref":"#/components/schemas/MoneyBody"},{"type":"null"}]},"thread_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Thread Id"},"can_sign":{"type":"boolean","title":"Can Sign","default":false},"stages":{"items":{"type":"string"},"type":"array","title":"Stages","description":"Стадии в порядке жизни"},"snapshot":{"additionalProperties":true,"type":"object","title":"Snapshot"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"confirmed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Confirmed At"},"payment_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Status"},"guest_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Guest Name"},"total":{"anyOf":[{"$ref":"#/components/schemas/MoneyBody"},{"type":"null"}]}},"type":"object","required":["id","booking_id","stage","months","price_minor","deposit_minor","currency","code","listing_id","listing_title","listing_slug","partner_name","waiting_for"],"title":"RentalDetail","description":"Сделка целиком."},"RentalPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/RentalBrief"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"RentalPage"},"ReplyBody":{"properties":{"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"At"}},"type":"object","title":"ReplyBody"},"ReportAccepted":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"status":{"type":"string","title":"Status"},"repeated":{"type":"boolean","title":"Repeated"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","status","repeated","created_at"],"title":"ReportAccepted","description":"Ответ: жалоба принята. `repeated` — такая уже ждёт разбора, счётчик вырос."},"ReportCreate":{"properties":{"target_kind":{"type":"string","enum":["listing","partner","review"],"title":"Target Kind"},"target_id":{"type":"string","format":"uuid","title":"Target Id"},"reason_code":{"type":"string","maxLength":40,"minLength":1,"title":"Reason Code"},"comment":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Comment"}},"type":"object","required":["target_kind","target_id","reason_code"],"title":"ReportCreate","description":"Жалоба: на что, почему и, если нужно, подробности."},"ReportReason":{"properties":{"code":{"type":"string","title":"Code"},"title":{"type":"string","title":"Title"},"comment_required":{"type":"boolean","title":"Comment Required"}},"type":"object","required":["code","title","comment_required"],"title":"ReportReason","description":"Одна причина справочника — код и название на языке запроса."},"ReviewBody":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"booking_id":{"type":"string","format":"uuid","title":"Booking Id"},"author_kind":{"type":"string","title":"Author Kind"},"listing_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Listing Id"},"rating":{"type":"integer","title":"Rating"},"scores":{"additionalProperties":{"type":"integer"},"type":"object","title":"Scores"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"status":{"type":"string","title":"Status"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"reply":{"anyOf":[{"$ref":"#/components/schemas/ReplyBody"},{"type":"null"}]},"author_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Name","description":"Имя автора — без фамилии"},"author_avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Avatar Url"},"listing_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Listing Title"},"listing_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Listing Slug","description":"Чтобы из списка отзывов открыть сам объект"},"listing_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Listing Kind","description":"Категория объекта: по ней форма правки выбирает критерии оценки (находка №193) — у выхода не спрашивают ни чистоту, ни заезд"},"can_edit":{"type":"boolean","title":"Can Edit","description":"Править можно, пока отзыв не опубликован: раскрытие слепое","default":false},"can_delete":{"type":"boolean","title":"Can Delete","description":"Свой отзыв автор вправе снять всегда","default":false}},"type":"object","required":["id","booking_id","author_kind","rating","status","created_at"],"title":"ReviewBody"},"ReviewCreate":{"properties":{"booking_id":{"type":"string","format":"uuid","title":"Booking Id"},"rating":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Rating","description":"Общая оценка 1–5"},"scores":{"additionalProperties":{"type":"integer"},"type":"object","title":"Scores","description":"Оценки по критериям; чужие критерии отбрасываются молча"},"text":{"anyOf":[{"type":"string","maxLength":3000},{"type":"null"}],"title":"Text"}},"additionalProperties":false,"type":"object","required":["booking_id","rating"],"title":"ReviewCreate"},"ReviewUpdate":{"properties":{"rating":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Rating","description":"Общая оценка 1–5"},"scores":{"additionalProperties":{"type":"integer"},"type":"object","title":"Scores"},"text":{"anyOf":[{"type":"string","maxLength":3000},{"type":"null"}],"title":"Text"}},"additionalProperties":false,"type":"object","required":["rating"],"title":"ReviewUpdate","description":"Правка своего отзыва. Бронь не меняется — меняются слова о ней."},"SavePlanRequest":{"properties":{"block":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Block","description":"Номер блока `itinerary` в сообщении; пусто — первый"}},"type":"object","title":"SavePlanRequest"},"ScheduleResponse":{"properties":{"schedule":{"type":"string","title":"Schedule","description":"`once` — разовое (дни с `date_from` по `date_to`), `weekly` — по дням недели","examples":["weekly"]},"weekdays":{"items":{"type":"integer"},"type":"array","title":"Weekdays","description":"Дни недели по ISO: 1 — понедельник … 7 — воскресенье","examples":[[4]]},"every_day":{"type":"boolean","title":"Every Day","description":"Каждый день — подпись «каждый день» вместо перечня","default":false},"date_from":{"type":"string","format":"date","title":"Date From","description":"Первый день в поясе площадки"},"date_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To","description":"Последний день; `null` — без конца"}},"type":"object","required":["schedule","date_from"],"title":"ScheduleResponse","description":"Расписание в виде данных, а не готовой строки.\n\nПодпись («каждый вторник», «22–24 сентября») собирает клиент из своих\nлокалей: склонение дней недели на четырёх языках разное, и собранная\nздесь строка приехала бы тайцу по-русски."},"SearchFiltersRequest":{"properties":{"stay":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Stay"},"experience":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Experience"},"service":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Service"},"map_view":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Map View"}},"type":"object","title":"SearchFiltersRequest","description":"Фильтры поиска, сохраняемые **по разделам** (Р-017).\n\nРаздельно не для порядка: фильтры жилья и услуг не совпадают ни одним\nполем, и общий набор означал бы, что переключение вкладки сбрасывает\nнастройки соседней."},"SearchFiltersResponse":{"properties":{"stay":{"additionalProperties":true,"type":"object","title":"Stay"},"experience":{"additionalProperties":true,"type":"object","title":"Experience"},"service":{"additionalProperties":true,"type":"object","title":"Service"},"map_view":{"additionalProperties":true,"type":"object","title":"Map View"}},"type":"object","title":"SearchFiltersResponse","description":"Сохранённые фильтры и последняя область карты."},"SearchLimits":{"properties":{"max_limit":{"type":"integer","title":"Max Limit"},"max_map_points":{"type":"integer","title":"Max Map Points"}},"type":"object","required":["max_limit","max_map_points"],"title":"SearchLimits"},"SendRequest":{"properties":{"text":{"type":"string","maxLength":4000,"title":"Text","default":""},"file_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"File Ids","description":"Загруженные файлы, до 10"},"voice_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Voice Id","description":"Загруженное голосовое"},"location":{"anyOf":[{"$ref":"#/components/schemas/Location"},{"type":"null"}],"description":"«Моё местоположение»"},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode","description":"interpret — голосовое собеседника для переводчика (Р-429), вместе с voice_id"}},"type":"object","title":"SendRequest"},"SeoTags":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"h1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H1"},"og_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Og Title"},"og_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Og Description"},"keywords":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keywords"}},"type":"object","title":"SeoTags","description":"Теги страницы события на языке гостя (Р-286).\n\nИх не пишет никто: они целиком сочиняются из текста и фактов события —\nтак же, как у страницы объекта. Клиенту они нужны для `<title>`,\n`description` и OG-превью, и это единственное место, откуда их взять."},"SessionPlace":{"properties":{"state":{"type":"string","enum":["pending","known","unknown"],"title":"State","description":"known — узнали (без города — только страна); unknown — сервис не знает, адрес частный или попытки кончились: «Место не определено»; pending — ещё узнаём: «Определяем место…»"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code","description":"ISO 3166-1, две буквы: по нему флаг и имя страны на языке интерфейса"},"country_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Name","description":"Имя страны по-английски — запасное, когда назвать по коду нечем"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region","description":"Регион — как отдал сервис, по-английски"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City","description":"Город — как отдал сервис, по-английски"}},"type":"object","required":["state"],"title":"SessionPlace","description":"Место входа по адресу (Р-483)."},"SessionResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"device_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Model"},"app_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Version"},"ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"current":{"type":"boolean","title":"Current","description":"Та самая сессия, из которой пришёл запрос"},"place":{"$ref":"#/components/schemas/SessionPlace","description":"Место входа по адресу (Р-483)"}},"type":"object","required":["id","platform","device_model","app_version","ip","created_at","last_used_at","expires_at","current","place"],"title":"SessionResponse","description":"Устройство в списке сессий."},"SettingsRequest":{"properties":{"proactive":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Proactive","description":"all · trips · off"},"voice":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice","description":"female · male (Р-429)"},"voice_reply":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Voice Reply","description":"Отвечать голосом на голосовое (Р-429)"},"ask_location":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ask Location","description":"Можно ли спрашивать точное местоположение (Р-432)"}},"type":"object","title":"SettingsRequest","description":"Меняется только присланное — остальные настройки остаются."},"SimTariff":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"title":{"type":"string","title":"Title"},"internet":{"type":"string","title":"Internet"},"calls":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Calls"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"days":{"type":"integer","title":"Days","description":"Срок действия в днях"},"price":{"$ref":"#/components/schemas/Money"}},"type":"object","required":["id","title","internet","days","price"],"title":"SimTariff"},"SlotBody":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"starts_at":{"type":"string","format":"date-time","title":"Starts At"},"ends_at":{"type":"string","format":"date-time","title":"Ends At"},"timezone":{"type":"string","title":"Timezone"},"unit_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Unit Id"},"duration_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Min"},"capacity_total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Capacity Total"},"capacity_left":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Capacity Left"},"price_minor":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Minor"},"status":{"type":"string","title":"Status"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"guide_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Guide Name"},"sales_close_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Sales Close At"}},"type":"object","required":["id","starts_at","ends_at","timezone","duration_min","capacity_total","capacity_left","price_minor","status","language","guide_name"],"title":"SlotBody"},"SlotsResponse":{"properties":{"listing_id":{"type":"string","format":"uuid","title":"Listing Id"},"timezone":{"type":"string","title":"Timezone"},"timezone_notice":{"$ref":"#/components/schemas/TimezoneNoticeBody"},"currency":{"type":"string","title":"Currency"},"slots":{"items":{"$ref":"#/components/schemas/SlotBody"},"type":"array","title":"Slots"},"rates":{"items":{"$ref":"#/components/schemas/RateBody"},"type":"array","title":"Rates","default":[]},"extras":{"items":{"$ref":"#/components/schemas/ExtraBody"},"type":"array","title":"Extras","default":[]}},"type":"object","required":["listing_id","timezone","timezone_notice","currency","slots"],"title":"SlotsResponse"},"SpeechRequest":{"properties":{"block":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Block","description":"Номер блока `phrases` или `driver`; пусто — весь ответ"},"item":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Item","description":"Номер фразы в блоке `phrases`"}},"type":"object","title":"SpeechRequest"},"StayFacts":{"properties":{"bedrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bedrooms"},"guests":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Guests"},"area_sqm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Area Sqm"},"beach_m":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Beach M"}},"type":"object","title":"StayFacts","description":"Факты жилья на плитке (Р-459): неизвестное — `null`."},"StayGuestBody":{"properties":{"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"age":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Age"},"birth_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Birth Date"},"citizenship":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Citizenship"},"is_primary":{"type":"boolean","title":"Is Primary","default":false},"has_document":{"type":"boolean","title":"Has Document","default":false}},"type":"object","title":"StayGuestBody","description":"Участник заказа: кто едет.\n\n**Номер документа наружу не отдаётся никогда** — даже владельцу брони: он\nего и так знает, а лишний путь к расшифрованному полю это лишний способ\nего потерять (правило №7). Вместо номера возвращается `has_document` —\nзаполнено или нет.\n\nДату рождения и номер паспорта спрашиваем, только когда партнёр включил\nэто у объекта (Р-320): страховой они нужны, остальным — нет."},"StayGuestIn":{"properties":{"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"age":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Age"},"birth_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Birth Date"},"citizenship":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Citizenship"},"is_primary":{"type":"boolean","title":"Is Primary","default":false},"has_document":{"type":"boolean","title":"Has Document","default":false},"document_number":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Document Number"}},"type":"object","title":"StayGuestIn","description":"То же, но на запись: здесь есть номер документа.\n\nОтдельная модель, а не поле с `exclude`: исключённое поле пропадает и из\n`model_dump()`, то есть номер не доезжал бы до сервиса вовсе — мы на этом\nуже наступили."},"StayGuestsRequest":{"properties":{"guests":{"items":{"$ref":"#/components/schemas/StayGuestIn"},"type":"array","maxItems":50,"title":"Guests"},"contact_phone":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Contact Phone"}},"type":"object","title":"StayGuestsRequest","description":"Список участников целиком (Р-197) — и телефон для связи (Р-352).\n\nЦеликом, а не по одному: список читается как один ответ на вопрос «кто\nприедет», и правка третьей строки без остальных — операция, которой у\nчеловека в голове не существует. Пустые строки отбрасываются; обязательны\nли данные, решает объект (`guest_details`).\n\nТелефон едет в том же запросе: «кто едет и как с ним связаться» — один\nответ, и на карточке брони это одна форма с одной кнопкой. Не передан —\nне меняется."},"SuggestResponse":{"properties":{"places":{"items":{"$ref":"#/components/schemas/PlaceSuggestion"},"type":"array","title":"Places"},"listings":{"items":{"$ref":"#/components/schemas/ListingSuggestion"},"type":"array","title":"Listings"}},"type":"object","title":"SuggestResponse","description":"Подсказки строки поиска: сперва места, потом объекты."},"SupportOpen":{"properties":{"subject":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Subject"},"topic":{"anyOf":[{"type":"string","enum":["booking","payment","listing","account","other"]},{"type":"null"}],"title":"Topic","description":"Тема кодом (Р-476, нехватка №58): ставится и открытому обращению, пока темы нет"}},"additionalProperties":false,"type":"object","title":"SupportOpen","description":"Обращение в поддержку."},"TicketResponse":{"properties":{"ticket":{"type":"string","title":"Ticket"},"code":{"type":"string","title":"Code","description":"Номер брони: печатается рядом с кодом"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"}},"type":"object","required":["ticket","code","expires_at"],"title":"TicketResponse","description":"Билет заселения. Клиент рисует QR сам — картинка с сервера не нужна."},"TimezoneNotice":{"properties":{"timezone":{"type":"string","title":"Timezone","description":"Пояс площадки","examples":["Asia/Bangkok"]},"label":{"type":"string","title":"Label","description":"Готовая пометка пояса — показывать всегда рядом со временем","examples":["по времени Пхукета (UTC+7)"]},"hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hint","description":"Пояснение о разнице с поясом гостя (заголовок `X-Timezone`); только когда пояса различаются"},"differs":{"type":"boolean","title":"Differs","description":"Пояс гостя отличается от пояса площадки","default":false},"guest_timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Guest Timezone","description":"Пояс гостя, если клиент его прислал"}},"type":"object","required":["timezone","label"],"title":"TimezoneNotice","description":"Пояс площадки и разница с поясом гостя (правило №16).\n\n`label` показывается всегда, `hint` — только когда пояс гостя отличается:\nиначе человек прочитает чужое время как своё."},"TimezoneNoticeBody":{"properties":{"timezone":{"type":"string","title":"Timezone"},"offset_minutes":{"type":"integer","title":"Offset Minutes"},"offset":{"type":"string","title":"Offset"},"place_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Place Name"},"differs_from_viewer":{"type":"boolean","title":"Differs From Viewer"},"difference_minutes":{"type":"integer","title":"Difference Minutes"},"viewer_timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Viewer Timezone"},"label":{"type":"string","title":"Label"},"hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hint"}},"type":"object","required":["timezone","offset_minutes","offset","differs_from_viewer","difference_minutes","label"],"title":"TimezoneNoticeBody","description":"Готовая пометка о поясе объекта — клиент показывает её как есть."},"TokenPairResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"type":"string","title":"Refresh Token"},"token_type":{"type":"string","title":"Token Type","default":"Bearer"},"expires_in":{"type":"integer","title":"Expires In","description":"Сколько секунд живёт access-токен"},"session_id":{"type":"string","format":"uuid","title":"Session Id"}},"type":"object","required":["access_token","refresh_token","expires_in","session_id"],"title":"TokenPairResponse","description":"Пара токенов.\n\n`refresh_token` возвращается **один раз** и в базе не хранится: там лежит\nтолько его хеш. Потерял — вход заново."},"UnsubscribeResult":{"properties":{"ok":{"type":"boolean","title":"Ok","default":true},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"Адрес, который отписан"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role","description":"Чей это аккаунт: user, partner, moderator, admin — страница ведёт в его настройки"}},"type":"object","title":"UnsubscribeResult","description":"Итог отписки по подписанной ссылке — без входа в аккаунт."},"UpcomingResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/EventCard"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Курсор следующей страницы; `null` — страниц больше нет"},"has_more":{"type":"boolean","title":"Has More","description":"Есть ли ещё события после этой страницы","default":false},"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total","description":"Сколько событий подходит всего — только при `with_total=true`"}},"type":"object","title":"UpcomingResponse","description":"Ближайшие события — по одному на событие, своим ближайшим днём.\n\nВитрине (ряд на главной, письмо) хватает первой страницы. Лента\n«Событий» без выбранного дня листает дальше по `next_cursor` (Р-465);\n`total` — сколько всего **событий** подходит, если попросили `with_total`."},"UploadResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"type":{"type":"string","title":"Type"},"file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Name"},"file_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"File Size"},"duration_sec":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Sec","description":"Длительность голосового в секундах — измеряется при загрузке"},"waveform":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Waveform","description":"Волна громкости голосового: 48 уровней 0–100 (нехватка №40). Пусто у документа и фото и у голосовых до 15.10.2026"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Только для фотографий: они лежат в публичном бакете. Голос и документы отдаются потоком через /v1/media"}},"type":"object","required":["id","type"],"title":"UploadResponse","description":"Загруженный файл, готовый к отправке в сообщении."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WsTicketResponse":{"properties":{"ticket":{"type":"string","title":"Ticket"},"expires_in":{"type":"integer","title":"Expires In","description":"Сколько секунд билет действителен"}},"type":"object","required":["ticket","expires_in"],"title":"WsTicketResponse","description":"Одноразовый билет на подключение к `/v1/ws`.\n\nТокеном не является и ничего, кроме сокета, не открывает: веб-клиенту\nтокен недоступен вовсе — он живёт в cookie `HttpOnly`."},"app__routers__assistant__ReadRequest":{"properties":{"up_to_id":{"type":"integer","minimum":1.0,"title":"Up To Id"}},"type":"object","required":["up_to_id"],"title":"ReadRequest"},"app__schemas__catalog__CategoryResponse":{"properties":{"id":{"type":"integer","title":"Id"},"parent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Id"},"code":{"type":"string","title":"Code"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"name":{"type":"string","title":"Name"},"listings_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Listings Count","description":"Сколько опубликованных объектов в категории — только с `with_counts=true`"}},"type":"object","required":["id","code","name"],"title":"CategoryResponse","description":"Категория впечатления или услуги."},"app__schemas__chat__ListingCard":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"slug":{"type":"string","title":"Slug"},"kind":{"type":"string","title":"Kind","description":"Раздел: stay · experience · service · transport · food"},"title":{"type":"string","title":"Title","description":"Название на языке запроса"},"photo":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Photo","description":"Первый снимок размерами; `large` может отсутствовать"},"price_from":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Price From","description":"Цена «от»: `minor`, `currency`, `formatted`"}},"type":"object","required":["id","slug","kind","title"],"title":"ListingCard","description":"Карточка объекта над сообщением (Р-484)."},"app__schemas__chat__ReadRequest":{"properties":{"up_to_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Up To Id"}},"type":"object","title":"ReadRequest"},"app__schemas__events__CategoryResponse":{"properties":{"code":{"type":"string","title":"Code","description":"Код для фильтра `category`","examples":["party"]},"name":{"type":"string","title":"Name","description":"Название на языке запроса","examples":["Вечеринки и клубы"]},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon","description":"Иконка Phosphor, если задана"}},"type":"object","required":["code","name"],"title":"CategoryResponse","description":"Категория события: код для фильтра, название для человека."},"app__schemas__events__FeedResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/EventCard"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"},"has_more":{"type":"boolean","title":"Has More","default":false},"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total"}},"type":"object","required":["items"],"title":"FeedResponse","description":"Страница ленты (docs/api.md §3)."},"app__schemas__events__MapCluster":{"properties":{"lat":{"type":"number","title":"Lat","description":"Центр кружка"},"lon":{"type":"number","title":"Lon","description":"Центр кружка"},"count":{"type":"integer","title":"Count","description":"Сколько СОБЫТИЙ в ячейке (не их дней)"}},"type":"object","required":["lat","lon","count"],"title":"MapCluster","description":"Кружок с числом: сколько СОБЫТИЙ в ячейке, а не их дней.\n\nРазличие здесь не придирка. Двенадцать еженедельных вечеринок Патонга\nдают за полгода больше трёхсот дней, и кружок «318» над пляжем обещал бы\nгород, которого нет."},"app__schemas__events__MapResponse":{"properties":{"clusters":{"items":{"$ref":"#/components/schemas/app__schemas__events__MapCluster"},"type":"array","title":"Clusters"},"points":{"items":{"$ref":"#/components/schemas/EventCard"},"type":"array","title":"Points"},"truncated":{"type":"boolean","title":"Truncated","default":false},"total":{"type":"integer","title":"Total","default":0}},"type":"object","title":"MapResponse","description":"Карта афиши: либо кружки, либо метки — но не то и другое сразу.\n\nМетка — та же карточка, что в ленте (`EventCard`), и это сделано нарочно:\nна карте и в ленте человек выбирает одно и то же, и вторая форма карточки\nозначала бы второй набор полей, который однажды разойдётся с первым.\n\nСобытие приходит **один раз**, своим ближайшим подходящим днём: на карте\nточка у еженедельной вечеринки одна, сколько бы вторников у неё ни было."},"app__schemas__events__PhotoResponse":{"properties":{"urls":{"additionalProperties":{"type":"string"},"type":"object","title":"Urls","description":"Адреса размеров: `thumb` (480), `medium` (1600), `large` (2560, бывает не всегда — тогда `medium`)","examples":[{"medium":"https://fs.mybounty.org/bounty-public/photos/medium/….jpg","thumb":"https://fs.mybounty.org/bounty-public/photos/thumb/….jpg"}]},"avg_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avg Color","description":"Средний цвет кадра — фон места под снимок, пока он грузится","examples":["#899b7f"]},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width","description":"Ширина исходника, px: по ней и `height` занимается место заранее"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height","description":"Высота исходника, px. Выше ширины — постер: в клетке не режется"},"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption","description":"Подпись редакции к снимку"}},"type":"object","required":["urls"],"title":"PhotoResponse","description":"Фотография события. `large` существует не всегда (Р-052)."},"app__schemas__events__PlaceBrief":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Название места на языке запроса","examples":["Пхукет"]},"path":{"items":{"type":"string"},"type":"array","title":"Path","description":"Цепочка от страны к месту","examples":[["Таиланд","Пхукет"]]}},"type":"object","required":["id"],"title":"PlaceBrief","description":"Место: последний уровень и вся цепочка от страны."},"app__schemas__events__TranslationMark":{"properties":{"source":{"type":"string","title":"Source","description":"`original` — текст редакции, `machine` — машинный перевод","examples":["machine"]},"stale":{"type":"boolean","title":"Stale","description":"Оригинал поправили после перевода — показать «перевод устарел»","default":false}},"type":"object","required":["source"],"title":"TranslationMark","description":"Пометка перевода: чьи это слова и не отстал ли он (Р-063, Р-286).\n\n`stale` означает, что редакция поправила оригинал после перевода.\nПоказывать такой текст можно, умалчивать об этом нельзя: человек по нему\nрешает, идти ему или нет."},"app__schemas__notifications__ReadRequest":{"properties":{"up_to_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Up To Id","description":"Без него прочитанным считается всё"}},"additionalProperties":false,"type":"object","title":"ReadRequest"},"app__schemas__search__FeedResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/app__schemas__search__ListingCard"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"},"has_more":{"type":"boolean","title":"Has More"}},"type":"object","required":["items","has_more"],"title":"FeedResponse","description":"Страница ленты. Формат курсора — общий для всего проекта (api.md §3)."},"app__schemas__search__ListingCard":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"slug":{"type":"string","title":"Slug"},"kind":{"type":"string","title":"Kind"},"title":{"type":"string","title":"Title"},"lang":{"type":"string","title":"Lang"},"original_lang":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Lang"},"translation":{"anyOf":[{"$ref":"#/components/schemas/app__schemas__search__TranslationMark"},{"type":"null"}]},"photo":{"anyOf":[{"$ref":"#/components/schemas/app__schemas__search__PhotoResponse"},{"type":"null"}]},"price_from_minor":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price From Minor"},"currency":{"type":"string","title":"Currency"},"rating_avg":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating Avg"},"rating_count":{"type":"integer","title":"Rating Count"},"reviews_count":{"type":"integer","title":"Reviews Count"},"place":{"anyOf":[{"$ref":"#/components/schemas/app__schemas__search__PlaceBrief"},{"type":"null"}]},"distance_m":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Distance M"},"instant_book":{"type":"boolean","title":"Instant Book"},"is_featured":{"type":"boolean","title":"Is Featured"},"is_favorite":{"type":"boolean","title":"Is Favorite"},"terms":{"anyOf":[{"$ref":"#/components/schemas/BookingTerms"},{"type":"null"}]},"availability":{"anyOf":[{"$ref":"#/components/schemas/AvailabilityMark"},{"type":"null"}]},"facts":{"anyOf":[{"$ref":"#/components/schemas/StayFacts"},{"type":"null"}]}},"type":"object","required":["id","slug","kind","title","lang","currency","rating_count","reviews_count","instant_book","is_featured","is_favorite"],"title":"ListingCard","description":"Одна карточка выдачи."},"app__schemas__search__MapCluster":{"properties":{"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"count":{"type":"integer","title":"Count"},"price_from_minor":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price From Minor"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"}},"type":"object","required":["lat","lon","count"],"title":"MapCluster","description":"Кружок с числом объектов на мелком зуме."},"app__schemas__search__MapResponse":{"properties":{"clusters":{"items":{"$ref":"#/components/schemas/app__schemas__search__MapCluster"},"type":"array","title":"Clusters"},"points":{"items":{"$ref":"#/components/schemas/MapPoint"},"type":"array","title":"Points"},"truncated":{"type":"boolean","title":"Truncated","default":false},"total":{"type":"integer","title":"Total","default":0}},"type":"object","title":"MapResponse","description":"Ответ карты.\n\n`truncated` — объектов в области больше, чем меток в ответе; интерфейс\nобязан предложить приблизить карту, а не делать вид, что показал всё."},"app__schemas__search__PhotoResponse":{"properties":{"urls":{"additionalProperties":{"type":"string"},"type":"object","title":"Urls"},"avg_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avg Color"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"}},"type":"object","required":["urls"],"title":"PhotoResponse","description":"Обложка карточки.\n\n`urls` содержит только **существующие** размеры: `large` создаётся не\nвсегда (Р-052), и клиент, рассчитывающий на три ключа, покажет пустое\nместо."},"app__schemas__search__PlaceBrief":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"path":{"items":{"type":"string"},"type":"array","title":"Path"}},"type":"object","required":["id"],"title":"PlaceBrief","description":"Место объекта: последний уровень и вся цепочка от страны."},"app__schemas__search__TranslationMark":{"properties":{"source":{"type":"string","title":"Source"},"stale":{"type":"boolean","title":"Stale"}},"type":"object","required":["source","stale"],"title":"TranslationMark","description":"Пометка перевода: чем переведено и не устарел ли перевод."},"ErrorEnvelope":{"title":"ErrorEnvelope","description":"Ошибка — всегда один конверт (docs/api.md §2). Ветвиться — по `code`; `message` — для человека и может меняться; `request_id` — номер запроса для поддержки (он же в заголовке `X-Request-Id`).","type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Машинный код ошибки"},"message":{"type":"string","description":"Текст для человека"},"details":{"type":"object","description":"Подробности: поле с ошибкой (`field`), список полей (`fields`), пределы","additionalProperties":true},"request_id":{"type":"string","description":"Номер запроса в журнале"}}}}}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Access-токен из `POST /v1/auth/login` (живёт 15 минут, обновляется `POST /v1/auth/refresh`). Заголовок `Authorization: Bearer <access>`."}}},"tags":[{"name":"Аутентификация","description":"Регистрация, вход, подтверждение почты, восстановление пароля, обновление пары токенов и билет на сокет. Вход: `POST /v1/auth/login` → `access` (15 минут) и `refresh` (при обмене остаётся тем же, Р-467). На стенде входят только почты из списка стенда (Р-279). Капча — по требованию сервиса (`captcha_required`): ползунок-пазл модуля captcha, в теле — `captcha_id` и `captcha_answer` (Р-481)."},{"name":"Профиль","description":"Свой профиль, аватар, сессии, сохранённые фильтры поиска, настройки писем и пушей, «Транзакции» (оплаты и возвраты) и счётчики непрочитанного для шапки и нижнего меню (`/v1/me/badges`). Нужен вход."},{"name":"Справочники","description":"Открытая конфигурация клиента (`/v1/config`: карта, языки, валюты, регион афиши, включён ли Bounty AI), курсы валют для примерной цены, места, категории, удобства, ближайший сервер (`/v1/nodes`). Вход не нужен."},{"name":"Локализация","description":"Строки клиентов на четырёх языках (`en`, `ru`, `th`, `zh-Hans`) — тот же набор, что у сайта и приложений (Р-454). Вход не нужен."},{"name":"Поиск","description":"Лента пяти категорий (жильё, впечатления, услуги, транспорт, еда), карта, счётчик «Показать N», подсказки строки, края ползунка цены. Курсорная пагинация. Вход не нужен; вошедшему в карточках приходит `is_favorite`."},{"name":"Карта","description":"Запасной путь тайлов и стиля карты через сервер Bounty, когда OpenFreeMap недоступен (Р-337). Вход не нужен."},{"name":"События","description":"Афиша города (Р-280): лента по дням, ближайшие события по одному на событие (страницами), полоска календаря, карта, страница события, справочник категорий. Дни и часы — в поясе площадки (правило №16). Вход не нужен."},{"name":"Объекты","description":"Страница объекта любой из пяти категорий, календарь, выходы и места, расчёт цены, отзывы, похожие рядом, условия долгосрочной аренды. Вход не нужен."},{"name":"Бизнес","description":"Страница бизнеса-партнёра: о компании, объекты, отзывы. Вход не нужен."},{"name":"Бронирования","description":"Оформление, список, бронь целиком, отмена с расчётом возврата, лента заказа, билет заселения. Нужна подтверждённая почта. Создание принимает `Idempotency-Key`."},{"name":"Оплата","description":"Оплата брони и заказа через Т-Банк (на стенде — только демо-терминал, Р-350), состояние платежа. Нужна подтверждённая почта."},{"name":"Долгосрочная аренда","description":"Договоры аренды от месяца (Р-130): стадии, задаток, документ, подписи, чеки. Нужна подтверждённая почта."},{"name":"Чат","description":"Переписка с партнёрами и поддержкой: диалоги, сообщения, вложения, голосовые, прочтение. Realtime — WebSocket `/v1/ws`. Нужна подтверждённая почта."},{"name":"Уведомления","description":"Лента уведомлений, прочтение, пуш-устройства (Р-424), отписка по ссылке из письма (без входа)."},{"name":"Отзывы","description":"Отзывы гостя: оставить по завершённой брони, оценки по критериям, свои отзывы. Нужна подтверждённая почта."},{"name":"Избранное","description":"Избранные объекты и подборки. Нужна подтверждённая почта."},{"name":"Жалобы","description":"Пожаловаться на объект, бизнес, отзыв или сообщение. Нужен вход."},{"name":"Заявки на подбор","description":"Заявка «Подберём жильё под ваш запрос» (Р-276): открытая форма с капчей, дальше человека ведёт модератор."},{"name":"Приватные файлы","description":"Документы и вложения из приватного хранилища — потоком после проверки прав (правило №7). Нужен вход."},{"name":"Bounty AI","description":"Личный помощник туриста (Р-426…Р-429, `docs/assistant.md`): лента, сообщения текстом, голосом и с вложениями, озвучка и переводчик, блоки ответов, настройки и память. Ответ приходит событием сокета `assistant.message`. Нужна подтверждённая почта."},{"name":"Планы и уведомления","description":"Планы по дням, шаги, брони в днях, напоминания «за N минут» и на точное время (Р-428). Нужна подтверждённая почта."},{"name":"Заметки","description":"Заметки гостя (Р-442): текст, чек-листы, предложения помощника. Нужна подтверждённая почта."},{"name":"Связь и карта сайта","description":"Раздел «Связь» — тарифы SIM-карт в офисе Bounty HUB (Р-425) и готовая карта сайта для поисковиков (Р-423). Вход не нужен."},{"name":"Витрина в EGO","description":"Bounty как модуль ассистента EGO (Р-290): подписанные вызовы `/ego/v1`, не для клиентов Bounty."},{"name":"Витрина в EGO: аккаунт и брони","description":"Аккаунт и брони гостя внутри EGO (Р-369): подписанные вызовы, не для клиентов Bounty."},{"name":"service","description":"Служебное: состояние модуля (`/health`) и версия."}]}