Bounty API Пользователи

Открытый APIверсия 26.10.19

Документация · Bounty API — пользователи

Открытый API гостя: поиск и карта, карточки объектов пяти категорий, афиша раздела «События», бронирование, долгосрочная аренда, чат, отзывы, профиль.

173 эндпоинта25 разделовhttps://api.mybounty.org/v1

Разделы и поиск · 25

Как пользоваться

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

Этим же API пользуются веб-клиент, Android, iOS и Telegram-бот: у них один контракт и один набор строк локализации.

Общие правила

Версия — в пути. Все эндпоинты начинаются с /v1. Ломающие изменения выходят новой версией пути, а не правкой текущей.

Аутентификация — Authorization: Bearer <access>. Токен выдаёт POST /v1/auth/login; он живёт 15 минут, обновляется по refresh-токену через POST /v1/auth/refresh. Обмен отдаёт свежий access и тот же refresh, а срок сессии сдвигается: сессия держится, пока ей пользуются (Р-467). Выход и «выйти везде» закрывают сессию сразу.

Токен одного API никогда не принимается другим. У каждой аудитории свой секрет подписи, а не только claim aud: чужой токен не проходит проверку подписи, а не проверку прав.

Ответы и ошибки

Успех — тело эндпоинта как есть. Ошибка — всегда один и тот же конверт:

{
  "error": {
    "code": "validation_error",
    "message": "Дата выезда должна быть позже даты заезда",
    "details": {"field": "date_to"},
    "request_id": "0f1c…"
  }
}

code — машинный, по нему и нужно ветвиться. message — для человека, он может меняться. request_id есть в каждом ответе и в заголовке X-Request-Id: с ним обращение в поддержку находит запрос в журнале за секунды.

Коды: 400 validation_error, 401 unauthorized, 403 forbidden, 404 not_found, 409 conflict, 422 (проверка схемы), 429 rate_limited (с заголовком Retry-After), 500 internal_error.

Списки

Пагинация курсорная, OFFSET не используется нигде:

{"items": [...], "next_cursor": "eyJ…", "has_more": true}

next_cursor непрозрачен — собирать его руками нельзя, его форма не часть контракта. Нет next_cursor — страница последняя.

Повторы и идемпотентность

Создающие запросы принимают заголовок Idempotency-Key. Повтор с тем же ключом возвращает тот же результат, а не заводит вторую запись. Ключ живёт 24 часа.

Частота

Лимиты считаются по адресу и по актёру. Превышение — 429 с Retry-After в секундах. Клиент обязан ждать указанное время, а не повторять сразу.

Время, деньги и языки

  • Время объекта — в его часовом поясе и в UTC не переводится никогда. Календарные даты (заезд, выезд, день события) — это date в поясе объекта. Моменты — timestamptz в UTC.
  • Деньги — в минорных единицах (price_minor) вместе с кодом валюты. Суммы никогда не приходят от клиента: их считает сервер.
  • Язык ответа — заголовок Accept-Language или параметр lang. Языки: en (по умолчанию), ru, th, zh-Hans. Непереведённая строка отдаётся по-английски, а переведённый контент помечается пометкой о переводе.

Особенности этого API

  • Поиск по месту — строкой, а не фильтром. Параметра place_id нет: район и город приходят в q и сверяются с названием, описанием и местом объекта на всех языках сразу, по словам.
  • Realtime — WebSocket /v1/ws с тем же access-токеном: чат, уведомления, изменения брони.
  • Фотографии — до трёх размеров (thumb 480, medium 1600, large 2560). large существует не всегда; клиент обязан пережить его отсутствие и показать medium.

Аутентификация

15 эндпоинтов

Регистрация, вход, подтверждение почты, восстановление пароля, обновление пары токенов и билет на сокет. Вход: POST /v1/auth/login → access (15 минут) и refresh (при обмене остаётся тем же, Р-467). На стенде входят только почты из списка стенда (Р-279). Капча — по требованию сервиса (captcha_required): ползунок-пазл модуля captcha, в теле — captcha_id и captcha_answer (Р-481).

GET/v1/auth/email-availability Свободен ли адрес — подсказка прямо в форме регистрации Без входа

Под жёстким лимитом: без него это готовая проверялка «есть ли у вас аккаунт на Bounty» для чужих списков адресов.

Параметры

email запрос · string обязательно

Ответы

200Успешный ответ · EmailAvailabilityResponse

Поля ответа · 1

available boolean обязательно

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/auth/email-availability'
POST/v1/auth/register Регистрация: имя, фамилия, почта, пароль (Р-016) Без входа

Тело запросаRegisterRequest · application/json

captcha_id string по умолчанию ""

captcha_answer string по умолчанию ""

first_name string обязательно

last_name string обязательно

email string (email) обязательно

password string обязательно

accept_terms boolean обязательно

Согласие с условиями — без него регистрации нет

marketing_opt_in boolean по умолчанию false

Согласие на рассылки. По умолчанию выключено

Ответы

201Успешный ответ · TokenPairResponse

Поля ответа · 5

access_token string обязательно

refresh_token string обязательно

token_type string по умолчанию "Bearer"

expires_in integer обязательно

Сколько секунд живёт access-токен

session_id string (uuid) обязательно

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/auth/register' \
  -H 'Content-Type: application/json' \
  -d '{"first_name": "…", "last_name": "…", "email": "anna@example.com", "password": "…", "accept_terms": false}'
POST/v1/auth/confirm-email Подтверждение адреса по ссылке из письма Без входа

Тело запросаConfirmEmailRequest · application/json

token string обязательно

Ответы

200Успешный ответ · MessageResponse

Поля ответа · 2

ok boolean по умолчанию true

message string или null

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/auth/confirm-email' \
  -H 'Content-Type: application/json' \
  -d '{"token": "…"}'
POST/v1/auth/resend-confirmation Выслать письмо с подтверждением заново Нужен вход

Ответы

200Успешный ответ · MessageResponse

Поля ответа · 2

ok boolean по умолчанию true

message string или null

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/auth/resend-confirmation' \
  -H 'Authorization: Bearer <access>'
POST/v1/auth/login Вход по почте и паролю Без входа

Тело запросаLoginRequest · application/json

captcha_id string по умолчанию ""

captcha_answer string по умолчанию ""

email string (email) обязательно

password string обязательно

Ответы

200Успешный ответ · TokenPairResponse

Поля ответа · 5

access_token string обязательно

refresh_token string обязательно

token_type string по умолчанию "Bearer"

expires_in integer обязательно

Сколько секунд живёт access-токен

session_id string (uuid) обязательно

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/auth/login' \
  -H 'Content-Type: application/json' \
  -d '{"email": "anna@example.com", "password": "…"}'
POST/v1/auth/refresh Обмен refresh-токена на новую пару Без входа

Капчи здесь нет намеренно: обновление происходит в фоне, без участия человека, и показать ему картинку в этот момент невозможно.

Тело запросаRefreshRequest · application/json

refresh_token string обязательно

Ответы

200Успешный ответ · TokenPairResponse

Поля ответа · 5

access_token string обязательно

refresh_token string обязательно

token_type string по умолчанию "Bearer"

expires_in integer обязательно

Сколько секунд живёт access-токен

session_id string (uuid) обязательно

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/auth/refresh' \
  -H 'Content-Type: application/json' \
  -d '{"refresh_token": "…"}'
POST/v1/auth/ws-ticket Одноразовый билет для подключения к /v1/ws (docs/api.md §7) Нужен вход Почта подтверждена

Нужен веб-клиенту: у страницы токена нет вовсе — он в cookie HttpOnly, и заголовок Authorization браузерному WebSocket не поставить. Билет живёт минуту, гасится при первом использовании и не открывает ничего, кроме сокета.

Приложениям он не нужен: у них есть токен, и они шлют его параметром.

Билет требует подтверждённой почты (Р-217): сокет ведёт в переписку и уведомления, а они закрыты до подтверждения. Сам сокет проверяет это ещё раз — приложение приходит туда с токеном, минуя билет.

Ответы

200Успешный ответ · WsTicketResponse

Поля ответа · 2

ticket string обязательно

expires_in integer обязательно

Сколько секунд билет действителен

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/auth/ws-ticket' \
  -H 'Authorization: Bearer <access>'
POST/v1/auth/logout Выход: текущая сессия завершается Нужен вход

Ответы

200Успешный ответ · MessageResponse

Поля ответа · 2

ok boolean по умолчанию true

message string или null

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/auth/logout' \
  -H 'Authorization: Bearer <access>'
POST/v1/auth/logout-all Выход на всех устройствах, кроме текущего Нужен вход

Ответы

200Успешный ответ · MessageResponse

Поля ответа · 2

ok boolean по умолчанию true

message string или null

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/auth/logout-all' \
  -H 'Authorization: Bearer <access>'
GET/v1/auth/sessions Список устройств, с которых выполнен вход Нужен вход

Ответы

200Успешный ответ · массив SessionResponse

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/auth/sessions' \
  -H 'Authorization: Bearer <access>'
POST/v1/auth/password-reset/request Запрос ссылки на смену пароля Без входа

Всегда 202, независимо от того, есть такой аккаунт или нет: разные ответы превратили бы форму в проверялку списков адресов.

Тело запросаPasswordResetRequest · application/json

captcha_id string по умолчанию ""

captcha_answer string по умолчанию ""

email string (email) обязательно

Ответы

202Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/auth/password-reset/request' \
  -H 'Content-Type: application/json' \
  -d '{"email": "anna@example.com"}'
POST/v1/auth/password-reset/confirm Установка нового пароля по ссылке из письма Без входа

Все сессии завершаются: пароль меняют, когда подозревают утечку.

Тело запросаPasswordResetConfirm · application/json

token string обязательно

password string обязательно

Ответы

200Успешный ответ · MessageResponse

Поля ответа · 2

ok boolean по умолчанию true

message string или null

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/auth/password-reset/confirm' \
  -H 'Content-Type: application/json' \
  -d '{"token": "…", "password": "…"}'
POST/v1/auth/password/change Смена пароля изнутри аккаунта. Текущая сессия остаётся жить Нужен вход

Тело запросаPasswordChangeRequest · application/json

current_password string обязательно

new_password string обязательно

Ответы

200Успешный ответ · MessageResponse

Поля ответа · 2

ok boolean по умолчанию true

message string или null

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/auth/password/change' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"current_password": "…", "new_password": "…"}'
POST/v1/auth/delete-request Запрос на удаление аккаунта — подтверждается письмом Нужен вход

Код с картинки — по подозрению, как у входа и сброса пароля (Р-277, Р-466): тело необязательное, пустая пара проходит, пока клиент не похож на робота. Похож — captcha_required, и форма показывает картинку.

Тело запросаDeleteRequest или null · application/json

Ответы

202Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/auth/delete-request' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"captcha_id": "", "captcha_answer": ""}'
POST/v1/auth/delete-confirm Подтверждение удаления аккаунта по ссылке из письма Без входа

Тело запросаConfirmEmailRequest · application/json

token string обязательно

Ответы

200Успешный ответ · MessageResponse

Поля ответа · 2

ok boolean по умолчанию true

message string или null

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/auth/delete-confirm' \
  -H 'Content-Type: application/json' \
  -d '{"token": "…"}'

Профиль

15 эндпоинтов

Свой профиль, аватар, сессии, сохранённые фильтры поиска, настройки писем и пушей, «Транзакции» (оплаты и возвраты) и счётчики непрочитанного для шапки и нижнего меню (/v1/me/badges). Нужен вход.

GET/v1/me Свой профиль целиком — вместе с действующими ограничениями (находка №279) Нужен вход

Ответы

200Успешный ответ · ProfileResponse

Поля ответа · 27

id string (uuid) обязательно

email string или null обязательно

email_confirmed boolean обязательно

status string обязательно

first_name string обязательно

last_name string обязательно

avatar_url string или null обязательно

birth_date string (date) или null обязательно

gender string или null обязательно

phone string или null обязательно

phone_confirmed boolean обязательно

citizenship string или null обязательно

residence_country string или null обязательно

billing_address string или null обязательно

emergency_contact string или null обязательно

language string или null обязательно

currency string или null обязательно

verification_status string обязательно

verified_at string (date-time) или null обязательно

notify_push boolean обязательно

notify_email boolean обязательно

notify_marketing boolean обязательно

bookings_count integer обязательно

rating_avg number или null обязательно

rating_count integer обязательно

created_at string (date-time) обязательно

restrictions массив OwnRestriction

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/me' \
  -H 'Authorization: Bearer <access>'
PATCH/v1/me Правка профиля Нужен вход

Меняются только переданные поля: model_fields_set отличает «не передали» от «передали пусто», иначе форма с одним полем стирала бы остальные.

Тело запросаProfileUpdateRequest · application/json

first_name string или null

last_name string или null

birth_date string (date) или null

gender string или null

phone string или null

citizenship string или null

residence_country string или null

billing_address string или null

emergency_contact string или null

language string или null

currency string или null

notify_push boolean или null

notify_email boolean или null

notify_marketing boolean или null

Ответы

200Успешный ответ · ProfileResponse

Поля ответа · 27

id string (uuid) обязательно

email string или null обязательно

email_confirmed boolean обязательно

status string обязательно

first_name string обязательно

last_name string обязательно

avatar_url string или null обязательно

birth_date string (date) или null обязательно

gender string или null обязательно

phone string или null обязательно

phone_confirmed boolean обязательно

citizenship string или null обязательно

residence_country string или null обязательно

billing_address string или null обязательно

emergency_contact string или null обязательно

language string или null обязательно

currency string или null обязательно

verification_status string обязательно

verified_at string (date-time) или null обязательно

notify_push boolean обязательно

notify_email boolean обязательно

notify_marketing boolean обязательно

bookings_count integer обязательно

rating_avg number или null обязательно

rating_count integer обязательно

created_at string (date-time) обязательно

restrictions массив OwnRestriction

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X PATCH 'https://api.mybounty.org/v1/me' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"first_name": "…", "last_name": "…"}'
GET/v1/me/badges Счётчики непрочитанного: уведомления, сообщения, Bounty AI Нужен вход

Три числа для обвязки клиента одним запросом (Р-465).

  • notifications — непрочитанные уведомления (число у колокольчика, W44); гаснут после POST /v1/notifications/read;
  • messages — непрочитанные сообщения во всех переписках гостя (число у значка сообщений и точка у вкладки «Профиль»); гаснут после POST /v1/chats/dialogs/{id}/read;
  • assistant — сообщения Bounty AI, которых гость ещё не видел (точка у вкладки «Bounty»); гаснут после POST /v1/assistant/read.

Запрос лёгкий — три счёта по индексам, — но дёргать его на каждом экране незачем: сайт помнит ответ минуту, приложения обновляют его по событиям сокета /v1/ws и при возврате на экран.

Ответы

200Успешный ответ · BadgesResponse

Поля ответа · 3

notifications integer обязательно

Непрочитанные уведомления — число у колокольчика

messages integer обязательно

Непрочитанные сообщения во всех переписках гостя — число у значка сообщений

assistant integer обязательно

Ответы и сообщения Bounty AI, которых гость ещё не видел — точка у вкладки «Bounty»

401Нет входа или токен истёк — unauthorized

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/me/badges' \
  -H 'Authorization: Bearer <access>'
PUT/v1/me/avatar Загрузка аватара. Изображение перекодируется, метаданные вырезаются Нужен вход Почта подтверждена

Тело запросаBody_set_avatar_v1_me_avatar_put · multipart/form-data

file string обязательно

Изображение: JPEG, PNG, HEIC или WebP

Ответы

200Успешный ответ · AvatarResponse

Поля ответа · 1

avatar_url string обязательно

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X PUT 'https://api.mybounty.org/v1/me/avatar' \
  -H 'Authorization: Bearer <access>' \
  -F 'file=@photo.jpg'
