Events list
Без логинаGET /events?limit=20 Главный экран поиска событий: title, image_url, starts_at, location, participant_count и badges.
Backend contract уже описан в OpenAPI. Этой страницы достаточно, чтобы другой разработчик понял текущие base URL, авторизацию, основные ресурсы и где скачать спецификацию.
API_BASE_URL=https://meets.cc/api/backend WEB_ORIGIN=https://meets.cc API_CORS_ALLOWED_ORIGIN=https://meets.cc OPENAPI=https://meets.cc/api/openapi.yamlМобильный клиент должен использовать HTTPS endpoint. Nginx снимает префикс /api/backend и проксирует запросы в backend root, поэтому https://meets.cc/api/backend/events соответствует backend path /events.
Native-клиент отправляет Authorization: Bearer ACCESS_TOKEN. Browser/WebView flow остаётся
совместимым с HttpOnly cookie vstrechi_refresh_token.
curl -i https://meets.cc/api/backend/healthz
curl -i "https://meets.cc/auth/yandex/start?return_to=/profile"Native-контракт: короткоживущий Bearer access token и ротируемый refresh token.
POST https://meets.cc/api/backend/auth/refresh
Content-Type: application/json
{"refresh_token":"REFRESH_TOKEN_FROM_LOGIN"} GET https://meets.cc/api/backend/me
Authorization: Bearer ACCESS_TOKENМинимальный порядок работ для мобильного разработчика без погружения в backend-код.
Практический порядок сборки: сначала anonymous discovery, потом login, join, calendar и notifications.
GET /events?limit=20 Главный экран поиска событий: title, image_url, starts_at, location, participant_count и badges.
GET /events/{event_id} Детальная карточка события, место, организатор, текущий статус участия и social proof.
GET /feed?limit=20 Лента событий и activity-сигналов. Для signed-in пользователя появляются персональные причины.
GET /me Проверка текущего пользователя после login/refresh и источник данных для профиля.
POST /events/{event_id}/join Главное mutating действие: после join обновлять detail, attendees и calendar affordance.
GET /calendar/entries Личный календарь пользователя, включая event-linked entries после участия.
Request, expected result and client-side action for the first mobile flows.
Скачать runnable collection для REST Client: mobile-api-examples.http.
GET /events?limit=20
GET /feed?limit=20 POST /auth/dev/start
POST /auth/dev/verify POST /auth/refresh
GET /me POST /events/{event_id}/join
{"participation_visibility":"public"} GET /calendar/entries
GET /notifications?limit=20 POST /auth/logout
GET /me Поля, на которые можно опираться при сборке первых экранов. Полные схемы остаются в OpenAPI YAML.
GET /events, GET /feedevent.idevent.titleevent.starts_atevent.image_urlevent.statuslocation.cityparticipant_countfeed_context.viewer_goingGET /meuser.iduser.emailprofile.user_idprofile.display_nameprofile.avatar_urlprofile.cityprofile.interestsPOST /auth/dev/verifycurrent_usersession_idaccess_tokenaccess_token_expires_attoken_typerefresh_tokenexpires_atPOST /auth/refreshsession_idaccess_tokenaccess_token_expires_attoken_typerefresh_tokenexpires_atthen GET /me with BearerGET /calendar/entriesidowner_user_idsourceevent_idtitlestarts_atstatuslocation_textGET /notificationsitems[]unread_countitems[].kinditems[].titleitems[].bodyitems[].hrefitems[].read_atGET /calendar/invitesinvite.idinvite.statusentry.identry.titleentry.starts_atentry.location_textСкрипт проверяет HTTPS API base URL, публичные reads, mobile DTO shape, OpenAPI, anonymous protected
gates, allowlisted CORS preflight, блокировку чужого origin, dev-auth, Secure/HttpOnly/SameSite cookie,
refresh через JSON body, /me, calendar, notifications и logout.
API_BASE_URL=https://meets.cc/api/backend WEB_BASE_URL=https://meets.cc API_CORS_ALLOWED_ORIGIN=https://meets.cc ./scripts/check-mobile-api-contract Browser CORS работает по allowlist из API_CORS_ALLOWED_ORIGINS; на staging разрешен https://meets.cc. Native HTTP client не ограничен browser CORS.
Правила состояния клиента вокруг refresh, protected endpoints и logout.
Most API errors return JSON as {"error":"code"}; mobile client behavior should follow the status first, then the code.
invalid_requestMalformed JSON, invalid filter, missing required field or invalid enum value.
Keep the user on the current screen, highlight the form field or show a compact validation message.unauthorizedNo valid access token/cookie, expired session or logout completed.
Attempt one refresh for an expired access token; otherwise clear local session state and show login gate.forbiddenSigned-in user is authenticated but cannot perform this action.
Do not retry automatically; show a permission message and keep local state unchanged.not_foundEvent, profile, calendar entry, invite, notification or post does not exist or is not visible.
Show not-found/removed state and remove stale local references after reload.username_takenProfile username conflict.
Ask user to choose another username; keep the edit form open.internal_errorUnexpected server-side failure.
Show retry affordance, keep optimistic state pending or roll it back after timeout.Полный список схем, responses и request bodies находится в OpenAPI YAML.
GET /auth/yandex/startGET /auth/yandex/callbackPOST /auth/refreshPOST /auth/logoutGET /mePATCH /me/profileGET /users/profilesGET /users/{user_id}/profileGET /eventsGET /events/{event_id}POST /eventsPOST /events/{event_id}/joinGET /feedGET /feed/preferencesPOST /feed/preferencesPOST /users/{user_id}/followGET /calendar/entriesPOST /calendar/entriesGET /calendar/invitesPATCH /calendar/invites/{invite_id}GET /notificationsGET /notifications/unread-countPOST /notifications/read-allGET /events, GET /feed, GET /users/profiles можно читать без логина.PAYMENTS_ENABLED=false, paid mutations должны считаться недоступными.Куда иду.