Лента, лайки, мэтчи

Лента

GET /v1/members/{external_id}/feed?limit=20 возвращает до 50 анкет людей из других приложений, которые подходят вашему пользователю (правила — в разделе Как устроена сеть).

Как смешивать со своими

Хорошо работает чередование: своя анкета, анкета из сети, своя, из сети. Так пользователь видит больше людей рядом, а ваши собственные пользователи не теряются.

Что показать на карточке

Отметьте, что анкета из сети «Перевал». Подойдёт текст «Из сети „Перевал“» или значок сети с пояснением.

Поле Как показать
bio_translated Пометка «переведено ИИ» и ссылка «показать оригинал» (bio_original)
photo_verified Значок проверки — так же, как у ваших проверенных пользователей. отметку считает сеть: способ проверки площадки человека одобрен, фото не новее проверки. verified_by: partner — проверила его площадка
distance_km «4 км», если есть: только у тех, кто включил show_distance
country Страна (код ISO 3166-1) — в «Весь мир» вместо расстояния: «Рим, Италия»
height_cm Рост: «178 см», если человек его указал

«Весь мир»

У ленты есть параметр scope: nearby (по умолчанию) — рядом, world — «Весь мир». В «Весь мир» расстояние не важно: люди из любых городов и стран, но только те, кто сам включил согласие «Весь мир» (consent.world). Смотрящему оно тоже нужно — без него 409 world_consent_required. Остальные условия — общий язык или согласие обоих на другие языки, общая цель, возраст — те же.

Покажите две ленты переключателем «Рядом | Весь мир»: смешивать дальних с ближними не стоит — тот, кто ищет встречу у себя в городе, утонет в людях с другого конца света. Человек с «Весь мир» остаётся и в обычной ленте рядом. Лимит 200 анкет в сутки — общий на обе ленты.

Фильтры

лента принимает фильтры смотрящего — храните их у себя и передавайте в каждом запросе:

Параметр Что делает
radius_km Радиус «рядом», 1–300 км, по умолчанию 50. В scope=world не учитывается
verified_only=true Только анкеты с photo_verified — отметкой, которую считает сеть
height_min, height_max Рост от и до, 120–230 см. Кто рост не указал, проходит — иначе фильтр по росту опустошил бы ленту
lat, lon Центр поиска «рядом» (оба сразу). Город в анкете смотрящего не меняется
city, country Название места, если у анкеты нет координат — тот же город
age_min, age_max Сузить возраст. Берётся пересечение с диапазоном анкеты смотрящего. Пустое пересечение — пустая страница и 200. В запросе минимум больше максимума — 422
intent Одна цель из анкеты смотрящего. В ленте остаются только те, у кого она есть. Чужая цель — 422
language Код ISO 639-1. Человек в ленте должен его знать. Общий язык или согласие обоих на другие языки остаются
gender Только противоположный пол смотрящего. Свой — 422

Фильтр не расширяет анкету. Неверные значения — 422.

Если анкет мало, имеет смысл самим увеличить radius_km и сказать об этом человеку: «Если анкет будет мало, радиус чуть-чуть увеличится».

Страницы и дневной лимит

Ответ содержит next_cursor, пока страница может быть не последней. Следующий запрос — те же параметры и cursor. Курсора в ответе нет — страницы кончились. Повтор без cursor возвращает тех же людей.

В сутки участник получает не больше 200 разных людей. Повторный показ лимит не тратит. Сколько новых ещё можно показать — remaining_today:

{ "items": [ … ], "remaining_today": 180, "next_cursor": "…" }

Лимит исчерпан — новых людей нет до следующих суток (UTC), уже показанные сегодня по-прежнему приходят. Дизлайк прячет анкету на 30 дней. Для листалки им отмечают пропуск. Для сайта с поиском прокрутка страницы дизлайком не является: страницы идут курсором. Оба старта — приложение-листалка и сайт с поиском.

Лайк

POST /v1/likes
{ "from": "user-123", "to": "1b9e…" }
  • {"matched": false} — лайк сохранён, вторая сторона получила like.received.
  • {"matched": true, "match_id": "…"} — лайк был взаимным, мэтч создан. Обе площадки получают match.created.

Лайкнуть пользователя своего же приложения через сеть нельзя (403) — у себя вы делаете это как обычно.

  • Лайкнуть можно только того, кого ваш пользователь может видеть. Блокировка в любую сторону, другой контур (тестовый и боевой) или скрытый человек, который сам не лайкал вашего, — 404, как будто анкеты нет.
  • Повторный лайк ничего не меняет и события не шлёт. Повышение обычного лайка до суперлайка шлёт like.received снова, уже с super.
  • Пока анкета вашего пользователя на проверке сети, его лайки сохраняются, но вторая сторона получит like.received, только когда анкета пройдёт. Отклонят — показанные лайки отзовутся (like.withdrawn с rejected).

Суперлайк

После явного подключения расходного аккаунта нужен заказ superlike и X-Action-Ref на действие, даже при цене 0 ₽. До подключения действует прежний контракт. Предел 5 в сутки — защитный, а не бесплатная квота. Услуги сети.