DELETE/v1/me/avatar Убрать аватар Нужен вход Почта подтверждена

Ответы

204Успешный ответ

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X DELETE 'https://api.mybounty.org/v1/me/avatar' \
  -H 'Authorization: Bearer <access>'
GET/v1/me/sessions Список устройств Нужен вход

Дублирует /v1/auth/sessions: в интерфейсе этот список живёт в настройках профиля, а не на экране входа.

Ответы

200Успешный ответ · массив SessionResponse

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/me/sessions' \
  -H 'Authorization: Bearer <access>'
DELETE/v1/me/sessions/<span class="text-brand-ink">{session_id}</span> Завершить сессию на выбранном устройстве Нужен вход

Параметры

session_id путь · string (uuid) обязательно

Ответы

200Успешный ответ · MessageResponse

Поля ответа · 2

ok boolean по умолчанию true

message string или null

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X DELETE 'https://api.mybounty.org/v1/me/sessions/{session_id}' \
  -H 'Authorization: Bearer <access>'
GET/v1/me/search-filters Сохранённые фильтры по разделам и последняя область карты (Р-017) Нужен вход Почта подтверждена

Ответы

200Успешный ответ · SearchFiltersResponse

Поля ответа · 4

stay object

experience object

service object

map_view object

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/me/search-filters' \
  -H 'Authorization: Bearer <access>'
PUT/v1/me/search-filters Сохранение фильтров. Разделы, которых нет в теле, не трогаются Нужен вход Почта подтверждена

Тело запросаSearchFiltersRequest · application/json

stay object или null

experience object или null

service object или null

map_view object или null

Ответы

200Успешный ответ · SearchFiltersResponse

Поля ответа · 4

stay object

experience object

service object

map_view object

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X PUT 'https://api.mybounty.org/v1/me/search-filters' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"stay": {}, "experience": {}}'
GET/v1/me/email-prefs Галочки писем по группам. Чего человек не трогал — по умолчанию из реестра Нужен вход Почта подтверждена

Ответы

200Успешный ответ · EmailPrefsBody

Поля ответа · 1

groups массив EmailPrefGroup обязательно

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/me/email-prefs' \
  -H 'Authorization: Bearer <access>'
PUT/v1/me/email-prefs Включить или выключить письма: {"prefs": {"booking.reminder": false}} Нужен вход Почта подтверждена

Выключить можно всё, кроме ответов на действие самого человека (подтверждение почты, сброс пароля): их в настройках нет вовсе. Незнакомый код — 400 email_pref_unknown.

Тело запросаEmailPrefsUpdate · application/json

prefs object

Ответы

200Успешный ответ · EmailPrefsBody

Поля ответа · 1

groups массив EmailPrefGroup обязательно

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X PUT 'https://api.mybounty.org/v1/me/email-prefs' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"prefs": {}}'
GET/v1/me/push-prefs Общий выключатель пушей и галочки по группам Нужен вход Почта подтверждена

Это настройки аккаунта. Разрешение пушей даёт каждое устройство само (POST /v1/devices): включённые здесь пуши приходят только на те устройства, где они разрешены и где человек сейчас вошёл.

Ответы

200Успешный ответ · PushPrefsBody

Поля ответа · 2

enabled boolean обязательно

Общий выключатель: выключен — не уходит ни один пуш

groups массив PushPrefGroup обязательно

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/me/push-prefs' \
  -H 'Authorization: Bearer <access>'
PUT/v1/me/push-prefs Выключатель и/или галочки: {"enabled": true, "prefs": {"message.new": false}} Нужен вход Почта подтверждена

Выключить можно любой пуш. Незнакомый код — 400 push_pref_unknown.

Тело запросаPushPrefsUpdate · application/json

enabled boolean или null

prefs object

Ответы

200Успешный ответ · PushPrefsBody

Поля ответа · 2

enabled boolean обязательно

Общий выключатель: выключен — не уходит ни один пуш

groups массив PushPrefGroup обязательно

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X PUT 'https://api.mybounty.org/v1/me/push-prefs' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"enabled": false, "prefs": {}}'
GET/v1/me/transactions «Транзакции» (S71, W45; Р-447): оплаты и возвраты, новые сверху, как в выписке банка Нужен вход Почта подтверждена

У операции — вид (booking_payment, booking_refund), состояние (paid, failed, pending), сумма платежа, сумма заказа и курс, способ, номер операции банка, время с поясом места и «За что» (target). summary — итог нынешнего месяца: оплачено и возвращено.

Параметры

type запрос · string

all · payments · refunds

cursor запрос · string или null

limit запрос · integer или null

Ответы

200Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/me/transactions' \
  -H 'Authorization: Bearer <access>'
GET/v1/me/transactions/<span class="text-brand-ink">{tx_id}</span> Одна операция (S72, W46) — по номеру из выписки (pay_…, ref_…) Нужен вход Почта подтверждена

Параметры

tx_id путь · string обязательно

Ответы

200Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/me/transactions/{tx_id}' \
  -H 'Authorization: Bearer <access>'

Справочники

9 эндпоинтов

Открытая конфигурация клиента (/v1/config: карта, языки, валюты, регион афиши, включён ли Bounty AI), курсы валют для примерной цены, места, категории, удобства, ближайший сервер (/v1/nodes). Вход не нужен.

GET/v1/places Иерархия мест на языке запроса Без входа

Параметры

parent_id запрос · integer или null

Только дети этого места

level запрос · string или null

country / region / district / area

with_totals запрос · boolean

Считать объекты вместе со вложенными местами

Ответы

200Успешный ответ · массив PlaceResponse

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/places'
GET/v1/places/<span class="text-brand-ink">{slug}</span> Страница направления: место, путь сверху, что внутри, сколько чего Без входа

Объявлен после /v1/places/popular: маршрут с параметром, стоящий раньше, перехватил бы слово popular как адрес места и всегда отвечал бы «направление не найдено».

Параметры

slug путь · string обязательно

Ответы

200Успешный ответ · PlaceCardResponse

Поля ответа · 14

id integer обязательно

parent_id integer или null

level string обязательно

slug string обязательно

name string обязательно

listings_count integer обязательно

Объектов, привязанных к самому месту

listings_total integer или null

Объектов вместе со всем, что внутри. Заполняется только при with_totals=true: у региона собственных объявлений обычно нет, и без этого числа список регионов выглядит пустым

name_full string или null

timezone string или null

currency string или null

center PlacePoint или null

path массив PlaceResponse по умолчанию []

children массив PlaceResponse по умолчанию []

counts object по умолчанию {}

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/places/{slug}'
GET/v1/amenities Удобства группами. С kind — только применимые к этой категории Без входа

Параметры

kind запрос · string или null

stay / experience / service

Ответы

200Успешный ответ · массив AmenityResponse

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/amenities'
GET/v1/categories Категории впечатлений, услуг, транспорта или еды Без входа

С with_counts=true у каждой — число опубликованных объектов: чипы над лентой раздела пишут его рядом с названием (макет W01). Граница та же, что у ленты; остальные фильтры на число не влияют.

Параметры

kind запрос · string обязательно

experience, service, transport или food

with_counts запрос · boolean

Добавить listings_count — сколько опубликованных объектов в категории (чипы раздела W01)

Ответы

200Успешный ответ · массив app__schemas__catalog__CategoryResponse

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/categories'
GET/v1/currencies Валюты отображения Без входа

Ответы

200Успешный ответ · массив CurrencyResponse

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/currencies'
GET/v1/fx/rates Курсы валют ЦБ РФ для примерной цены (Р-214) Без входа

Открыт без токена: пересчёт нужен и гостю, который ещё не завёл учётную запись, — именно он чаще всего и смотрит цены впервые.

Это подсказка, а не цена. Платит человек в валюте объявления, банк пересчитывает по своему курсу, и клиент обязан пометить пересчёт как примерный.

Ответы

200Успешный ответ · FxRatesResponse

Поля ответа · 5

base string обязательно

date string (date) или null

fetched_at string (date-time) или null

source string или null

rates object по умолчанию {}

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/fx/rates'
GET/v1/config Публичная конфигурация: карта, языки, валюты, лимиты, регион афиши Без входа

Ответы

200Успешный ответ · ConfigResponse

Поля ответа · 12

map MapConfig обязательно

Карта: стиль, тайлы и стартовый вид. Стиль и тайлы приходят с сервера, а не зашиты в приложение: адрес поставщика меняется, а обновление в магазине идёт две недели.

languages массив string

default_language string обязательно

currencies массив string

base_currency string обязательно

search SearchLimits обязательно

online_payments_enabled boolean обязательно

Приём платежей включён (рубильник payments_terminal не в off)

service_fee_percent number обязательно

max_upload_mb integer обязательно

review_window_days integer по умолчанию 14

Сколько дней после поездки открыто окно отзыва (Р-422)

assistant_enabled boolean по умолчанию false

Работает ли Bounty AI: показывать ли пункт меню вошедшему гостю (Р-426)

region RegionInfo или null

Регион афиши (Р-459): место уровня region у стартовой точки карты

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/config'
GET/v1/nodes Серверы для выбора по пингу (Р-024, docs/nodes/architecture.md §4) Без входа

origin — главный сервер, есть всегда, даже когда узлов ноль: клиенту не нужно знать его адрес из своей сборки. В nodes — только узлы в состоянии active. Узел — это API и кеш файлов на одном сервере: у каждого — пара адресов, и выбираются они вместе.

Ответы

200Успешный ответ · object

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/nodes'

Локализация

2 эндпоинта

Строки клиентов на четырёх языках (en, ru, th, zh-Hans) — тот же набор, что у сайта и приложений (Р-454). Вход не нужен.

GET/v1/i18n Набор строк целиком, уже с подстановкой недостающего из английского Без входа

Клиент получает полный словарь, а не набор дыр, которые ему нечем закрыть: непереведённый ключ приходит по-английски, и это лучше пустой кнопки.

Язык берётся из параметра, иначе из Accept-Language; неизвестный — английский. Если version совпадает с текущей, отвечаем 304: набор строк весит килобайты, но телефон в тайском 3G считает и их.

Параметры

lang запрос · string или null

version запрос · string или null

Ответы

200Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/i18n'
GET/v1/i18n/languages Языки интерфейса — для экрана выбора языка (S66) Без входа

Каждый назван на самом себе: «Тайский» ничего не говорит тому, кто ищет тайский. Флагов у языков нет: флаг — это страна, а не язык.

Ответы

200Успешный ответ · object

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/i18n/languages'

Поиск

5 эндпоинтов

Лента пяти категорий (жильё, впечатления, услуги, транспорт, еда), карта, счётчик «Показать N», подсказки строки, края ползунка цены. Курсорная пагинация. Вход не нужен; вошедшему в карточках приходит is_favorite.

GET/v1/search/listings Лента раздела: карточки по фильтрам, курсорная пагинация Вход по желанию

Тексты приходят на языке запроса: у объекта, заведённого по-тайски, берётся перевод, и в ответе стоит пометка о нём (Р-063).

Параметры

kind запрос · string или null

stay / experience / service / transport / food / all

bbox запрос · string или null

minLon,minLat,maxLon,maxLat

near запрос · string или null

lat,lon

radius_m запрос · integer или null

q запрос · string или null

Текст запроса. Ищет по названию, описанию и месту объекта, на всех языках сразу и по словам: «вилла патонг» найдёт виллы Патонга. Отдельного фильтра места нет (Р-282)

date_from запрос · string (date) или null

date_to запрос · string (date) или null

guests запрос · integer или null

price_min запрос · integer или null

price_max запрос · integer или null

currency запрос · string или null

property_type запрос · массив string или null

room_type запрос · string или null

bedrooms_min запрос · integer или null

beds_min запрос · integer или null

bathrooms_min запрос · integer или null

beach_distance_max запрос · integer или null

pets_allowed запрос · boolean или null

smoking_allowed запрос · boolean или null

children_allowed запрос · boolean или null

Жильё: можно с детьми

parties_allowed запрос · boolean или null

Жильё: можно вечеринки

long_stay запрос · boolean или null

category_id запрос · массив integer или null

duration_max запрос · integer или null

languages запрос · массив string или null

group_size_max запрос · integer или null

same_day запрос · boolean или null

price_unit запрос · string или null

vehicle_kind запрос · массив string или null

transmission запрос · string или null

seats_min запрос · integer или null

food_format запрос · string или null

diets запрос · массив string или null

Отметки меню; нужны все сразу

alcohol запрос · boolean или null

amenities запрос · массив string или null

Коды удобств; нужны все сразу

instant_book запрос · boolean или null

rating_min запрос · number или null

sort запрос · string или null

relevance / price_asc / price_desc / rating / distance / new

limit запрос · integer или null

cursor запрос · string или null

Ответы

200Успешный ответ · app__schemas__search__FeedResponse

Поля ответа · 3

items массив app__schemas__search__ListingCard обязательно

next_cursor string или null

has_more boolean обязательно

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/search/listings'
GET/v1/search/map Метки и кластеры карты по тем же фильтрам, что и лента Без входа

Объекты в режиме city_only точки не имеют вовсе и на карту не попадают (Р-040) — их видно в ленте по своему городу.

Параметры

zoom запрос · integer обязательно

Зум карты: до 12 — кластеры, дальше метки

kind запрос · string или null

stay / experience / service / transport / food / all

bbox запрос · string или null

minLon,minLat,maxLon,maxLat

near запрос · string или null

lat,lon

radius_m запрос · integer или null

q запрос · string или null

Текст запроса. Ищет по названию, описанию и месту объекта, на всех языках сразу и по словам: «вилла патонг» найдёт виллы Патонга. Отдельного фильтра места нет (Р-282)

date_from запрос · string (date) или null

date_to запрос · string (date) или null

guests запрос · integer или null

price_min запрос · integer или null

price_max запрос · integer или null

currency запрос · string или null

property_type запрос · массив string или null

room_type запрос · string или null

bedrooms_min запрос · integer или null

beds_min запрос · integer или null

bathrooms_min запрос · integer или null

beach_distance_max запрос · integer или null

pets_allowed запрос · boolean или null

smoking_allowed запрос · boolean или null

children_allowed запрос · boolean или null

Жильё: можно с детьми

parties_allowed запрос · boolean или null

Жильё: можно вечеринки

long_stay запрос · boolean или null

category_id запрос · массив integer или null

duration_max запрос · integer или null

languages запрос · массив string или null

group_size_max запрос · integer или null

same_day запрос · boolean или null

price_unit запрос · string или null

vehicle_kind запрос · массив string или null

transmission запрос · string или null

seats_min запрос · integer или null

food_format запрос · string или null

diets запрос · массив string или null

Отметки меню; нужны все сразу

alcohol запрос · boolean или null

amenities запрос · массив string или null

Коды удобств; нужны все сразу

instant_book запрос · boolean или null

rating_min запрос · number или null

sort запрос · string или null

relevance / price_asc / price_desc / rating / distance / new

limit запрос · integer или null

cursor запрос · string или null

Ответы

200Успешный ответ · app__schemas__search__MapResponse

Поля ответа · 4

clusters массив app__schemas__search__MapCluster

points массив MapPoint

truncated boolean по умолчанию false

total integer по умолчанию 0

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/search/map'
GET/v1/search/count Сколько вариантов подходит — для кнопки «Показать N вариантов» Без входа

Отдельным лёгким запросом, а не полем ленты: панель фильтров пересчитывает число на каждой галочке, и тянуть ради этого двадцать карточек с фотографиями незачем.

Параметры

kind запрос · string или null

stay / experience / service / transport / food / all

bbox запрос · string или null

minLon,minLat,maxLon,maxLat

near запрос · string или null

lat,lon

radius_m запрос · integer или null

q запрос · string или null

