MTS Link data API: sessions, roster and transcripts
MTS Link is the Android client from VEBINAR TEKHNOLOGII, OOO for MTS Link — the webinar.ru meetings and webinar platform after its rebrand under Russian telecom MTS. Users sign in with email and password or company SSO, then work from a calendar of event sessions: join as a guest with a nickname, register for a paid event, start or stop a live room, and open a recording with a transcript. Hosts see lectors, translators and access gates (password, registration or moderation); participants sit on a roster with role and payment status. The app serves Russian enterprises, universities and training teams that already buy MTS Link webinars, sitting next to Zoom Workplace, Microsoft Teams and TrueConf in the same meetings slot.
Signed-in cabinet cards mint a sessionId cookie plus an authentication pair of accessToken and refreshToken. The user record carries id, type, name, secondName, nickname, email, phone, organization, position and organizationId. Feature flags add isMeeting, hasPersonalCabinet and showMobileAppMigrationBanner; SSO choosers list name and redirectUrl.
Timetable payloads are ISO date strings. Schedule rows expose cost, isEventRegAllowed, startsAt, estimatedAt, endsAt, duration, isEndless, timezone, eventLink, eventId and nested eventSessions. A session detail adds accessSettings (isPasswordRequired, isRegistrationRequired, isModerationRequired), lectors, languages and hasTranslators.
Guest join returns guestLoginId and isAccepted. Registration posts additionalFields and acceptedAgreementIds, then mints a new sessionId. The roster lists role, isTranslator, languageCode, registerStatus and paymentStatus. Recording status reports isRecording, isControlAllowed and sessionStatus. Transcript pages carry transcriptName, line dateTime/text/userId and nextPageCursor, with a nested summary. Paid checkout returns paymentUrl for a participationId.
LMS calendars can hydrate session dates, attendance desks can reconcile the roster against paymentStatus, and compliance archives can store transcripts next to recording flags — and openData Studio turns that webinar ledger into callable open data.
Screenshots
API surface
The endpoints and request/response examples below are reconstructed from the app's interface — illustrative, not a live capture.
Cabinet email-password sign-in
POST
/v1/cabinet/sessionsosintAuthenticates a cabinet user and returns sessionId plus the JWT pair and profile (name, secondName, organizationId) that later mobile calls hang off.
Auth: Unauthenticated. Body is email, password and deviceId. The response sessionId is sent later as Cookie: sessionId=; authentication.accessToken and authentication.refreshToken are the JWT pair.
- password
- deviceId
- sessionId
- message
- user
- id
- type
- name
- secondName
- nickname
- phone
- organization
- position
- avatar
- canChangePassword
- isSubmitted
- organizationId
- authentication
- accessToken
- refreshToken
POST /v1/cabinet/sessions HTTP/1.1 Content-Type: application/json { "email": "[email protected]", "password": "<redacted>", "deviceId": "dvc-8c21f0ab" }{ "sessionId": "sess-7c11a92e", "message": {}, "user": { "id": "u-10482", "type": "USER", "name": "Alex", "secondName": "Ivanov", "nickname": "aivanov", "email": "[email protected]", "phone": "+79991234567", "organization": "Example Corp", "position": "Product Manager", "avatar": {}, "canChangePassword": true, "isSubmitted": true, "organizationId": "org-2201" }, "authentication": { "accessToken": "<access-token>", "refreshToken": "<refresh-token>" } }List SSO login methods
GET
/v1/auth/sso-methodsopendataReturns the organization's SSO method list (name, redirectUrl) that the sign-in chooser renders before a password or SAML handoff.
Auth: Unauthenticated discovery before cabinet sign-in. Each method carries name and redirectUrl for the SSO handoff.
- data
- sso
- methods
- name
- redirectUrl
GET /v1/auth/sso-methods HTTP/1.1 Accept: application/json{ "data": { "sso": { "methods": [ { "name": "Example IdP", "redirectUrl": "https://idp.example/sso/start" } ] } } }Refresh JWT access token
POST
/v1/auth/tokens/refreshopendataExchanges a stored refreshToken for a new JWT pair without repeating email/password sign-in.
Auth: Body carries refreshToken from the cabinet sign-in authentication object. Cookie: sessionId= from cabinet sign-in. Returns a new accessToken/refreshToken pair.
- refreshToken
- accessToken
POST /v1/auth/tokens/refresh HTTP/1.1 Content-Type: application/json Cookie: sessionId=sess-7c11a92e { "refreshToken": "<refresh-token>" }{ "refreshToken": "<refresh-token-next>", "accessToken": "<access-token-next>" }Read cabinet feature flags
GET
/v1/cabinet/entitlementsopendataReturns the signed-in account's product flags: meetings entitlement, personal cabinet, and the mobile-app migration banner.
Auth: Cookie: sessionId= from cabinet email-password sign-in.
- isMeeting
- hasPersonalCabinet
- showMobileAppMigrationBanner
GET /v1/cabinet/entitlements HTTP/1.1 Cookie: sessionId=sess-7c11a92e Accept: application/json{ "isMeeting": true, "hasPersonalCabinet": true, "showMobileAppMigrationBanner": false }List calendar dates with sessions
GET
/v1/calendar/marked-daysopendataReturns ISO date strings for days that have event sessions, used to paint the in-app timetable.
Auth: Cookie: sessionId= from cabinet email-password sign-in.
- data
GET /v1/calendar/marked-days HTTP/1.1 Cookie: sessionId=sess-7c11a92e Accept: application/json{ "data": [ "2026-10-12", "2026-10-13", "2026-10-20" ] }Read scheduled event sessions
GET
/v1/calendar/sessionsopendataReturns scheduled webinar/meeting rows (startsAt, cost, eventLink, nested eventSessions) that fill the calendar list.
Auth: Cookie: sessionId= from cabinet email-password sign-in.
- id
- type
- cost
- isEventRegAllowed
- name
- status
- startsAt
- estimatedAt
- endsAt
- duration
- isEndless
- timezone
- image
- creator
- eventLink
- eventId
- eventSessions
GET /v1/calendar/sessions HTTP/1.1 Cookie: sessionId=sess-7c11a92e Accept: application/json{ "id": "es-9001", "type": "webinar", "cost": 0, "isEventRegAllowed": "true", "name": "Q4 product briefing", "status": "ACTIVE", "startsAt": "2026-10-20T10:00:00+03:00", "estimatedAt": "2026-10-20T11:00:00+03:00", "endsAt": "2026-10-20T11:00:00+03:00", "duration": 3600, "isEndless": false, "timezone": {"name": "Europe/Moscow"}, "image": {}, "creator": {"id": "u-10482", "name": "Alex"}, "eventLink": "https://events.example/j/9001", "eventId": "ev-441", "eventSessions": [] }Read one event session
GET
/v1/rooms/{sessionId}opendataHydrates a single event session including accessSettings, lectors, languages and eventLink for the room join screen.
Auth: Cookie: sessionId= from cabinet sign-in (or a guest session minted at walk-in join or enrollment).
- id
- access
- accessSettings
- isPasswordRequired
- isRegistrationRequired
- isModerationRequired
- name
- description
- startsAt
- estimatedAt
- utcStartsAt
- duration
- type
- status
- startType
- lectors
- announceFiles
- createUser
- isAuto
- isEndless
- event
- organization
- eventLink
- languages
- hasTranslators
GET /v1/rooms/es-9001 HTTP/1.1 Cookie: sessionId=sess-7c11a92e Accept: application/json{ "id": "es-9001", "access": 1, "accessSettings": { "isPasswordRequired": false, "isRegistrationRequired": true, "isModerationRequired": false }, "name": "Q4 product briefing", "description": "Roadmap walkthrough", "startsAt": "2026-10-20T10:00:00+03:00", "estimatedAt": "2026-10-20T11:00:00+03:00", "utcStartsAt": 1797480000000, "duration": "3600", "type": "webinar", "status": "ACTIVE", "startType": "MANUAL", "lectors": [{"name": "Alex Ivanov"}], "announceFiles": [], "image": {}, "createUser": {"id": "u-10482"}, "isAuto": false, "isEndless": false, "event": {"id": "ev-441"}, "organization": {"id": "org-2201"}, "eventLink": "https://events.example/j/9001", "languages": ["ru"], "hasTranslators": false }Register for an event
POST
/v1/events/{eventId}/enrollopendataRegisters an attendee on an event and returns a sessionId plus JWT pair used to enter the session room.
Auth: Optional prior Cookie: sessionId=. Body carries email, name, secondName, sessionId, additionalFields, requiredFields and acceptedAgreementIds. Response mints sessionId plus JWT authentication.
- name
- secondName
- sessionId
- additionalFields
- requiredFields
- acceptedAgreementIds
- authorization
- authentication
- accessToken
- refreshToken
POST /v1/events/ev-441/enroll HTTP/1.1 Content-Type: application/json { "email": "[email protected]", "name": "Maria", "secondName": "Petrova", "sessionId": "es-9001", "additionalFields": {}, "requiredFields": {}, "acceptedAgreementIds": ["ag-1"] }{ "sessionId": "sess-guest-22", "authorization": "ok", "authentication": { "accessToken": "<access-token>", "refreshToken": "<refresh-token>" } }Guest-login to an event session
POST
/v1/rooms/{sessionId}/walk-inopendataCreates a guest identity for a session and returns guestLoginId, isAccepted and a JWT pair when moderation is not required.
Auth: Unauthenticated guest join. Body is nickname plus device/app metadata (userDevice, userAppVersion, os, userOsVersion, userAppName, platform).
- nickname
- userDevice
- userAppVersion
- os
- userOsVersion
- userAppName
- platform
- guestLoginId
- user
- isAccepted
- authentication
- accessToken
- refreshToken
POST /v1/rooms/es-9001/walk-in HTTP/1.1 Content-Type: application/json { "nickname": "Guest-42", "userDevice": "Pixel 8", "userAppVersion": "4.10.0-google", "os": "Android", "userOsVersion": "14", "userAppName": "MTS Link", "platform": "android" }{ "guestLoginId": "gl-881", "user": { "id": "guest-881", "nickname": "Guest-42" }, "isAccepted": true, "authentication": { "accessToken": "<access-token>", "refreshToken": "<refresh-token>" } }List session participations
GET
/v1/rooms/{sessionId}/rosteropendataReturns the session roster: role, isAccepted, translator flag, registerStatus and paymentStatus per participant.
Auth: Cookie: sessionId= from cabinet sign-in or event enrollment.
- id
- user
- role
- isAccepted
- isTranslator
- languageCode
- registerStatus
- paymentStatus
GET /v1/rooms/es-9001/roster HTTP/1.1 Cookie: sessionId=sess-7c11a92e Accept: application/json[ { "id": "p-3102", "user": { "id": "u-10482", "name": "Alex", "secondName": "Ivanov" }, "role": "LECTOR", "isAccepted": true, "isTranslator": false, "languageCode": "ru", "registerStatus": "REGISTERED", "paymentStatus": "PAID" } ]Read live recording status
GET
/v1/rooms/{sessionId}/captureopendataReports whether the live session is being recorded, whether the caller may control recording, and sessionStatus.
Auth: Cookie: sessionId= from cabinet sign-in. Hosts with control see isControlAllowed.
- isRecording
- isControlAllowed
- sessionStatus
GET /v1/rooms/es-9001/capture HTTP/1.1 Cookie: sessionId=sess-7c11a92e Accept: application/json{ "isRecording": true, "isControlAllowed": true, "sessionStatus": "STARTED" }Page a session transcript
GET
/v1/recordings/{transcriptId}/cuesopendataReturns a page of transcript lines (dateTime, text, userId, nickname) plus nextPageCursor for the recording viewer.
Auth: Cookie: sessionId= from cabinet sign-in.
- transcriptName
- items
- id
- dateTime
- text
- userId
- nickname
- nextPageCursor
GET /v1/recordings/tr-55/cues HTTP/1.1 Cookie: sessionId=sess-7c11a92e Accept: application/json{ "transcriptName": "Q4 product briefing", "items": [ { "id": "ti-1", "dateTime": "2026-10-20T10:05:12+03:00", "text": "Welcome to the briefing.", "userId": "u-10482", "nickname": "aivanov" } ], "nextPageCursor": "cur-2" }Read transcript summary
GET
/v1/recordings/{transcriptId}/digestopendataReturns the auto-generated text summary of a session transcript.
Auth: Cookie: sessionId= from cabinet sign-in.
- data
- summary
GET /v1/recordings/tr-55/digest HTTP/1.1 Cookie: sessionId=sess-7c11a92e Accept: application/json{ "data": { "summary": "Roadmap walkthrough covering Q4 launches and pricing." } }Create a paid-event payment URL
POST
/v1/checkout/ticketsopenfinanceStarts card checkout for a paid participation and returns paymentUrl for the in-app browser.
Auth: Cookie: sessionId= from event enrollment. Body is participationId and type (default card).
- participationId
- type
- paymentUrl
POST /v1/checkout/tickets HTTP/1.1 Cookie: sessionId=sess-guest-22 Content-Type: application/json { "participationId": "p-3102", "type": "card" }{ "paymentUrl": "https://pay.example/checkout/p-3102" }
Data categories
- identity
- sessions
- calendar
- registration
- roster
- recording
- transcripts
- payments
Where teams use this data
LMS calendar hydration
Training desks pull timetable ISO date strings and schedule rows (startsAt, eventLink, cost) so a campus LMS lists the same webinars the mobile calendar paints.
Attendance and payment desk
Ops consoles read the session roster (role, registerStatus, paymentStatus) and paid-ticket checkout (paymentUrl) to reconcile who is admitted versus who still owes.
Recording and transcript archive
Compliance bots poll capture status (isRecording, sessionStatus) then page transcript lines (dateTime, text, userId) and the nested summary.
Guest-join kiosk
Lobby tablets send walk-in nickname join (nickname, isAccepted) or event enrollment so walk-in attendees mint a session without a cabinet password.
Frequently asked questions
How does MTS Link authenticate mobile API calls?
Cabinet email-password sign-in accepts email, password and deviceId and returns sessionId plus authentication.accessToken and authentication.refreshToken. Later calls send Cookie: sessionId=. A refresh call exchanges refreshToken for a new JWT pair. SSO choosers list name and redirectUrl before that handoff.
Which fields expose the webinar calendar?
Marked-day payloads are ISO date strings. Schedule rows carry startsAt, cost, eventLink and nested eventSessions. A session detail hydrates accessSettings, lectors and eventLink for the room-join screen.
How do guests and paid attendees join?
Walk-in join sends nickname and device metadata and returns guestLoginId and isAccepted. Event enrollment registers email, name and secondName. The roster lists role, registerStatus and paymentStatus. Checkout returns paymentUrl for type=card.
Where are recordings and transcripts?
Capture status returns isRecording, isControlAllowed and sessionStatus. Transcript pages return transcriptName and items (dateTime, text, userId, nickname) plus nextPageCursor. A digest call returns data.summary.
Apps similar to MTS Link
- Zoom Workplace — Zoom Workplace is Zoom's collaboration app for video meetings, team chat, phone, docs and webinars, with one-tap join and built-in meeting summaries.
- Microsoft Teams — Microsoft Teams is Microsoft 365's team collaboration platform with workspace chat, video conferencing, file storage and calendar meetings in one app.
- TrueConf — TrueConf is a corporate messenger and video conferencing app that schedules conferences for up to 2000 participants and can run on-premises on a private network with SSO.
- Google Meet — Google Meet is Google's video communication service for online meetings, available on its own and as part of Google Workspace alongside Calendar and Chat.
- Cisco Webex — Webex by Cisco is a web conferencing and videoconferencing suite whose products include Webex Meetings, Messaging, Calling and related collaboration apps.
- GoTo — The GoTo mobile app combines phone, messaging, meetings, training and webinars so teams can join video sessions and reach customers from one client.
- VK WorkSpace — VK WorkSpace (formerly VK Teams) is a Russian workplace super-app with messenger chats and channels plus audio and video calls for online meetings.
Topics
- mts link api
- webinar.ru api
- mts link session api
- mts link transcript api
- mts link paymentUrl
- event session timetable
- webinar guest join api
Need this app's data API integrated?
We deliver scoped integrations for any named app — from USD 500 with source-code handoff, or hosted access billed per call. Tell us the data you need.
- NDA + SOW on every engagement
- Delivery in 3–7 days
- Payment only after acceptance
- Work scoped to authorized use