POST /v1/likes
{ "from": "user-123", "to": "1b9e…", "super": true, "message": "Привет! Любишь горы?" }

Особый лайк: получатель видит его сразу, без мэтча. Сообщение — по желанию, до 200 знаков, без контактов (телефон, ссылка, ник в мессенджере — 422).

  • Площадка получателя получает like.received с super: true, а у анкеты отправителя — super_like: сообщение на языке получателя (message), оригинал (message_original), translated и признаки мошенничества (flags).
  • В ленте получателя и во «Вас лайкнули» такой человек идёт первым и с тем же super_like. Покажите суперлайк заметно выделенным — отправитель потратил на него особое действие.
  • Когда случится мэтч, сообщение суперлайка станет первым в переписке: площадка получателя получит его обычным message.created, площадка отправителя показывает его у себя сама.
  • Не больше 5 суперлайков в сутки от одного человека — дальше 429 super_like_limit. Обычный лайк, повышенный до суперлайка, тоже в счёте. Сколько давать своим пользователям и брать ли за это деньги — решаете вы.

Передумал

После подключения расходного аккаунта нужен действующий rewind-day и X-Action-Ref; число допустимых отмен в течение срока не ограничено коммерческой квотой. Отмена не возвращает удалённые мэтчи и переписку.

DELETE /v1/likes/1b9e…?from=user-123

Отменяет лайк или суперлайк, пока он не дал мэтч; после мэтча — 409 matched (закройте мэтч). Площадка получателя получает like.withdrawn и убирает лайк из «Вас лайкнули». Пропущенную анкету возвращает DELETE /v1/dislikes/{network_id}?from=… — она снова может попасть в ленту.

Дизлайк

POST /v1/dislikes
{ "from": "user-123", "to": "5c2a…" }

Шлите, когда человек в листалке пропустил анкету или на сайте с поиском явно отказал («не показывать»). Страница поиска и обновление сетки дизлайком не являются: для них есть cursor. Дизлайкнутая анкета уходит из ленты на 30 дней. Ответ — 204, вторая сторона ничего не узнаёт.

Можно пачкой, до 100 пар за запрос:

POST /v1/dislikes
{
  "items": [
    { "from": "user-123", "to": "5c2a…" },
    { "from": "user-123", "to": "8d4f…" }
  ]
}

Входящие лайки

Событие like.received содержит анкету того, кто лайкнул (from), уже на языке вашего пользователя. Покажите её в «Вас лайкнули». Ответный POST /v1/likes создаст мэтч.

Если события потерялись, восстановите список запросом:

GET /v1/members/{external_id}/likes?limit=50

Он отдаёт тех, кто лайкнул участника и ждёт ответа, — без взаимных, дизлайкнутых и заблокированных, новые сначала:

{ "items": [ { "from": { "network_id": "…", "display_name": "Elena", … }, "liked_at": "2026-10-24T12:00:00Z" } ] }

Мэтч

match.created приходит обеим площадкам — каждой со своим пользователем в member и анкетой собеседника в with. Создайте у себя разговор и сохраните связь match_id ↔ ваш разговор: по match_id будут приходить сообщения, отметки о прочтении и закрытие.

Если взаимный лайк поставил ваш пользователь, match_id придёт и в ответе на лайк, и в событии — создавайте разговор идемпотентно (по match_id).

Список мэтчей

GET /v1/members/{external_id}/matches — открытые мэтчи с анкетами собеседников. Нужен для сверки и восстановления после сбоя; в обычной работе хватает событий.

Расстаться

сеть поддерживает разные способы расстаться — соберите из них своё меню переписки.

Удалить переписку только у себя — история скрыта для вашего пользователя, у собеседника остаётся, мэтч жив; новые сообщения идут как обычно:

POST /v1/matches/{match_id}/clear
{ "as": "user-123" }

Закрыть мэтч, сохранив историю — у обоих переписка остаётся, писать нельзя (409 match_closed); вторая сторона получает match.closed с reason: unmatched:

DELETE /v1/matches/{match_id}?by=user-123

Удалить пару у обоих — мэтч, переписка и лайки стираются у обоих; вторая сторона получает match.erased и убирает переписку; в лентах друг друга они не появятся cooldown_days дней (0–365, по умолчанию 30). Нужно «никогда» — блокируйте.

DELETE /v1/matches/{match_id}?by=user-123&erase=true&cooldown_days=30

Если кто-то из двоих жаловался на другого, сеть хранит скрытую копию стёртой переписки для разбора жалоб 90 дней.

Мэтч также закрывается, если кто-то из двоих заблокировал другого (reason: blocked) или удалён из сети (reason: account_deleted или left_network, плюс peer_deleted: true). Во втором случае история у вашего пользователя остаётся — покажите вместо имени и фото «Аккаунт удалён» или «Больше не в сети».

Буст и инкогнито

Необязательные режимы, отдельные права, ограничения приватности и поддержка форматов выдачи описаны в услугах сети. Обязательных событий «показ карточки» нет.

Непонятно? Напишите разработчику

Ответ и продолжение переписки — на сайте по секретной ссылке, которую вы получите после отправки. Входящая почта не принимается.