Текст запроса. Ищет по названию, описанию и месту объекта, на всех языках сразу и по словам: «вилла патонг» найдёт виллы Патонга. Отдельного фильтра места нет (Р-282)

date_from запрос · string (date) или null

date_to запрос · string (date) или null

guests запрос · integer или null

price_min запрос · integer или null

price_max запрос · integer или null

currency запрос · string или null

property_type запрос · массив string или null

room_type запрос · string или null

bedrooms_min запрос · integer или null

beds_min запрос · integer или null

bathrooms_min запрос · integer или null

beach_distance_max запрос · integer или null

pets_allowed запрос · boolean или null

smoking_allowed запрос · boolean или null

children_allowed запрос · boolean или null

Жильё: можно с детьми

parties_allowed запрос · boolean или null

Жильё: можно вечеринки

long_stay запрос · boolean или null

category_id запрос · массив integer или null

duration_max запрос · integer или null

languages запрос · массив string или null

group_size_max запрос · integer или null

same_day запрос · boolean или null

price_unit запрос · string или null

vehicle_kind запрос · массив string или null

transmission запрос · string или null

seats_min запрос · integer или null

food_format запрос · string или null

diets запрос · массив string или null

Отметки меню; нужны все сразу

alcohol запрос · boolean или null

amenities запрос · массив string или null

Коды удобств; нужны все сразу

instant_book запрос · boolean или null

rating_min запрос · number или null

sort запрос · string или null

relevance / price_asc / price_desc / rating / distance / new

limit запрос · integer или null

cursor запрос · string или null

Ответы

200Успешный ответ · CountResponse

Поля ответа · 1

count integer обязательно

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/search/count'
GET/v1/search/price-range Границы ползунка цены раздела — в валюте человека (Р-275) Без входа

Остальные фильтры сюда не приходят намеренно: края ползунка, прыгающие от каждой галочки, не дают его двигать. Пересчёт тот же, что у фильтра цены (Р-218), — край не обещает цену, которой фильтр не найдёт.

Параметры

kind запрос · string или null

Раздел; без него — все пять

currency запрос · string или null

Валюта человека

Ответы

200Успешный ответ · PriceRangeResponse

Поля ответа · 4

currency string или null

min_minor integer или null

max_minor integer или null

histogram массив integer

Сколько объектов в каждом из 24 отрезков шкалы ползунка: шкала квадратичная от нуля (ручка в положении p означает цену max_minor · p²), отрезок i — p от i/24 до (i+1)/24. Пусто, когда цен нет

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/search/price-range'
GET/v1/search/suggest Подсказки строки поиска: места и объекты Без входа

Ищет по переводам названий мест, а не по кодам: человек пишет «Пхукет» или «Phuket», а не phuket-province.

Параметры

q запрос · string обязательно

kind запрос · string или null

Ответы

200Успешный ответ · SuggestResponse

Поля ответа · 2

places массив PlaceSuggestion

listings массив ListingSuggestion

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/search/suggest'

Карта

1 эндпоинт

Запасной путь тайлов и стиля карты через сервер Bounty, когда OpenFreeMap недоступен (Р-337). Вход не нужен.

GET/v1/map/<span class="text-brand-ink">{path}</span> Ресурс карты: стиль, TileJSON, тайл, шрифт, спрайт или рельеф Без входа

Отдаётся ровно тем же телом и теми же заголовками кеширования, что пришли от OpenFreeMap: клиент обязан кешировать тайлы так же, как при прямом пути, иначе запасная дорога стоила бы вдесятеро дороже прямой.

Параметры

path путь · string обязательно

Ответы

200Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/map/{path}'

События

6 эндпоинтов

Афиша города (Р-280): лента по дням, ближайшие события по одному на событие (страницами), полоска календаря, карта, страница события, справочник категорий. Дни и часы — в поясе площадки (правило №16). Вход не нужен.

GET/v1/events/categories Справочник категорий раздела на языке запроса Без входа

Объявлен до /{slug}: маршрут с параметром, стоящий раньше, перехватил бы слово categories как адрес события.

Ответы

200Успешный ответ · массив app__schemas__events__CategoryResponse

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/events/categories'
GET/v1/events/calendar Полоска календаря над лентой: сколько событий в каждом дне Без входа

Считается с теми же фильтрами, что и лента: выбранная категория меняет числа в полоске, иначе день с цифрой «12» открывался бы пустым. День самого запроса в расчёт не идёт — полоска показывает всё окно.

В сегодняшнем дне не считается то, что уже закончилось (находка №171) — ровно как в ленте. Остальных дней окна отсечка не касается: она привязана к сегодняшнему числу, а не к началу окна.

Параметры

first запрос · string (date) или null

Первый день окна; по умолчанию сегодня

days запрос · integer

day запрос · string (date) или null

День афиши в поясе площадки (правило №16). Без него — весь промежуток

day_from запрос · string (date) или null

Начало промежутка дней

day_to запрос · string (date) или null

Конец промежутка дней

category запрос · массив string или null

Коды категорий; подходит любая из перечисленных

entry запрос · string или null

free / paid / any

time запрос · string или null

morning / day / evening / any

audience запрос · string или null

family / adults / any

crowd запрос · массив string или null

intimate / small / medium / large; подходит любая

event_lang запрос · string или null

Язык события: ru / en / th / zh-Hans / multi (разноязычное) / any

q запрос · string или null

Текст запроса. Ищет по названию, описанию, площадке и месту события, на всех языках и по словам

bbox запрос · string или null

minLon,minLat,maxLon,maxLat

near запрос · string или null

lat,lon

radius_m запрос · integer или null

timezone запрос · string или null

Пояс, в котором считается «сегодня». По умолчанию — Asia/Bangkok

limit запрос · integer или null

cursor запрос · string или null

Ответы

200Успешный ответ · CalendarResponse

Поля ответа · 3

days массив CalendarDay обязательно

Дни окна по порядку, от first (по умолчанию — сегодня)

timezone string обязательно

Пояс, в котором считается «сегодня»

today string (date) обязательно

Сегодня в этом поясе — клетка «Сегодня» полоски

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/events/calendar'
GET/v1/events/upcoming Ближайшие события — по одному на событие, а не по дням Без входа

Для витрин, которые показывают афишу не целиком: ряд на главной, блок в письме, экран приложения. Лента им не годится — её единица день, и ежедневный ночной рынок занял бы весь ряд своими датами: в ближайших пятидесяти днях его двадцать два.

Карточка та же, что в ленте, и несёт свой ближайший подходящий день. Витрине хватает первой страницы; лента «Событий» без выбранного дня (Р-465) листает дальше по next_cursor — порядок тот же, что у ленты по дням: день, время начала, событие.

Смотрит на окно в ближайшие 30 дней (days). «Ближайшие события» — это то, что происходит на днях; событие через полгода в такой ряд не просится, даже если оно единственное. Окно заодно режет цену запроса: без него отбор читал бы все дни всех событий до горизонта раскрытия расписаний, а это сто восемьдесят дней на каждое.

Объявлен до /{slug}: маршрут с параметром, стоящий раньше, принял бы слово upcoming за адрес события.

Параметры

limit запрос · integer или null

days запрос · integer

Окно поиска в днях от сегодня. Не действует, если задан день или конец промежутка

with_total запрос · boolean

Добавить total — сколько всего событий подходит в окне

day запрос · string (date) или null

День афиши в поясе площадки (правило №16). Без него — весь промежуток

day_from запрос · string (date) или null

Начало промежутка дней

day_to запрос · string (date) или null

Конец промежутка дней

category запрос · массив string или null

Коды категорий; подходит любая из перечисленных

entry запрос · string или null

free / paid / any

time запрос · string или null

morning / day / evening / any

audience запрос · string или null

family / adults / any

crowd запрос · массив string или null

intimate / small / medium / large; подходит любая

event_lang запрос · string или null

Язык события: ru / en / th / zh-Hans / multi (разноязычное) / any

q запрос · string или null

Текст запроса. Ищет по названию, описанию, площадке и месту события, на всех языках и по словам

bbox запрос · string или null

minLon,minLat,maxLon,maxLat

near запрос · string или null

lat,lon

radius_m запрос · integer или null

timezone запрос · string или null

Пояс, в котором считается «сегодня». По умолчанию — Asia/Bangkok

cursor запрос · string или null

Ответы

200Успешный ответ · UpcomingResponse

Поля ответа · 4

items массив EventCard

next_cursor string или null

Курсор следующей страницы; null — страниц больше нет

has_more boolean по умолчанию false

Есть ли ещё события после этой страницы

total integer или null

Сколько событий подходит всего — только при with_total=true

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/events/upcoming'
GET/v1/events/map Метки и кружки карты по тем же фильтрам, что и лента Без входа

Событие приходит один раз — своим ближайшим подходящим днём, а не каждым. Лента идёт по дням, и еженедельная вечеринка стоит в ней пятнадцатью карточками; на карте те пятнадцать легли бы в одну точку стопкой, и человек видел бы одну метку, под которой спрятаны четырнадцать таких же.

Прошлые дни и прошедшие часы в карту не идут. Без заданного дня отсчёт начинается с сегодняшнего по поясу площадок, и из сегодняшнего выпадает уже закончившееся (находка №171): карта отвечает на вопрос «куда пойти», а не «что тут было». Метка события при этом не пропадает — оно приходит своим следующим днём.

Событие без точки на карту не попадает вовсе — площадку могли записать одним адресом, и ставить её в случайное место значило бы соврать о том, куда идти.

Объявлен до /{slug}: маршрут с параметром, стоящий раньше, принял бы слово map за адрес события.

Параметры

zoom запрос · integer обязательно

Зум карты: до 12 — кружки, дальше метки

day запрос · string (date) или null

День афиши в поясе площадки (правило №16). Без него — весь промежуток

day_from запрос · string (date) или null

Начало промежутка дней

day_to запрос · string (date) или null

Конец промежутка дней

category запрос · массив string или null

Коды категорий; подходит любая из перечисленных

entry запрос · string или null

free / paid / any

time запрос · string или null

morning / day / evening / any

audience запрос · string или null

family / adults / any

crowd запрос · массив string или null

intimate / small / medium / large; подходит любая

event_lang запрос · string или null

Язык события: ru / en / th / zh-Hans / multi (разноязычное) / any

q запрос · string или null

Текст запроса. Ищет по названию, описанию, площадке и месту события, на всех языках и по словам

bbox запрос · string или null

minLon,minLat,maxLon,maxLat

near запрос · string или null

lat,lon

radius_m запрос · integer или null

timezone запрос · string или null

Пояс, в котором считается «сегодня». По умолчанию — Asia/Bangkok

limit запрос · integer или null

cursor запрос · string или null

Ответы

200Успешный ответ · app__schemas__events__MapResponse

Поля ответа · 4

clusters массив app__schemas__events__MapCluster

points массив EventCard

truncated boolean по умолчанию false

total integer по умолчанию 0

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/events/map'
GET/v1/events Лента раздела: карточки событий выбранного дня, курсорная пагинация Без входа

Единица ленты — день события, а не само событие: еженедельная вечеринка попадает в ленту каждого своего вторника. Порядок внутри дня — по времени начала; события «весь день» идут последними.

Без заданного дня лента начинается с сегодняшнего по поясу площадок: прошедшие дни остаются в базе, но афише отвечать нечем — туда уже не сходить. По той же причине из сегодняшнего дня выпадает то, что уже закончилось (находка №171): концерт, доигравший в 14:00, не ответ на вопрос «куда пойти» в 19:00. Полоска календаря считает с той же отсечкой — иначе она обещала бы над лентой больше, чем лента показывает.

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

Тексты приходят на языке запроса, у переведённых стоит пометка (Р-063).

Параметры

with_total запрос · boolean

Добавить total — число подходящих событий

day запрос · string (date) или null

День афиши в поясе площадки (правило №16). Без него — весь промежуток

day_from запрос · string (date) или null

Начало промежутка дней

day_to запрос · string (date) или null

Конец промежутка дней

category запрос · массив string или null

Коды категорий; подходит любая из перечисленных

entry запрос · string или null

free / paid / any

time запрос · string или null

morning / day / evening / any

audience запрос · string или null

family / adults / any

crowd запрос · массив string или null

intimate / small / medium / large; подходит любая

event_lang запрос · string или null

Язык события: ru / en / th / zh-Hans / multi (разноязычное) / any

q запрос · string или null

Текст запроса. Ищет по названию, описанию, площадке и месту события, на всех языках и по словам

bbox запрос · string или null

minLon,minLat,maxLon,maxLat

near запрос · string или null

lat,lon

radius_m запрос · integer или null

timezone запрос · string или null

Пояс, в котором считается «сегодня». По умолчанию — Asia/Bangkok

limit запрос · integer или null

cursor запрос · string или null

Ответы

200Успешный ответ · app__schemas__events__FeedResponse

Поля ответа · 4

items массив EventCard обязательно

next_cursor string или null

has_more boolean по умолчанию false

total integer или null

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/events'
GET/v1/events/<span class="text-brand-ink">{slug}</span> Страница события по адресу Без входа

Черновик и снятое событие отдают 404, а не «скрыто»: ответ «есть, но не покажу» рассказывает о том, чего гостю знать не нужно.

Часы приходят вместе с timezone_notice — поясом площадки и пояснением о разнице с поясом гостя (правило №16). Показать «с 20:00» без пояса — та же ошибка, что показать цену без валюты.

Параметры

slug путь · string обязательно

Ответы

200Успешный ответ · EventResponse

Поля ответа · 27

id string (uuid) обязательно

slug string обязательно

title string обязательно

description string или null

editorial string или null

category app__schemas__events__CategoryResponse обязательно

Категория события: код для фильтра, название для человека.

photos массив app__schemas__events__PhotoResponse

schedule ScheduleResponse обязательно

Расписание в виде данных, а не готовой строки. Подпись («каждый вторник», «22–24 сентября») собирает клиент из своих локалей: склонение дней недели на четырёх языках разное, и собранная здесь строка приехала бы тайцу по-русски.

next_day string (date) или null

days массив EventDayBrief

time_from string или null

time_to string или null

timezone_notice TimezoneNotice обязательно

Пояс площадки и разница с поясом гостя (правило №16). label показывается всегда, hint — только когда пояс гостя отличается: иначе человек прочитает чужое время как своё.

venue string или null

address string или null

place app__schemas__events__PlaceBrief или null

lat number или null

lon number или null

price PriceResponse обязательно

Вход: свободный или платный. amount_minor в минорных единицах — как везде в проекте. note — то, что числом не выражается («с депозитом на бар»), и стоит рядом с ценой, а не вместо неё.

crowd string обязательно

audience string обязательно

langs массив string

source_url string или null

listings массив LinkedListing

original_lang string обязательно

translation app__schemas__events__TranslationMark или null

seo SeoTags или null

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/events/{slug}'

Объекты

5 эндпоинтов

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

GET/v1/listings/<span class="text-brand-ink">{listing_id}</span>/availability Календарь объекта: свободные даты, цена дня, минимальный срок Без входа

Параметры

listing_id путь · string (uuid) обязательно

from запрос · string (date) обязательно

to запрос · string (date) обязательно

Ответы

200Успешный ответ · AvailabilityResponse

Поля ответа · 6

listing_id string (uuid) обязательно

timezone string обязательно

regular_price_minor integer или null

Обычная цена объекта — от неё отличается «особая» (№111)

timezone_notice TimezoneNoticeBody обязательно

Готовая пометка о поясе объекта — клиент показывает её как есть.

currency string обязательно

days массив AvailabilityDay обязательно

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/listings/{listing_id}/availability'
GET/v1/listings/<span class="text-brand-ink">{listing_id}</span>/slots Свободные выходы впечатления или окна услуги Без входа

Параметры

listing_id путь · string (uuid) обязательно

from запрос · string (date) обязательно

to запрос · string (date) обязательно

Ответы

200Успешный ответ · SlotsResponse

Поля ответа · 7

listing_id string (uuid) обязательно

timezone string обязательно

timezone_notice TimezoneNoticeBody обязательно

Готовая пометка о поясе объекта — клиент показывает её как есть.

currency string обязательно

slots массив SlotBody обязательно

rates массив RateBody по умолчанию []

extras массив ExtraBody по умолчанию []

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/listings/{listing_id}/slots'
POST/v1/listings/<span class="text-brand-ink">{listing_id}</span>/quote Расчёт стоимости построчно Без входа

Даты заняты — приходит available: false и conflict_dates, а не пустой ответ: гость должен видеть, какие именно даты мешают, и подвинуть их.

Параметры

listing_id путь · string (uuid) обязательно

Тело запросаQuoteRequest · application/json

date_from string (date) или null

date_to string (date) или null

slot_id string (uuid) или null

guests integer по умолчанию 1

rates массив RatePick

extras массив ExtraPick

Ответы

200Успешный ответ · QuoteResponse

Поля ответа · 9

available boolean обязательно

currency string обязательно

nights integer обязательно

lines массив QuoteLine обязательно

total MoneyBody обязательно

Сумма всегда тремя полями: иначе клиент округлит её по-своему.

deposit MoneyBody или null

reason string или null

dates_unavailable / min_nights / max_nights / too_far / slot_closed / not_enough_seats / slot_taken / table_too_small

conflict_dates массив string (date) или null

min_nights integer или null

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/listings/{listing_id}/quote' \
  -H 'Content-Type: application/json' \
  -d '{"date_from": "2026-11-02", "date_to": "2026-11-02"}'
GET/v1/listings/<span class="text-brand-ink">{key}</span> Полная карточка объекта — по адресу или идентификатору Вход по желанию

Вход не нужен: выбирать можно без регистрации (Р-013). Вошедшему дополнительно видно, лежит ли объект у него в избранном.

Маршрут объявлен после /{listing_id}/availability и соседей: иначе он перехватил бы их пути, приняв «availability» за адрес объекта.

Параметры

key путь · string обязательно

Ответы

200Успешный ответ · object

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/listings/{key}'
GET/v1/listings/<span class="text-brand-ink">{key}</span>/similar Похожие рядом — тот же тип в том же месте Без входа

Параметры

key путь · string обязательно

Ответы

200Успешный ответ · object

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/listings/{key}/similar'

Бизнес

2 эндпоинта

Страница бизнеса-партнёра: о компании, объекты, отзывы. Вход не нужен.

GET/v1/partners/<span class="text-brand-ink">{partner_id}</span> Карточка бизнеса и его объекты одним ответом Вход по желанию

Одним, потому что страница без объектов — это пустая страница: два запроса означали бы, что человек сначала видит название компании, а через мгновение под ним появляются виллы и всё подпрыгивает.

Параметры

partner_id путь · string (uuid) обязательно

Ответы

200Успешный ответ · PartnerPage

Поля ответа · 2

partner PartnerCard обязательно

Бизнес глазами гостя.

listings массив app__schemas__search__ListingCard

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/partners/{partner_id}'
GET/v1/partners/<span class="text-brand-ink">{partner_id}</span>/reviews Отзывы по всем объектам бизнеса, свежие сверху Без входа

Одной лентой, а не по объектам: человек хочет понять, как эта компания работает вообще, а не листать отзывы двадцати вилл по очереди.

Параметры

partner_id путь · string (uuid) обязательно

cursor запрос · string или null

limit запрос · integer

Ответы

200Успешный ответ · PartnerReviews

Поля ответа · 3

items массив ReviewBody

next_cursor string или null

has_more boolean по умолчанию false

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/partners/{partner_id}/reviews'

Бронирования

8 эндпоинтов

Оформление, список, бронь целиком, отмена с расчётом возврата, лента заказа, билет заселения. Нужна подтверждённая почта. Создание принимает Idempotency-Key.

GET/v1/bookings Мои поездки, новые сверху Нужен вход Почта подтверждена

scope отбирает по ходу поездки. Без него список остаётся прежним — всё подряд: это умолчание держит старых клиентов, которые про scope не знают. Порядок от scope не зависит, см. booking_service.page.

Параметры

status запрос · BookingStatus или null

scope запрос · string или null

Вкладки S63: upcoming — живые и не закончившиеся, completed — завершённые (в том числе неявка), cancelled — отменённые, отклонённые и просроченные; past — completed и cancelled вместе; all — всё (умолчание)

with_counts запрос · boolean

Добавить counts — числа на трёх вкладках

limit запрос · integer или null

cursor запрос · string или null

Ответы

200Успешный ответ · BookingPage

Поля ответа · 4

items массив BookingBrief обязательно

next_cursor string или null

has_more boolean по умолчанию false

counts BookingCounts или null

Только при with_counts=true

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/bookings' \
  -H 'Authorization: Bearer <access>'
POST/v1/bookings Создаёт бронь. Мгновенная сразу подтверждена, по запросу — pending Нужен вход Почта подтверждена

Тело запросаBookingCreate · application/json

listing_id string (uuid) обязательно

date_from string (date) или null

date_to string (date) или null

slot_id string (uuid) или null

contract_id string (uuid) или null

guests_adults integer по умолчанию 1

guests_children integer по умолчанию 0

guests_infants integer по умолчанию 0

pets integer по умолчанию 0

guest_message string или null

guests_details массив GuestDetails

contact_phone string или null

rates массив RatePick

extras массив ExtraPick

Ответы

201Успешный ответ · BookingDetail

Поля ответа · 53

id string (uuid) обязательно

code string обязательно

status string обязательно

kind string обязательно

booking_kind string по умолчанию "nightly"

nightly / contract (Р-122). У контракта расчёт идёт вне сервиса (В-34)

date_from string (date) или null

date_to string (date) или null

nights integer или null

starts_at string (date-time) или null

ends_at string (date-time) или null

Конец выхода у брони впечатления, услуги, еды (нехватка №35)

guests integer обязательно

total MoneyBody обязательно

Сумма всегда тремя полями: иначе клиент округлит её по-своему.

payment_status string обязательно

respond_by string (date-time) или null

Докуда хозяин отвечает на запрос. Плашка «Ответит до» — пока status = pending

pay_by string (date-time) или null

Докуда ждём оплату подтверждённой брони (Р-183). Плашка «Оплатить до» — пока status = confirmed и payment_status = none

pay_expired boolean по умолчанию false

Подтверждённую бронь не оплатили к сроку, и она закрылась (Р-400)

review_until string (date-time) или null

До какого момента можно написать отзыв; пусто — нельзя или уже написан

has_review boolean по умолчанию false

Гость уже оставил отзыв по этой брони

listing ListingBrief обязательно

Объект в карточке брони — столько, сколько нужно, чтобы его узнать.

created_at string (date-time) обязательно

lines массив QuoteLine обязательно

deposit MoneyBody или null

free_cancel_until string (date-time) или null

free_cancel_last_day string (date) или null

Последний день бесплатной отмены, включительно, в поясе объекта (Р-243)

policy PolicyBody или null

Условия, действующие сегодня

policies массив PolicyBody

Все условия, которые могут сработать между сегодня и выездом (Р-204): основные и сезонные, попадающие на даты поездки

timezone_notice object или null

Пометка о поясе объекта (правило №16): label — чьё это время, hint — пояснение о разнице, когда пояс гостя другой

pay_closed boolean по умолчанию false

Время на оплату вышло: форма банка гаснет за минуту до pay_by (Р-396), оплатить уже нельзя (409 booking_payment_expired)

guest_message string или null

address string или null

directions string или null

directions_original string или null

Оригинал «как добраться», когда directions пришло переводом; null — показан оригинал (сейчас это поле не переводится)

point object или null

Точка объекта {lat, lon} для карты — та же, что на странице объекта (Р-201)

checkin_from string или null

checkout_until string или null

required_documents массив string

«Что взять с собой» — коды документов объекта (passport, deposit_cash…), подписи — строками listing.checkin_doc.<код> (нехватка №55)

house_rules string или null

Правила дома на языке запроса, где перевод готов (№90)

can_cancel boolean обязательно

can_check_in_now boolean обязательно

Примут ли код на стойке прямо сейчас. Показом кода не управляет (Р-158)

guest_details object

Данные участников: режим объекта (optional/required), сколько нужно и заполнено, можно ли платить (ready) и править (editable — до оплаты, Р-352)

contact_phone string или null

Телефон для связи по заказу (Р-352). Правится до оплаты вместе с участниками

confirmed_at string (date-time) или null

paid_at string (date-time) или null

cancelled_at string (date-time) или null

declined_at string (date-time) или null

checkin_at string (date-time) или null

checkout_at string (date-time) или null

cancelled_by_kind string или null

thread_id string (uuid) или null

timezone string или null

details object

pay_options массив object

snapshot object

Снимок покупки на момент оформления (Р-161): объект, единица фонда, партнёр, условия и политика отмены. Не меняется никогда — чек обязан показывать то, что человек купил тогда, а не сегодняшнюю карточку. Адреса в снимке нет: он хранится зашифрованным

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/bookings' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"listing_id": "00000000-0000-0000-0000-000000000000"}'
GET/v1/bookings/<span class="text-brand-ink">{booking_id}</span> Карточка брони. Адрес открывается только по подтверждённой Нужен вход Почта подтверждена

Параметры

booking_id путь · string (uuid) обязательно

Ответы

200Успешный ответ · BookingDetail

Поля ответа · 53

id string (uuid) обязательно

code string обязательно

status string обязательно

kind string обязательно

booking_kind string по умолчанию "nightly"

nightly / contract (Р-122). У контракта расчёт идёт вне сервиса (В-34)

date_from string (date) или null

date_to string (date) или null

nights integer или null

starts_at string (date-time) или null

ends_at string (date-time) или null

Конец выхода у брони впечатления, услуги, еды (нехватка №35)

guests integer обязательно

total MoneyBody обязательно

Сумма всегда тремя полями: иначе клиент округлит её по-своему.

payment_status string обязательно

respond_by string (date-time) или null

Докуда хозяин отвечает на запрос. Плашка «Ответит до» — пока status = pending

pay_by string (date-time) или null

Докуда ждём оплату подтверждённой брони (Р-183). Плашка «Оплатить до» — пока status = confirmed и payment_status = none

pay_expired boolean по умолчанию false

Подтверждённую бронь не оплатили к сроку, и она закрылась (Р-400)

review_until string (date-time) или null

До какого момента можно написать отзыв; пусто — нельзя или уже написан

has_review boolean по умолчанию false

Гость уже оставил отзыв по этой брони

listing ListingBrief обязательно

Объект в карточке брони — столько, сколько нужно, чтобы его узнать.

created_at string (date-time) обязательно

lines массив QuoteLine обязательно

deposit MoneyBody или null

free_cancel_until string (date-time) или null

free_cancel_last_day string (date) или null

Последний день бесплатной отмены, включительно, в поясе объекта (Р-243)

policy PolicyBody или null

Условия, действующие сегодня

policies массив PolicyBody

Все условия, которые могут сработать между сегодня и выездом (Р-204): основные и сезонные, попадающие на даты поездки

timezone_notice object или null

Пометка о поясе объекта (правило №16): label — чьё это время, hint — пояснение о разнице, когда пояс гостя другой

pay_closed boolean по умолчанию false

Время на оплату вышло: форма банка гаснет за минуту до pay_by (Р-396), оплатить уже нельзя (409 booking_payment_expired)

guest_message string или null

address string или null

directions string или null

directions_original string или null

Оригинал «как добраться», когда directions пришло переводом; null — показан оригинал (сейчас это поле не переводится)

point object или null

Точка объекта {lat, lon} для карты — та же, что на странице объекта (Р-201)

checkin_from string или null

checkout_until string или null

required_documents массив string

«Что взять с собой» — коды документов объекта (passport, deposit_cash…), подписи — строками listing.checkin_doc.<код> (нехватка №55)

house_rules string или null

Правила дома на языке запроса, где перевод готов (№90)

can_cancel boolean обязательно

can_check_in_now boolean обязательно

Примут ли код на стойке прямо сейчас. Показом кода не управляет (Р-158)

guest_details object

Данные участников: режим объекта (optional/required), сколько нужно и заполнено, можно ли платить (ready) и править (editable — до оплаты, Р-352)

contact_phone string или null

Телефон для связи по заказу (Р-352). Правится до оплаты вместе с участниками

confirmed_at string (date-time) или null

paid_at string (date-time) или null

cancelled_at string (date-time) или null

declined_at string (date-time) или null

checkin_at string (date-time) или null

checkout_at string (date-time) или null

cancelled_by_kind string или null

thread_id string (uuid) или null

timezone string или null

details object

pay_options массив object

snapshot object

Снимок покупки на момент оформления (Р-161): объект, единица фонда, партнёр, условия и политика отмены. Не меняется никогда — чек обязан показывать то, что человек купил тогда, а не сегодняшнюю карточку. Адреса в снимке нет: он хранится зашифрованным

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/bookings/{booking_id}' \
  -H 'Authorization: Bearer <access>'
GET/v1/bookings/<span class="text-brand-ink">{booking_id}</span>/refund-preview Сколько вернётся, если отменить прямо сейчас Нужен вход Почта подтверждена

Отдельным эндпоинтом, а не текстом в карточке: сумма зависит от момента, и гость должен видеть её до нажатия, а не узнавать после.

Параметры

booking_id путь · string (uuid) обязательно

Ответы

200Успешный ответ · RefundBody

Поля ответа · 8

amount MoneyBody обязательно

Сумма всегда тремя полями: иначе клиент округлит её по-своему.

percent integer обязательно

free boolean обязательно

Отмена попала в бесплатное окно

reason string обязательно

free_window / policy / cancelled_by_partner

days_until integer или null

Суток до заезда в поясе объекта

free_cancel_until string (date-time) или null

policy PolicyBody или null

policy_seasonal boolean по умолчанию false

Сейчас действуют сезонные условия, а не основные (Р-204)

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/bookings/{booking_id}/refund-preview' \
  -H 'Authorization: Bearer <access>'
POST/v1/bookings/<span class="text-brand-ink">{booking_id}</span>/cancel Отмена гостем. В ответе — сумма возврата Нужен вход Почта подтверждена

Параметры

booking_id путь · string (uuid) обязательно

Тело запросаCancelRequest · application/json

reason_code string или null

comment string или null

Ответы

200Успешный ответ · RefundBody

Поля ответа · 8

amount MoneyBody обязательно

Сумма всегда тремя полями: иначе клиент округлит её по-своему.

percent integer обязательно

free boolean обязательно

Отмена попала в бесплатное окно

reason string обязательно

free_window / policy / cancelled_by_partner

days_until integer или null

Суток до заезда в поясе объекта

free_cancel_until string (date-time) или null

policy PolicyBody или null

policy_seasonal boolean по умолчанию false

Сейчас действуют сезонные условия, а не основные (Р-204)

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/bookings/{booking_id}/cancel' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"reason_code": "…", "comment": "…"}'
GET/v1/bookings/<span class="text-brand-ink">{booking_id}</span>/guests Кто едет: список проживающих (Р-197) Нужен вход Почта подтверждена

Приходит заполненным наполовину: первая строка — сам заказчик, из его профиля, остальные пустые по числу людей в брони. Заставлять человека переписывать в форму собственные имя и возраст, которые сервис и так знает, — верный способ получить незаполненную форму.

Параметры

booking_id путь · string (uuid) обязательно

Ответы

200Успешный ответ · массив StayGuestBody

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/bookings/{booking_id}/guests' \
  -H 'Authorization: Bearer <access>'
PUT/v1/bookings/<span class="text-brand-ink">{booking_id}</span>/guests Переписывает список участников целиком — и телефон для связи (Р-352) Нужен вход Почта подтверждена

Пустые строки не сохраняются. У объекта с guest_details = required данные всех участников обязательны и стереть их правкой нельзя — 400 guest_details_required. contact_phone не передан — не меняется, пустой — 400 phone_required.

Правится только до оплаты (Р-352): оплатой человек подтвердил, кого и как везут, и партнёр по этим данным оформляет страховку. Оплаченная или закрытая бронь отвечает 409 guests_locked.

Параметры

booking_id путь · string (uuid) обязательно

Тело запросаStayGuestsRequest · application/json

guests массив StayGuestIn

contact_phone string или null

Ответы

200Успешный ответ · массив StayGuestBody

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X PUT 'https://api.mybounty.org/v1/bookings/{booking_id}/guests' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"guests": [{}], "contact_phone": "…"}'
GET/v1/bookings/<span class="text-brand-ink">{booking_id}</span>/qr Билет заселения (Р-066) Нужен вход Почта подтверждена

Клиент рисует QR из строки сам: картинка с сервера не нужна и лишний раз светит бронь в кешах. Рядом с кодом печатается номер брони — им заселяют, когда камера не справилась.

Параметры

booking_id путь · string (uuid) обязательно

Ответы

200Успешный ответ · TicketResponse

Поля ответа · 3

ticket string обязательно

code string обязательно

Номер брони: печатается рядом с кодом

expires_at string (date-time) обязательно

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/bookings/{booking_id}/qr' \
  -H 'Authorization: Bearer <access>'

Оплата

2 эндпоинта

Оплата брони и заказа через Т-Банк (на стенде — только демо-терминал, Р-350), состояние платежа. Нужна подтверждённая почта.

POST/v1/bookings/<span class="text-brand-ink">{booking_id}</span>/payment Начинает оплату и возвращает адрес страницы банка Нужен вход Почта подтверждена

Платить можно только подтверждённую бронь: пока партнёр не ответил, он ещё может отказать, и деньги пришлось бы возвращать.

Параметры

booking_id путь · string (uuid) обязательно

Тело запросаPaymentStart · application/json

return_url string или null

Адрес возврата. Пустой — вернём на карточку брони в вебе

policy_accepted boolean по умолчанию true

Гость видел условия отмены и согласился с ними

Ответы

200Успешный ответ · PaymentStarted

Поля ответа · 3

payment_id string обязательно

url string обязательно

Страница банка — сюда уводят человека

status string обязательно

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/bookings/{booking_id}/payment' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"return_url": "…", "policy_accepted": true}'
GET/v1/payments/confirm Проверяет платёж после возврата из банка Нужен вход Почта подтверждена

Номер платежа приходит из адреса, а состояние — из запроса к провайдеру: адрес человек правит руками, и «оплачено» в нём не значит ничего.

Параметры

payment_id запрос · string обязательно

Ответы

200Успешный ответ · PaymentResult

Поля ответа · 3

paid boolean обязательно

booking_id string (uuid) или null

payment_status string или null

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/payments/confirm' \
  -H 'Authorization: Bearer <access>'

Долгосрочная аренда

5 эндпоинтов

Договоры аренды от месяца (Р-130): стадии, задаток, документ, подписи, чеки. Нужна подтверждённая почта.

GET/v1/rentals Мои долгосрочные заявки Нужен вход Почта подтверждена

Параметры

limit запрос · integer

offset запрос · integer

Ответы

200Успешный ответ · RentalPage

Поля ответа · 2

items массив RentalBrief обязательно

total integer обязательно

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/rentals' \
  -H 'Authorization: Bearer <access>'
GET/v1/rentals/<span class="text-brand-ink">{booking_id}</span> Состояние сделки: что уже сделано, чей сейчас ход и все её чеки Нужен вход Почта подтверждена

Параметры

booking_id путь · string (uuid) обязательно

Ответы

200Успешный ответ · RentalDetail

Поля ответа · 44

id string (uuid) обязательно

booking_id string (uuid) обязательно

stage string обязательно

negotiating / awaiting_document / awaiting_signatures / signed / cancelled. living / handover / completed — стадии прежнего пути: встречаются у договоров, закрытых до Р-194, и новыми не становятся

months integer обязательно

price_minor integer обязательно

deposit_minor integer обязательно

currency string обязательно

document_name string или null

document_size integer или null

has_document boolean по умолчанию false

guest_signed_at string (date-time) или null

partner_signed_at string (date-time) или null

sign_deadline_at string (date-time) или null

sign_expired boolean по умолчанию false

Срок вышел: подпись больше не принимается

deposit_paid_at string (date-time) или null

settled_at string (date-time) или null

cancelled_at string (date-time) или null

cancel_reason string или null

completed_at string (date-time) или null

terminated_at string (date-time) или null

terminated_by string или null

guest / partner

terminate_reason string или null

handover_at string (date-time) или null

code string обязательно

listing_id string (uuid) обязательно

listing_title string обязательно

listing_slug string обязательно

listing_photo object или null

Первый снимок объекта размерами thumb/medium/large (нехватка №44)

partner_name string обязательно

partner_legal_name string или null

date_from string (date) или null

date_to string (date) или null

waiting_for string обязательно

guest / partner / none — чей сейчас ход

price MoneyBody или null

deposit MoneyBody или null

thread_id string (uuid) или null

can_sign boolean по умолчанию false

stages массив string

Стадии в порядке жизни

snapshot object

created_at string (date-time) или null

confirmed_at string (date-time) или null

payment_status string или null

guest_name string или null

total MoneyBody или null

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/rentals/{booking_id}' \
  -H 'Authorization: Bearer <access>'
GET/v1/rentals/<span class="text-brand-ink">{booking_id}</span>/document Договор потоком. Прямой ссылки на приватный файл не существует Нужен вход Почта подтверждена

Параметры

booking_id путь · string (uuid) обязательно

Ответы

200Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/rentals/{booking_id}/document' \
  -H 'Authorization: Bearer <access>'
POST/v1/rentals/<span class="text-brand-ink">{booking_id}</span>/sign Согласие с договором — и конец пути (Р-194) Нужен вход Почта подтверждена

Подписывает гость: партнёр расписался тем, что приложил договор и закрепил за ним номер с датами. С этой подписью договор заключён, изменению не подлежит, а его дни становятся занятыми.

После срока (семь дней от приложения) — 409 sign_expired: подпись больше не принимается, и партнёр решает, прислать договор заново или отменить сделку.

Параметры

booking_id путь · string (uuid) обязательно

Ответы

200Успешный ответ · RentalBody

Поля ответа · 23

id string (uuid) обязательно

booking_id string (uuid) обязательно

stage string обязательно

negotiating / awaiting_document / awaiting_signatures / signed / cancelled. living / handover / completed — стадии прежнего пути: встречаются у договоров, закрытых до Р-194, и новыми не становятся

months integer обязательно

price_minor integer обязательно

deposit_minor integer обязательно

currency string обязательно

document_name string или null

document_size integer или null

has_document boolean по умолчанию false

guest_signed_at string (date-time) или null

partner_signed_at string (date-time) или null

sign_deadline_at string (date-time) или null

sign_expired boolean по умолчанию false

Срок вышел: подпись больше не принимается

deposit_paid_at string (date-time) или null

settled_at string (date-time) или null

cancelled_at string (date-time) или null

cancel_reason string или null

completed_at string (date-time) или null

terminated_at string (date-time) или null

terminated_by string или null

guest / partner

terminate_reason string или null

handover_at string (date-time) или null

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/rentals/{booking_id}/sign' \
  -H 'Authorization: Bearer <access>'
POST/v1/rentals/<span class="text-brand-ink">{booking_id}</span>/cancel Отказ от сделки — до подписи (Р-194) Нужен вход Почта подтверждена

После подписи договор заключён между сторонами, и расторгают его они сами: сервис не сторона этой бумаги. Такой вызов — 409 already_signed.

Параметры

booking_id путь · string (uuid) обязательно

Тело запросаRentalCancel · application/json

reason string или null

Ответы

200Успешный ответ · RentalBody

Поля ответа · 23

id string (uuid) обязательно

booking_id string (uuid) обязательно

stage string обязательно

negotiating / awaiting_document / awaiting_signatures / signed / cancelled. living / handover / completed — стадии прежнего пути: встречаются у договоров, закрытых до Р-194, и новыми не становятся

months integer обязательно

price_minor integer обязательно

deposit_minor integer обязательно

currency string обязательно

document_name string или null

document_size integer или null

has_document boolean по умолчанию false

guest_signed_at string (date-time) или null

partner_signed_at string (date-time) или null

sign_deadline_at string (date-time) или null

sign_expired boolean по умолчанию false

Срок вышел: подпись больше не принимается

deposit_paid_at string (date-time) или null

settled_at string (date-time) или null

cancelled_at string (date-time) или null

cancel_reason string или null

completed_at string (date-time) или null

terminated_at string (date-time) или null

terminated_by string или null

guest / partner

terminate_reason string или null

handover_at string (date-time) или null

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/rentals/{booking_id}/cancel' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"reason": "…"}'

Чат

10 эндпоинтов

Переписка с партнёрами и поддержкой: диалоги, сообщения, вложения, голосовые, прочтение. Realtime — WebSocket /v1/ws. Нужна подтверждённая почта.

GET/v1/dialogs Мои диалоги, свежие сверху; с q — только те, где нашлось Нужен вход Почта подтверждена

Параметры

q запрос · string или null

Поиск (нехватка №39): имя хозяина, название объекта, номер брони, тема обращения, текст сообщений — оригинал и перевод на языке запроса. Скрытые контакты не ищутся

Ответы

200Успешный ответ · DialogList

Поля ответа · 1

items массив DialogBody обязательно

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/dialogs' \
  -H 'Authorization: Bearer <access>'
POST/v1/dialogs Открывает переписку с бизнесом — по бизнесу, объекту или брони Нужен вход Почта подтверждена

Переписка одна на пару «гость — бизнес» (Р-484): со страницы бизнеса, с объявления и из брони открывается одна и та же, объект к ней не прикрепляется — о нём пишут ссылкой. Ответ — переписка целиком, как в списке.

Тело запросаDialogOpen · application/json

partner_id string (uuid) или null

Бизнес — со страницы бизнеса

listing_id string (uuid) или null

Объект — с объявления

booking_id string (uuid) или null

Бронь — бизнес этой брони

Ответы

200Успешный ответ · DialogBody

Поля ответа · 22

id string (uuid) обязательно

kind string обязательно

status string обязательно

subject string или null

listing_id string (uuid) или null

Объект ленты заказа (booking); у переписки с бизнесом — null (Р-484)

listing_title string или null

listing_slug string или null

Чтобы из ленты заказа открыть сам объект

listing_photo object или null

Размеры первого снимка объекта; large может отсутствовать

booking_id string (uuid) или null

partner_id string (uuid) или null

partner_name string или null

partner_logo_url string или null

partner_kind string или null

Раздел бизнеса (stay · experience · service · transport · food) — подпись строки (Р-484)

unread integer по умолчанию 0

last_message_at string (date-time) или null

last_message_preview string или null

Последняя реплика без значков (нехватка №38): текст, у голосового — длительность «0:12», у документа — имя файла

last_message_type string или null

Вид последнего сообщения: text · photo · voice · document · event — по нему клиент рисует значок у превью

last_event_code string или null

last_event_payload object

contacts_hidden boolean по умолчанию false

Всегда false: контакты не скрываются (Р-485), поле — ради старых клиентов

topic string или null

Тема обращения в поддержку кодом (Р-476); у прочих — null

last_message_mine boolean по умолчанию false

Последнее сообщение написал сам гость — «Вы: …» (№56)

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/dialogs' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"partner_id": "00000000-0000-0000-0000-000000000000", "listing_id": "00000000-0000-0000-0000-000000000000"}'
POST/v1/dialogs/support Обращение в поддержку. Открытое обращение у человека одно Нужен вход Почта подтверждена

Тело запросаSupportOpen · application/json

subject string или null

topic booking | payment | listing | account | other или null

Тема кодом (Р-476, нехватка №58): ставится и открытому обращению, пока темы нет

Ответы

200Успешный ответ · DialogBody

Поля ответа · 22

id string (uuid) обязательно

kind string обязательно

status string обязательно

subject string или null

listing_id string (uuid) или null

Объект ленты заказа (booking); у переписки с бизнесом — null (Р-484)

listing_title string или null

listing_slug string или null

Чтобы из ленты заказа открыть сам объект

listing_photo object или null

Размеры первого снимка объекта; large может отсутствовать

booking_id string (uuid) или null

partner_id string (uuid) или null

partner_name string или null

partner_logo_url string или null

partner_kind string или null

Раздел бизнеса (stay · experience · service · transport · food) — подпись строки (Р-484)

unread integer по умолчанию 0

last_message_at string (date-time) или null

last_message_preview string или null

Последняя реплика без значков (нехватка №38): текст, у голосового — длительность «0:12», у документа — имя файла

last_message_type string или null

Вид последнего сообщения: text · photo · voice · document · event — по нему клиент рисует значок у превью

last_event_code string или null

last_event_payload object

contacts_hidden boolean по умолчанию false

Всегда false: контакты не скрываются (Р-485), поле — ради старых клиентов

topic string или null

Тема обращения в поддержку кодом (Р-476); у прочих — null

last_message_mine boolean по умолчанию false

Последнее сообщение написал сам гость — «Вы: …» (№56)

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/dialogs/support' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"subject": "…", "topic": "booking"}'
GET/v1/dialogs/<span class="text-brand-ink">{dialog_id}</span>/messages Лента сообщений, новые снизу Нужен вход Почта подтверждена

before_id листает историю вверх, after_id добирает пропущенное вперёд: клиент, у которого не открылся сокет, спрашивает «что было после этого номера», а не «последние тридцать».

with_deleted — по запросу, а не всегда: ленту читают и клиенты, которые заглушку рисовать не умеют (лента заказа, выпущенные приложения), — у них удалённое вышло бы пустым пузырём.

Параметры

dialog_id путь · string (uuid) обязательно

before_id запрос · integer или null

История вверх: «дай N до этого id»

after_id запрос · integer или null

Добор вперёд: «дай всё после этого id»

limit запрос · integer

with_deleted запрос · boolean

Вместе с удалёнными — заглушкой deleted: true без текста и файла (нехватка №57); без флага их нет, как раньше

Ответы

200Успешный ответ · MessagePage

Поля ответа · 2

items массив MessageBody обязательно

has_more boolean по умолчанию false

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/dialogs/{dialog_id}/messages' \
  -H 'Authorization: Bearer <access>'
POST/v1/dialogs/<span class="text-brand-ink">{dialog_id}</span>/messages Отправляет сообщение Нужен вход Почта подтверждена

Перевод для собеседника ставится после ответа (Р-064): это сетевой вызов к модели, и держать на нём отправителя незачем. Оригинал уйдёт сразу, перевод догонит событием message.translated.

Параметры

dialog_id путь · string (uuid) обязательно

Тело запросаMessageSend · application/json

text string или null

upload_id string (uuid) или null

reply_to_id integer или null

listing_id string (uuid) или null

Карточка объекта над сообщением (Р-484): гость пишет с объявления. Только в переписке с бизнесом и только объект этого бизнеса — иначе 400 validation_error

Ответы

200Успешный ответ · MessageBody

Поля ответа · 28

id integer обязательно

dialog_id string (uuid) обязательно

sender_kind string обязательно

sender_id string (uuid) или null

type string обязательно

text string или null

Что показывать: перевод, если он есть, иначе оригинал

text_original string или null

Как написал человек. Заполнено, только когда есть перевод

translated boolean по умолчанию false

Текст показан в переводе (Р-064)

lang string или null

contacts_hidden boolean по умолчанию false

Всегда false: контакты не скрываются (Р-485), поле — ради старых клиентов

listing_id string (uuid) или null

Объект, с которого гость написал (Р-484)

listing app__schemas__chat__ListingCard или null

Его карточка; объект снят — null при заполненном listing_id

is_official boolean по умолчанию false

Сообщение администрации

links массив MessageLink

Ссылки показанного текста text (Р-484)

links_original массив MessageLink

Ссылки оригинала text_original, когда есть перевод

system_code string или null

payload object

reply_to_id integer или null

file_url string или null

file_name string или null

file_size integer или null

duration_sec integer или null

waveform массив integer или null

Волна громкости голосового: 48 уровней 0–100 (нехватка №40). Пусто у документа и фото и у голосовых до 15.10.2026

width integer или null

height integer или null

deleted boolean по умолчанию false

Удалено автором (№57): заглушка без текста, файла и перевода

created_at string (date-time) обязательно

read_at string (date-time) или null

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/dialogs/{dialog_id}/messages' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"text": "…", "upload_id": "00000000-0000-0000-0000-000000000000"}'
POST/v1/dialogs/<span class="text-brand-ink">{dialog_id}</span>/files Пакет документов: до десяти файлов и двадцать мегабайт суммарно (Р-205) Нужен вход Почта подтверждена

Каждый файл сначала загружается обычным POST /v1/uploads, а сюда приходят их идентификаторы. Отправка одна: для человека это одно действие, и в переписке оно должно выглядеть одним событием.

Лимит скорости — тот же, что у сообщений: пакет считается одной отправкой, иначе десять файлов упирались бы в секундный потолок на середине.

Параметры

dialog_id путь · string (uuid) обязательно

Тело запросаFilesSend · application/json

upload_ids массив string (uuid) обязательно

Ответы

200Успешный ответ · массив MessageBody

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/dialogs/{dialog_id}/files' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"upload_ids": ["00000000-0000-0000-0000-000000000000"]}'
DELETE/v1/dialogs/<span class="text-brand-ink">{dialog_id}</span>/messages/<span class="text-brand-ink">{message_id}</span> Убирает СВОЁ сообщение из переписки Нужен вход Почта подтверждена

Человек написал не то и хочет это убрать — обычное дело, и запрещать незачем. Из базы сообщение при этом не пропадает (правило №6): спор о броне разбирается через месяцы, и «гость удалил сообщение» не должно означать «доказательств нет».

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

Параметры

dialog_id путь · string (uuid) обязательно

message_id путь · integer обязательно

Ответы

204Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X DELETE 'https://api.mybounty.org/v1/dialogs/{dialog_id}/messages/{message_id}' \
  -H 'Authorization: Bearer <access>'
POST/v1/dialogs/<span class="text-brand-ink">{dialog_id}</span>/read Помечает прочитанным до указанного сообщения включительно Нужен вход Почта подтверждена

Параметры

dialog_id путь · string (uuid) обязательно

Тело запросаapp__schemas__chat__ReadRequest · application/json

up_to_id integer или null

Ответы

200Успешный ответ · object

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/dialogs/{dialog_id}/read' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"up_to_id": 0}'
POST/v1/uploads Загружает вложение до отправки сообщения Нужен вход Почта подтверждена

Файлы в WebSocket не летят вовсе: разрыв связи посреди отправки терял бы и файл, и сообщение сразу.

Тело запросаBody_upload_v1_uploads_post · multipart/form-data

kind string обязательно

photo / voice / document

file string обязательно

Ответы

200Успешный ответ · UploadResponse

Поля ответа · 7

id string (uuid) обязательно

type string обязательно

file_name string или null

file_size integer или null

duration_sec integer или null

Длительность голосового в секундах — измеряется при загрузке

waveform массив integer или null

Волна громкости голосового: 48 уровней 0–100 (нехватка №40). Пусто у документа и фото и у голосовых до 15.10.2026

url string или null

Только для фотографий: они лежат в публичном бакете. Голос и документы отдаются потоком через /v1/media

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/uploads' \
  -H 'Authorization: Bearer <access>' \
  -F 'file=@photo.jpg'
GET/v1/messages/<span class="text-brand-ink">{message_id}</span>/file Приватное вложение диалога: голосовое или документ Нужен вход Почта подтверждена

Отдаётся потоком после проверки прав, а не ссылкой: файл лежит в приватном бакете, и ссылка из истории браузера без действующей сессии участника ничего не откроет (правило №7).

Параметры

message_id путь · integer обязательно

Ответы

200Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/messages/{message_id}/file' \
  -H 'Authorization: Bearer <access>'

Уведомления

7 эндпоинтов

Лента уведомлений, прочтение, пуш-устройства (Р-424), отписка по ссылке из письма (без входа).

GET/v1/notifications Лента: ключи и параметры, тексты собирает клиент (docs/api.md §3) Нужен вход Почта подтверждена

Название объекта в параметрах — уже на языке запроса (находка №85).

Параметры

cursor запрос · string или null

limit запрос · integer или null

Ответы

200Успешный ответ · NotificationPage

Поля ответа · 4

items массив NotificationBody обязательно

next_cursor string или null

has_more boolean по умолчанию false

unread integer по умолчанию 0

Сколько непрочитанных всего

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/notifications' \
  -H 'Authorization: Bearer <access>'
POST/v1/notifications/read Отметить уведомления прочитанными — до up_to_id включительно или все Нужен вход Почта подтверждена

Ответ — {"read": сколько отмечено, "unread": сколько осталось}: число у колокольчика (/v1/me/badges) клиент берёт отсюда, без второго запроса.

Тело запросаapp__schemas__notifications__ReadRequest · application/json

up_to_id integer или null

Без него прочитанным считается всё

Ответы

200Успешный ответ · object

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/notifications/read' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"up_to_id": 0}'
GET/v1/devices Устройства, куда сейчас уходят пуши: с действующей сессией (Р-424) Нужен вход Почта подтверждена

Ответы

200Успешный ответ · массив DeviceBody

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/devices' \
  -H 'Authorization: Bearer <access>'
POST/v1/devices Регистрация пуш-токена. Повторный запуск приложения — обновление Нужен вход Почта подтверждена

Устройство записывается вместе с сессией (Р-424): пуш уходит, пока сессия жива. Вышел человек или вошёл заново — клиент присылает токен ещё раз, и устройство переезжает на новую сессию. Платформы — web, android, ios.

Тело запросаDeviceRegister · application/json

push_token string обязательно

platform string обязательно

android / ios / web

app_version string или null

language string или null

timezone string или null

Ответы

200Успешный ответ · DeviceBody

Поля ответа · 8

id string (uuid) обязательно

platform string обязательно

app_version string или null

language string или null

timezone string или null

current boolean по умолчанию false

Устройство этой сессии (Р-424)

created_at string (date-time) или null

last_seen_at string (date-time) или null

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/devices' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"push_token": "…", "platform": "…"}'
POST/v1/devices/forget Выключить пуши на этом устройстве — по его токену (Р-424) Нужен вход Почта подтверждена

Браузер знает свой токен, но не идентификатор строки. Чужой или незнакомый токен — тот же 204: устройство и так молчит.

Тело запросаDeviceForget · application/json

push_token string обязательно

Ответы

204Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/devices/forget' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"push_token": "…"}'
DELETE/v1/devices/<span class="text-brand-ink">{device_id}</span> Забыть своё устройство: пуши на него больше не уходят (Р-424) Нужен вход Почта подтверждена

Параметры

device_id путь · string (uuid) обязательно

Ответы

204Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X DELETE 'https://api.mybounty.org/v1/devices/{device_id}' \
  -H 'Authorization: Bearer <access>'
GET/v1/unsubscribe Отписка по подписанной ссылке, без входа: выключает все уведомления роли (Р-404) Без входа

Ссылка одна на все четыре роли — гостя, партнёра, модератора и админа: роль и человек лежат в токене.

Параметры

token запрос · string обязательно

Ответы

200Успешный ответ · UnsubscribeResult

Поля ответа · 3

ok boolean по умолчанию true

email string или null

Адрес, который отписан

role string или null

Чей это аккаунт: user, partner, moderator, admin — страница ведёт в его настройки

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/unsubscribe'

Отзывы

6 эндпоинтов

Отзывы гостя: оставить по завершённой брони, оценки по критериям, свои отзывы. Нужна подтверждённая почта.

GET/v1/listings/<span class="text-brand-ink">{listing_id}</span>/reviews Отзывы объекта и средние по критериям Без входа

Порядок, отбор по оценке и поиск нужны отдельной странице отзывов (Р-225): на карточке объекта тем же эндпоинтом берутся три лучших. Средние по критериям и счётчик отбор не меняет — они по всему объекту.

Параметры

listing_id путь · string (uuid) обязательно

cursor запрос · string или null

limit запрос · integer или null

sort запрос · string

Порядок: recent — свежие, best — лучшие, worst — худшие

rating запрос · integer или null

Только с этой оценкой

q запрос · string или null

Поиск по тексту отзыва

Ответы

200Успешный ответ · ListingReviews

Поля ответа · 7

items массив ReviewBody обязательно

next_cursor string или null

has_more boolean по умолчанию false

rating_avg number или null

reviews_count integer по умолчанию 0

criteria object

Средняя по каждому критерию

sort string по умолчанию "recent"

Каким порядком отдана страница: recent, best или worst

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/listings/{listing_id}/reviews'
GET/v1/reviews/pending По каким поездкам можно оставить отзыв и до какого момента Нужен вход Почта подтверждена

Ответы

200Успешный ответ · массив PendingBooking

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/reviews/pending' \
  -H 'Authorization: Bearer <access>'
POST/v1/reviews Отзыв об объекте по завершённой поездке Нужен вход Почта подтверждена

Ответ отдаётся автору, поэтому в нём виден и ещё не раскрытый отзыв: свой текст человек имеет право увидеть сразу.

Тело запросаReviewCreate · application/json

booking_id string (uuid) обязательно

rating integer обязательно

Общая оценка 1–5

scores object

Оценки по критериям; чужие критерии отбрасываются молча

text string или null

Ответы

201Успешный ответ · ReviewBody

Поля ответа · 18

id string (uuid) обязательно

booking_id string (uuid) обязательно

author_kind string обязательно

listing_id string (uuid) или null

rating integer обязательно

scores object

text string или null

status string обязательно

published_at string (date-time) или null

created_at string (date-time) обязательно

reply ReplyBody или null

author_name string или null

Имя автора — без фамилии

author_avatar_url string или null

listing_title string или null

listing_slug string или null

Чтобы из списка отзывов открыть сам объект

listing_kind string или null

Категория объекта: по ней форма правки выбирает критерии оценки (находка №193) — у выхода не спрашивают ни чистоту, ни заезд

can_edit boolean по умолчанию false

Править можно, пока отзыв не опубликован: раскрытие слепое

can_delete boolean по умолчанию false

Свой отзыв автор вправе снять всегда

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/reviews' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"booking_id": "00000000-0000-0000-0000-000000000000", "rating": 0}'
PATCH/v1/reviews/<span class="text-brand-ink">{review_id}</span> Правит свой отзыв — пока он не опубликован Нужен вход Почта подтверждена

После публикации правка запрещена, и это не придирка. Раскрытие слепое: обе стороны пишут не глядя друг на друга, партнёр отвечает на конкретный текст. Разрешить менять текст после ответа — значит позволить поменять вопрос, на который уже ответили.

Параметры

review_id путь · string (uuid) обязательно

Тело запросаReviewUpdate · application/json

rating integer обязательно

Общая оценка 1–5

scores object

text string или null

Ответы

200Успешный ответ · ReviewBody

Поля ответа · 18

id string (uuid) обязательно

booking_id string (uuid) обязательно

author_kind string обязательно

listing_id string (uuid) или null

rating integer обязательно

scores object

text string или null

status string обязательно

published_at string (date-time) или null

created_at string (date-time) обязательно

reply ReplyBody или null

author_name string или null

Имя автора — без фамилии

author_avatar_url string или null

listing_title string или null

listing_slug string или null

Чтобы из списка отзывов открыть сам объект

listing_kind string или null

Категория объекта: по ней форма правки выбирает критерии оценки (находка №193) — у выхода не спрашивают ни чистоту, ни заезд

can_edit boolean по умолчанию false

Править можно, пока отзыв не опубликован: раскрытие слепое

can_delete boolean по умолчанию false

Свой отзыв автор вправе снять всегда

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X PATCH 'https://api.mybounty.org/v1/reviews/{review_id}' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"rating": 0}'
DELETE/v1/reviews/<span class="text-brand-ink">{review_id}</span> Автор забирает свой отзыв обратно Нужен вход Почта подтверждена

Разрешено и после публикации: промолчать человек вправе всегда, а вот переписать сказанное задним числом — нет. Удаление мягкое (правило №6): строка и текст остаются, из показа и из рейтинга отзыв уходит.

Параметры

review_id путь · string (uuid) обязательно

Ответы

204Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X DELETE 'https://api.mybounty.org/v1/reviews/{review_id}' \
  -H 'Authorization: Bearer <access>'
GET/v1/reviews/my Мои отзывы и опубликованные отзывы обо мне Нужен вход Почта подтверждена

Ответы

200Успешный ответ · MyReviews

Поля ответа · 2

written массив ReviewBody

received массив ReviewBody

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/reviews/my' \
  -H 'Authorization: Bearer <access>'

Избранное

7 эндпоинтов

Избранные объекты и подборки. Нужна подтверждённая почта.

GET/v1/favorite-lists Списки избранного вместе с числом объектов в каждом Нужен вход Почта подтверждена

Ответы

200Успешный ответ · массив FavoriteListResponse

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/favorite-lists' \
  -H 'Authorization: Bearer <access>'
POST/v1/favorite-lists Новый список: «Пхукет февраль», «Идеи на лето» Нужен вход Почта подтверждена

Тело запросаFavoriteListRequest · application/json

title string обязательно

Ответы

201Успешный ответ · FavoriteListResponse

Поля ответа · 5

id string (uuid) обязательно

title string обязательно

is_default boolean обязательно

listings_count integer обязательно

created_at string (date-time) обязательно

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/favorite-lists' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"title": "…"}'
PATCH/v1/favorite-lists/<span class="text-brand-ink">{list_id}</span> Переименование списка Нужен вход Почта подтверждена

Параметры

list_id путь · string (uuid) обязательно

Тело запросаFavoriteListRequest · application/json

title string обязательно

Ответы

200Успешный ответ · FavoriteListResponse

Поля ответа · 5

id string (uuid) обязательно

title string обязательно

is_default boolean обязательно

listings_count integer обязательно

created_at string (date-time) обязательно

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X PATCH 'https://api.mybounty.org/v1/favorite-lists/{list_id}' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"title": "…"}'
DELETE/v1/favorite-lists/<span class="text-brand-ink">{list_id}</span> Удаление списка вместе с закладками в нём Нужен вход Почта подтверждена

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

Параметры

list_id путь · string (uuid) обязательно

Ответы

204Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X DELETE 'https://api.mybounty.org/v1/favorite-lists/{list_id}' \
  -H 'Authorization: Bearer <access>'
GET/v1/favorites Объекты избранного — теми же карточками, что и в ленте, плюс цена на момент добавления Нужен вход Почта подтверждена

Параметры

list_id запрос · string (uuid) или null

Только этот список

limit запрос · integer или null

cursor запрос · string или null

Ответы

200Успешный ответ · FavoritesPage

Поля ответа · 3

items массив FavoriteCard обязательно

next_cursor string или null

has_more boolean обязательно

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/favorites' \
  -H 'Authorization: Bearer <access>'
POST/v1/favorites Положить объект в избранное Нужен вход Почта подтверждена

Повторное добавление ошибкой не считается: двойной тап по сердечку — это двойной тап, а не попытка обмануть сервис.

Тело запросаFavoriteRequest · application/json

listing_id string (uuid) обязательно

list_id string (uuid) или null

note string или null

Ответы

201Успешный ответ · FavoriteResponse

Поля ответа · 2

list_id string (uuid) обязательно

listing_id string (uuid) обязательно

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/favorites' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"listing_id": "00000000-0000-0000-0000-000000000000"}'
DELETE/v1/favorites/<span class="text-brand-ink">{listing_id}</span> Убрать объект из избранного — из всех своих списков сразу Нужен вход Почта подтверждена

Параметры

listing_id путь · string (uuid) обязательно

Ответы

204Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X DELETE 'https://api.mybounty.org/v1/favorites/{listing_id}' \
  -H 'Authorization: Bearer <access>'

Жалобы

2 эндпоинта

Пожаловаться на объект, бизнес, отзыв или сообщение. Нужен вход.

GET/v1/report-reasons Причины для вида цели — в порядке формы, «другое» последним Без входа

Параметры

target_kind запрос · listing | partner | review

Ответы

200Успешный ответ · массив ReportReason

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/report-reasons'
POST/v1/reports Жалоба на объект, бизнес или отзыв. Повтор до разбора — счётчик, а не новая Нужен вход Почта подтверждена

Тело запросаReportCreate · application/json

target_kind listing | partner | review обязательно

target_id string (uuid) обязательно

reason_code string обязательно

comment string или null

Ответы

201Успешный ответ · ReportAccepted

Поля ответа · 4

id string (uuid) обязательно

status string обязательно

repeated boolean обязательно

created_at string (date-time) обязательно

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/reports' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"target_kind": "listing", "target_id": "00000000-0000-0000-0000-000000000000", "reason_code": "…"}'

Заявки на подбор

1 эндпоинт

Заявка «Подберём жильё под ваш запрос» (Р-276): открытая форма с капчей, дальше человека ведёт модератор.

POST/v1/leads Оставить заявку: имя, способ связи и контакт, комментарий по желанию Вход по желанию

Тело запросаLeadRequest · application/json

captcha_id string по умолчанию ""

captcha_answer string по умолчанию ""

name string обязательно

contact_kind string обязательно

phone / whatsapp / telegram / line

contact string обязательно

Номер телефона или имя в мессенджере

comment string или null

Ответы

201Успешный ответ · LeadResponse

Поля ответа · 1

id string (uuid) обязательно

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/leads' \
  -H 'Content-Type: application/json' \
  -d '{"name": "…", "contact_kind": "…", "contact": "…"}'

Приватные файлы

2 эндпоинта

Документы и вложения из приватного хранилища — потоком после проверки прав (правило №7). Нужен вход.

GET/v1/media/<span class="text-brand-ink">{media_id}</span> Отдаёт приватный файл потоком Без входа

Определяем владельца одним из двух способов и только потом проверяем право: без билета — по токену, с билетом — по сессии, которой он выдан.

Параметры

media_id путь · string (uuid) обязательно

t запрос · string или null

Ответы

200Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/media/{media_id}'
POST/v1/media/<span class="text-brand-ink">{media_id}</span>/ticket Одноразовая ссылка на 60 секунд для показа файла в <img> Нужен вход Почта подтверждена

Право проверяется здесь, до выдачи билета: билет — способ доставки, а не разрешение.

Параметры

media_id путь · string (uuid) обязательно

Ответы

200Успешный ответ · MediaTicketResponse

Поля ответа · 2

url string обязательно

expires_in integer обязательно

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/media/{media_id}/ticket' \
  -H 'Authorization: Bearer <access>'

Bounty AI

23 эндпоинта

Личный помощник туриста (Р-426…Р-429, docs/assistant.md): лента, сообщения текстом, голосом и с вложениями, озвучка и переводчик, блоки ответов, настройки и память. Ответ приходит событием сокета assistant.message. Нужна подтверждённая почта.

GET/v1/assistant Работает ли помощник, сколько сообщений осталось в окне и что можно прислать Нужен вход Почта подтверждена

Ответы

200Успешный ответ · object

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/assistant' \
  -H 'Authorization: Bearer <access>'
GET/v1/assistant/messages Лента от старых к новым. before — листать назад, after — новые Нужен вход Почта подтверждена

Лента одна, тем нет (Р-431): thread_id у сообщений — наследство прежних тем, клиенту разделять по нему нечего.

Параметры

before запрос · integer или null

after запрос · integer или null

limit запрос · integer или null

Ответы

200Успешный ответ · object

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/assistant/messages' \
  -H 'Authorization: Bearer <access>'
POST/v1/assistant/messages Сообщение помощнику. 202 — вопрос сохранён, ответ пишется в фоне Нужен вход Почта подтверждена

В ответе — сообщение гостя, заготовка ответа (status: pending) и окно лимита. Готовый ответ приходит событием assistant.message по /v1/ws; без сокета — GET /v1/assistant/messages?after=…. Повтор с тем же Idempotency-Key возвращает то же сообщение и не тратит лимит дважды.

Ошибки: 503 assistant_unavailable; 429 assistant_limit (details.resets_at); 409 assistant_busy; 400 assistant_message_empty / assistant_text_too_long / assistant_files_too_many / assistant_files_too_large_total; 404 assistant_file_not_found.

Параметры

Idempotency-Key заголовок · string или null

Тело запросаSendRequest · application/json

text string по умолчанию ""

file_ids массив string (uuid)

Загруженные файлы, до 10

voice_id string (uuid) или null

Загруженное голосовое

location Location или null

«Моё местоположение»

mode string или null

interpret — голосовое собеседника для переводчика (Р-429), вместе с voice_id

Ответы

202Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/assistant/messages' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"text": "", "file_ids": ["00000000-0000-0000-0000-000000000000"]}'
DELETE/v1/assistant/messages «Очистить переписку»: прежнее скрыто у гостя, в базе остаётся (правило №6) Нужен вход Почта подтверждена

Ответы

200Успешный ответ · object

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X DELETE 'https://api.mybounty.org/v1/assistant/messages' \
  -H 'Authorization: Bearer <access>'
POST/v1/assistant/greeting Заход в помощника: приветствие, если оно положено (Р-489, assistant.md §11.7) Нужен вход Почта подтверждена

Клиент зовёт при каждом открытии помощника — приложение при запуске, сайт на странице /ai — с точкой устройства, если доступ к геолокации уже дан (запрашивать разрешение ради приветствия не нужно). Первый заход за окно лимита (6 ч) — в ответе новое сообщение kind: proactive, trigger: greeting (блоки greeting, events, suggestions); оно же уходит событием assistant.message на остальные устройства. Иначе — {"message": null}. Лимит сообщений не тратится. Точка сохраняется как «последнее известное место» на 30 дней в любом случае.

Тело запросаGreetingRequest · application/json

location Location или null

Точка устройства сейчас — только если доступ к геолокации уже дан

timezone string или null

Пояс устройства (IANA) — на случай, если места нет

Ответы

200Успешный ответ · object

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/assistant/greeting' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"location": {"lat": 0.0, "lng": 0.0}, "timezone": "…"}'
GET/v1/assistant/messages/<span class="text-brand-ink">{message_id}</span> Одно сообщение — проверить, готов ли ответ, без сокета Нужен вход Почта подтверждена

Параметры

message_id путь · integer обязательно

Ответы

200Успешный ответ · object

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/assistant/messages/{message_id}' \
  -H 'Authorization: Bearer <access>'
POST/v1/assistant/files Файл до сообщения: фото, документ (PDF, DOCX, XLSX, CSV, TXT) или голосовое Нужен вход Почта подтверждена

Тип определяется по содержимому, а не по kind: kind=voice лишь говорит, что это запись (ffmpeg приведёт её к mp3). Всё ложится в приватный бакет. Ошибки: assistant_file_type, assistant_file_too_large, assistant_pdf_too_long, assistant_voice_too_long, assistant_voice_unavailable, assistant_unavailable.

Тело запросаBody_upload_v1_assistant_files_post · multipart/form-data

kind string по умолчанию "document"

photo · document · voice

file string обязательно

Ответы

200Успешный ответ · object

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/assistant/files' \
  -H 'Authorization: Bearer <access>' \
  -F 'file=@photo.jpg'
GET/v1/assistant/files/<span class="text-brand-ink">{file_id}</span> Файл потоком после проверки владельца (правило №7). Чужой — 404 Нужен вход Почта подтверждена

Параметры

file_id путь · string (uuid) обязательно

size запрос · string или null

thumb — превью фото

Ответы

200Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/assistant/files/{file_id}' \
  -H 'Authorization: Bearer <access>'
POST/v1/assistant/messages/<span class="text-brand-ink">{message_id}</span>/retry «Спросить ещё раз»: неудачный ответ снова пишется. Тратит одно сообщение Нужен вход Почта подтверждена

Параметры

message_id путь · integer обязательно

Ответы

202Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/assistant/messages/{message_id}/retry' \
  -H 'Authorization: Bearer <access>'
POST/v1/assistant/messages/<span class="text-brand-ink">{message_id}</span>/stop «Остановить ответ» (Р-447): заготовка — в «Вы остановили ответ» (stopped) Нужен вход Почта подтверждена

Клиенты кнопку больше не показывают (Р-461): пока помощник отвечает, отправить новое нельзя — ждут ответа. Эндпоинт оставлен для совместимости.

Сообщение возвращается в лимит — помощник не ответил. Ответ, который уже готов, не трогается и возвращается как есть. Задача, которая пишет ответ, бросает работу на ближайшем шаге; следующий вопрос можно отправлять сразу. Повторить — POST …/retry.

Параметры

message_id путь · integer обязательно

Ответы

200Успешный ответ · object

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/assistant/messages/{message_id}/stop' \
  -H 'Authorization: Bearer <access>'
POST/v1/assistant/messages/<span class="text-brand-ink">{message_id}</span>/offer Ответ на предложение помощника (Р-449): уведомление или заметка Нужен вход Почта подтверждена

accept у reminder_offer ставит уведомление (local_time — «Другое время»), у note_offer записывает заметку (title, text — поправленные гостем). skip — крестик: предложение скрывается. Блок получает state и номер созданного (reminder_id, note_id) на всех устройствах; повторный ответ ничего не меняет. Лимит не тратится.

Ошибки: 404 assistant_message_not_found (нет такого предложения), reminder_invalid, reminders_too_many, note_invalid, notes_too_many.

Параметры

message_id путь · integer обязательно

Тело запросаOfferAnswer · application/json

block_id string обязательно

id блока предложения

action string обязательно

accept — принять, skip — отказаться

local_time string или null

Другое время уведомления, ГГГГ-ММ-ДДTЧЧ:ММ в поясе места

timezone string или null

Пояс другого времени

title string или null

Поправленный заголовок

text string или null

Поправленный текст

Ответы

200Успешный ответ · object

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/assistant/messages/{message_id}/offer' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"block_id": "…", "action": "…"}'
POST/v1/assistant/messages/<span class="text-brand-ink">{message_id}</span>/feedback 👍/👎 ответу. У 👎 — причина (wrong, useless, other) и текст Нужен вход Почта подтверждена

Параметры

message_id путь · integer обязательно

Тело запросаFeedbackRequest · application/json

rating integer или null

1 — 👍, -1 — 👎, пусто — снять

reason string или null

wrong · useless · other

comment string или null

Ответы

200Успешный ответ · object

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/assistant/messages/{message_id}/feedback' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"rating": 0, "reason": "…"}'
POST/v1/assistant/messages/<span class="text-brand-ink">{message_id}</span>/checklist Галочка чек-листа. Сохраняется — видна с любого устройства Нужен вход Почта подтверждена

Параметры

message_id путь · integer обязательно

Тело запросаChecklistRequest · application/json

item_id string обязательно

done boolean обязательно

Ответы

200Успешный ответ · object

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/assistant/messages/{message_id}/checklist' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"item_id": "…", "done": false}'
POST/v1/assistant/read Прочитано до сообщения включительно — гаснет счётчик на пункте меню Нужен вход Почта подтверждена

Тело запросаapp__routers__assistant__ReadRequest · application/json

up_to_id integer обязательно

Ответы

200Успешный ответ · object

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/assistant/read' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"up_to_id": 0}'
GET/v1/assistant/settings Настройки помощника гостя: сообщения первым, голос, озвучка, память Нужен вход Почта подтверждена

Ответы

200Успешный ответ · object

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/assistant/settings' \
  -H 'Authorization: Bearer <access>'
PATCH/v1/assistant/settings Настройки помощника. Меняется только присланное Нужен вход Почта подтверждена
  • proactive — «Bounty AI пишет первым»: all, trips, off;
  • voice — голос помощника: female, male (Р-429);
  • voice_reply — отвечать голосом на голосовое (Р-429);
  • ask_location — можно ли спрашивать точное местоположение (Р-432); «Не сейчас» у запроса выключает само.

Тело запросаSettingsRequest · application/json

proactive string или null

all · trips · off

voice string или null

female · male (Р-429)

voice_reply boolean или null

Отвечать голосом на голосовое (Р-429)

ask_location boolean или null

Можно ли спрашивать точное местоположение (Р-432)

Ответы

200Успешный ответ · object

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X PATCH 'https://api.mybounty.org/v1/assistant/settings' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"proactive": "…", "voice": "…"}'
GET/v1/assistant/memory Что помнит Bounty AI о госте Нужен вход Почта подтверждена

Ответы

200Успешный ответ · object

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/assistant/memory' \
  -H 'Authorization: Bearer <access>'
DELETE/v1/assistant/memory Забыть всё, что помощник помнит о госте. Ответ — 204 без тела Нужен вход Почта подтверждена

Ответы

204Успешный ответ

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X DELETE 'https://api.mybounty.org/v1/assistant/memory' \
  -H 'Authorization: Bearer <access>'
DELETE/v1/assistant/memory/<span class="text-brand-ink">{fact_id}</span> Забыть один факт памяти помощника. Ответ — 204 без тела Нужен вход Почта подтверждена

Параметры

fact_id путь · integer обязательно

Ответы

204Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X DELETE 'https://api.mybounty.org/v1/assistant/memory/{fact_id}' \
  -H 'Authorization: Bearer <access>'
GET/v1/assistant/messages/<span class="text-brand-ink">{message_id}</span>/speech Озвучка потоком — для <audio src> и системного плеера (Р-429, §8а) Нужен вход Почта подтверждена

Звук уже есть — отдаётся файл из хранилища с длиной; нет — звук идёт прямо из OpenAI, пока тот говорит (первый звук через полторы секунды, а не через десять), и в конце сохраняется файлом. Что озвучить — как у POST. Отказы те же, кодом ответа: 503, 400, 404.

Параметры

message_id путь · integer обязательно

block запрос · integer или null

Номер блока; пусто — весь ответ

item запрос · integer или null

Номер фразы в phrases

Ответы

200Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/assistant/messages/{message_id}/speech' \
  -H 'Authorization: Bearer <access>'
POST/v1/assistant/messages/<span class="text-brand-ink">{message_id}</span>/speech Озвучить ответ помощника или одну его фразу (Р-429, docs/assistant.md §8а) Нужен вход Почта подтверждена

Без block — ответ целиком, тепло; с block — фраза блока phrases (item — её номер) или «Покажите водителю», медленно и чётко. Голос — гостя (voice в настройках). Звук создаётся один раз: повтор и другое устройство получают тот же файл. Лимит сообщений не тратится.

Ошибки: 503 assistant_speech_unavailable, 400 assistant_speech_empty, 502 assistant_speech_failed, 404 assistant_message_not_found.

Параметры

message_id путь · integer обязательно

Тело запросаSpeechRequest · application/json

block integer или null

Номер блока phrases или driver; пусто — весь ответ

item integer или null

Номер фразы в блоке phrases

Ответы

200Успешный ответ · object

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/assistant/messages/{message_id}/speech' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"block": 0, "item": 0}'
POST/v1/assistant/messages/<span class="text-brand-ink">{message_id}</span>/location-request Ответ на «Поделиться местоположением?» (Р-432) — пометка в блоке Нужен вход Почта подтверждена

Точку гость присылает обычным сообщением с location; здесь только shared или declined: кнопки гаснут на всех устройствах, модель видит ответ в истории и после отказа не спрашивает снова. Лимит не тратится. Ответ — сообщение. Другое значение или нет запроса — 404.

Параметры

message_id путь · integer обязательно

Тело запросаLocationAnswer · application/json

state string обязательно

shared — поделился точкой, declined — «Не сейчас»

Ответы

200Успешный ответ · object

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/assistant/messages/{message_id}/location-request' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"state": "…"}'
POST/v1/assistant/messages/<span class="text-brand-ink">{message_id}</span>/save-plan «Сохранить в планы» у предложенного плана (Р-428, docs/plans.md §5.3) Нужен вход Почта подтверждена

План сохраняет гость — помощник лишь предлагает. Повтор вернёт тот же план: номер сохранённого записывается в блок (saved_plan_id), и кнопка на любом устройстве становится «Открыть план».

Параметры

message_id путь · integer обязательно

Тело запросаSavePlanRequest · application/json

block integer или null

Номер блока itinerary в сообщении; пусто — первый

Ответы

200Успешный ответ · object

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/assistant/messages/{message_id}/save-plan' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"block": 0}'

Планы и уведомления

12 эндпоинтов

Планы по дням, шаги, брони в днях, напоминания «за N минут» и на точное время (Р-428). Нужна подтверждённая почта.

GET/v1/plans Планы гостя: ещё не прошедшие — по дате начала, прошедшие — свежие сверху Нужен вход Почта подтверждена

Параметры

scope запрос · string

upcoming · past

Ответы

200Успешный ответ · object

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/plans' \
  -H 'Authorization: Bearer <access>'
POST/v1/plans Новый план Нужен вход Почта подтверждена

Шаги можно прислать сразу; уведомления шагов, чьё время уже прошло, не ставятся — причина в warnings.

Тело запросаPlanCreate · application/json

title string обязательно

date_from string обязательно

Первый день, ГГГГ-ММ-ДД, в поясе места

date_to string или null

Последний день; пусто — один день

note string или null

items массив object

Ответы

201Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/plans' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"title": "…", "date_from": "…"}'
GET/v1/plans/<span class="text-brand-ink">{plan_id}</span> План целиком: дни с шагами и бронями гостя, уведомления, точки карты, пометка пояса (timezone_notice) Нужен вход Почта подтверждена

Параметры

plan_id путь · string (uuid) обязательно

Ответы

200Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/plans/{plan_id}' \
  -H 'Authorization: Bearer <access>'
PATCH/v1/plans/<span class="text-brand-ink">{plan_id}</span> Название, даты, заметка Нужен вход Почта подтверждена

Даты, отрезающие шаги, — 400 plan_invalid (details.reason: excludes_items, details.days).

Параметры

plan_id путь · string (uuid) обязательно

Тело запросаPlanPatch · application/json

title string или null

date_from string или null

date_to string или null

note string или null

Ответы

200Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X PATCH 'https://api.mybounty.org/v1/plans/{plan_id}' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"title": "…", "date_from": "…"}'
DELETE/v1/plans/<span class="text-brand-ink">{plan_id}</span> Удалить план (мягко) — его шаги и уведомления следом Нужен вход Почта подтверждена

Параметры

plan_id путь · string (uuid) обязательно

Ответы

204Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X DELETE 'https://api.mybounty.org/v1/plans/{plan_id}' \
  -H 'Authorization: Bearer <access>'
POST/v1/plans/<span class="text-brand-ink">{plan_id}</span>/items Новый шаг. Ответ — план целиком и номер шага Нужен вход Почта подтверждена

Параметры

plan_id путь · string (uuid) обязательно

Тело запросаItemBody · application/json

day string или null

time_from string или null

time_to string или null

title string или null

note string или null

place object или null

ref object или null

remind_before integer или null

За сколько минут до начала: 0, 15, 30, 60, 120, 180, 1440

done boolean или null

Ответы

201Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/plans/{plan_id}/items' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"day": "…", "time_from": "…"}'
PATCH/v1/plans/<span class="text-brand-ink">{plan_id}</span>/items/<span class="text-brand-ink">{item_id}</span> Правка шага, его уведомления (remind_before) и галочки «сделано» Нужен вход Почта подтверждена

Параметры

plan_id путь · string (uuid) обязательно

item_id путь · integer обязательно

Тело запросаItemBody · application/json

day string или null

time_from string или null

time_to string или null

title string или null

note string или null

place object или null

ref object или null

remind_before integer или null

За сколько минут до начала: 0, 15, 30, 60, 120, 180, 1440

done boolean или null

Ответы

200Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X PATCH 'https://api.mybounty.org/v1/plans/{plan_id}/items/{item_id}' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"day": "…", "time_from": "…"}'
DELETE/v1/plans/<span class="text-brand-ink">{plan_id}</span>/items/<span class="text-brand-ink">{item_id}</span> Удалить шаг (мягко) с его уведомлением Нужен вход Почта подтверждена

Параметры

plan_id путь · string (uuid) обязательно

item_id путь · integer обязательно

Ответы

200Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X DELETE 'https://api.mybounty.org/v1/plans/{plan_id}/items/{item_id}' \
  -H 'Authorization: Bearer <access>'
GET/v1/reminders Действующие уведомления по времени, сработавшие за 30 дней и пометка каждого пояса (zones) Нужен вход Почта подтверждена

Ответы

200Успешный ответ

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/reminders' \
  -H 'Authorization: Bearer <access>'
POST/v1/reminders Уведомление на точное время. Такое же уже стоит — created: false и оно Нужен вход Почта подтверждена

Тело запросаReminderCreate · application/json

local string обязательно

Дата и время в поясе места: 2026-11-13T07:30

text string обязательно

tz string или null

Пояс места; пусто — Asia/Bangkok

plan_id string (uuid) или null

Ответы

201Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/reminders' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"local": "…", "text": "…"}'
PATCH/v1/reminders/<span class="text-brand-ink">{reminder_id}</span> Новое время или текст. У уведомления шага время идёт за шагом Нужен вход Почта подтверждена

Параметры

reminder_id путь · integer обязательно

Тело запросаReminderPatch · application/json

local string или null

text string или null

Ответы

200Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X PATCH 'https://api.mybounty.org/v1/reminders/{reminder_id}' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"local": "…", "text": "…"}'
DELETE/v1/reminders/<span class="text-brand-ink">{reminder_id}</span> Снять уведомление. В базе остаётся со статусом cancelled (правило №6) Нужен вход Почта подтверждена

Параметры

reminder_id путь · integer обязательно

Ответы

200Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X DELETE 'https://api.mybounty.org/v1/reminders/{reminder_id}' \
  -H 'Authorization: Bearer <access>'

Заметки

6 эндпоинтов

Заметки гостя (Р-442): текст, чек-листы, предложения помощника. Нужна подтверждённая почта.

GET/v1/notes Заметки: закреплённые сверху, дальше — по последней правке Нужен вход Почта подтверждена

q — поиск (найденное — по весу: слово в заголовке важнее, чем в тексте; у заметки — mark, слово для подсветки), filter — «Все», «Закреплённые», «От Bounty AI».

Параметры

q запрос · string

Слова в заголовке или тексте

filter запрос · string

all · pinned · ai

Ответы

200Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/notes' \
  -H 'Authorization: Bearer <access>'
POST/v1/notes Новая заметка. Ошибки: note_invalid, notes_too_many (500 на человека) Нужен вход Почта подтверждена

Тело запросаNoteCreate · application/json

title string обязательно

text string по умолчанию ""

ref object или null

Привязка: {kind: booking | plan | listing, id}

pinned boolean по умолчанию false

Ответы

201Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/notes' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"title": "…"}'
GET/v1/notes/<span class="text-brand-ink">{note_id}</span> Одна заметка; удалённая — тоже (deleted: true), чтобы её можно было вернуть Нужен вход Почта подтверждена

Параметры

note_id путь · string (uuid) обязательно

Ответы

200Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/notes/{note_id}' \
  -H 'Authorization: Bearer <access>'
PATCH/v1/notes/<span class="text-brand-ink">{note_id}</span> Правка заметки: заголовок, текст, привязка, «Закрепить» Нужен вход Почта подтверждена

Параметры

note_id путь · string (uuid) обязательно

Тело запросаNotePatch · application/json

title string или null

text string или null

ref object или null

pinned boolean или null

Ответы

200Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X PATCH 'https://api.mybounty.org/v1/notes/{note_id}' \
  -H 'Authorization: Bearer <access>' \
  -H 'Content-Type: application/json' \
  -d '{"title": "…", "text": "…"}'
DELETE/v1/notes/<span class="text-brand-ink">{note_id}</span> Удалить — мягко (правило №6): вернуть можно POST …/restore Нужен вход Почта подтверждена

Параметры

note_id путь · string (uuid) обязательно

Ответы

204Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X DELETE 'https://api.mybounty.org/v1/notes/{note_id}' \
  -H 'Authorization: Bearer <access>'
POST/v1/notes/<span class="text-brand-ink">{note_id}</span>/restore «Вернуть» удалённую заметку (карточка в ленте Bounty AI) Нужен вход Почта подтверждена

Параметры

note_id путь · string (uuid) обязательно

Ответы

200Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

401Нет входа, токен истёк или сессия закрыта — unauthorized. Обновите пару POST /v1/auth/refresh и повторите; не вышло — на вход

403Вход есть, но действие недоступно: почта не подтверждена — email_not_confirmed, аккаунт ограничен — account_restricted, нет прав — forbidden

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/v1/notes/{note_id}/restore' \
  -H 'Authorization: Bearer <access>'

Связь и карта сайта

2 эндпоинта

Раздел «Связь» — тарифы SIM-карт в офисе Bounty HUB (Р-425) и готовая карта сайта для поисковиков (Р-423). Вход не нужен.

GET/v1/connect Офис, где оформляют SIM-карту, и тарифы на языке запроса Без входа

Тексты тарифа — перевод на язык запроса, если он готов, иначе оригинал модератора. Покупки через сервис нет: оформление в офисе, по паспорту.

Ответы

200Успешный ответ · ConnectResponse

Поля ответа · 2

office Office обязательно

tariffs массив SimTariff

Тарифы, которые продаются в офисе; пусто — цены называют на месте

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/connect'
GET/v1/seo/<span class="text-brand-ink">{name}</span> Готовый файл карты сайта: sitemap.xml или его часть sitemap-N.xml Без входа

Файл собирает фоновая задача раз в три часа (Р-423). Ещё не собран или имя чужое — 404.

Параметры

name путь · string обязательно

Ответы

200Успешный ответ

400Неверные параметры или тело запроса — validation_error; в details.fields — какие поля

404Нет такого объекта или он вам не принадлежит — not_found

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/v1/seo/{name}'

Витрина в EGO

6 эндпоинтов

Bounty как модуль ассистента EGO (Р-290): подписанные вызовы /ego/v1, не для клиентов Bounty.

GET/ego/v1/health Проверка здоровья модуля. EGO зовёт её раз в минуту Без входа

Подписи не требует намеренно: по этому ответу в разделе «Модули» рисуется «онлайн», и он обязан зависеть от сервиса, а не от ключа.

Ответы

200Успешный ответ · object

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X GET 'https://api.mybounty.org/ego/v1/health'
POST/ego/v1/search_listings Поиск объектов одной из пяти категорий по фильтрам Без входа

Ответы

200Успешный ответ · object

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/ego/v1/search_listings'
POST/ego/v1/listing_details Карточка объекта по адресу или идентификатору из выдачи Без входа

Ответы

200Успешный ответ · object

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/ego/v1/listing_details'
POST/ego/v1/search_events Афиша города по фильтрам: день, категория, вход, время, язык Без входа

Ответы

200Успешный ответ · object

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/ego/v1/search_events'
POST/ego/v1/upcoming_events Ближайшие события подборкой — по одному на событие Без входа

Ответы

200Успешный ответ · object

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/ego/v1/upcoming_events'
POST/ego/v1/event_details Страница события по адресу из выдачи Без входа

Ответы

200Успешный ответ · object

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/ego/v1/event_details'

Витрина в EGO: аккаунт и брони

14 эндпоинтов

Аккаунт и брони гостя внутри EGO (Р-369): подписанные вызовы, не для клиентов Bounty.

POST/ego/v1/account/status Вошёл ли человек в Bounty, а если нет — есть ли аккаунт на его почту Без входа

Ответы

200Успешный ответ · object

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/ego/v1/account/status'
POST/ego/v1/account/connect Войти в аккаунт на почту из EGO или завести его одним действием Без входа

Ответы

200Успешный ответ · object

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/ego/v1/account/connect'
POST/ego/v1/account/profile Кто человек в Bounty и сколько у него броней впереди Без входа

Ответы

200Успешный ответ · object

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/ego/v1/account/profile'
POST/ego/v1/account/logout Выйти: ключ EGO гасится, аккаунт остаётся Без входа

Ответы

200Успешный ответ · object

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/ego/v1/account/logout'
POST/ego/v1/listing/slots Выходы объекта на день или на две недели вперёд Без входа

Ответы

200Успешный ответ · object

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/ego/v1/listing/slots'
POST/ego/v1/booking/quote Сколько будет стоить бронь и что спросят перед ней Без входа

Ответы

200Успешный ответ · object

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/ego/v1/booking/quote'
POST/ego/v1/booking/create Оформить бронь — тем же обработчиком, что POST /v1/bookings сайта Без входа

Ключ идемпотентности — тот, что прислал EGO (Idempotency-Key): двойное нажатие и повтор из-за сети дают одну бронь.

Отказ по делу (места разобрали, нет телефона, не хватает участников) приходит ответом created: false с причиной словами: окно EGO показывает человеку только текст ответа, а текст ошибки — нет. Попытка откатывается целиком: бронь либо записана вся, либо её нет.

Ответы

200Успешный ответ · object

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/ego/v1/booking/create'
POST/ego/v1/bookings/mine Свои брони, новые сверху: впереди, прошедшие или все Без входа

Ответы

200Успешный ответ · object

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/ego/v1/bookings/mine'
POST/ego/v1/bookings/details Карточка своей брони: статус, чек, оплата, отмена, адрес, шаги Без входа

Ответы

200Успешный ответ · object

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/ego/v1/bookings/details'
POST/ego/v1/bookings/pay Ссылка «Оплатить» по своей брони — и сколько, и на каких условиях Без входа

Ответы

200Успешный ответ · object

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/ego/v1/bookings/pay'
POST/ego/v1/bookings/messages Лента заказа: реплики человека и партнёра, новые снизу Без входа

Открыл ленту в окне — прочитал: счётчик непрочитанного на сайте гаснет.

Ответы

200Успешный ответ · object

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/ego/v1/bookings/messages'
POST/ego/v1/bookings/message Написать партнёру в ленту заказа — тем же обработчиком, что у сайта Без входа

Ответы

200Успешный ответ · object

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/ego/v1/bookings/message'
POST/ego/v1/bookings/cancel_preview Сколько вернётся, если отменить прямо сейчас, и по какому правилу Без входа

Ответы

200Успешный ответ · object

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/ego/v1/bookings/cancel_preview'
POST/ego/v1/bookings/cancel Отменить свою бронь — тем же обработчиком, что у сайта Без входа

Ответы

200Успешный ответ · object

429Слишком часто — rate_limited. Подождите столько секунд, сколько в заголовке Retry-After

500Сбой на стороне сервиса — internal_error; request_id — для поддержки

Пример

curl -X POST 'https://api.mybounty.org/ego/v1/bookings/cancel'