User
Joining a Room with a user
There are two ways to join a room:
Direct GUI Link (Prebuilt-UI)
- Found in the links section of the API response
- No additional API communication needed
- Works with any WebRTC-capable browser
- Bound to specific user (DON'T share)
Guest URL (Prebuilt-UI)
- Uses a guest token
- Format:
https://app.eyeson.team/?guest=GUEST_TOKEN
- Provides immediate access to the meeting room
- Can be shared to allow guests to join a running meeting
All these features require a WebRTC-capable user agent, typically a modern web browser.
Fetch User Details
GET /rooms/`ACCESS_KEY`/users/`CLIENT_ID`
RESPONSES 200 OK, 404 NOT FOUND, 410 GONE
Example Req/Res: Fetch User Details
curl "https://api.eyeson.team/rooms/$ACCESS_KEY/users/$CLIENT_ID"
{'avatar': None,
'guest': False,
'id': 'janedoe',
'joined_at': '2025-03-17T09:07:50.743Z',
'name': 'Jane Doe'}
How to Get a List of All Users in an Eyeson Meeting
The most efficient way to maintain a real-time list of all participants is by using the Meeting Observer functionality:
-
Setup the WebSocket connection:
- Connect to
https://api.eyeson.team/rt?room_id=YOUR_ROOM_ID
- Include your API key for authentication (via header, WebSocket based on ActionCable, AnyCable protocol, or query parameter)
- Subscribe to the
RoomChannel
- Connect to
-
Get initial user list:
- When you first connect, you'll receive a
room_update
event - This event contains a
participants
array with all current users
- When you first connect, you'll receive a
-
Track user changes:
- Listen for
participant_update
events - Add users to your list when
online: true
- Remove users from your list when
online: false
- Listen for
Register User
To register another user, you will need an active meeting room. Follow the instructions and parameters to start a meeting. Since the room is already started a new user will be generated.
POST /rooms
HEADERS Authorization
RESPONSES 201 CREATED, 400 BAD REQUEST, 403 FORBIDDEN
REQUIRED id, user[name]
RECOMMENDED user[id]
Example Req/Res: Register User
curl -X POST -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d "{"id": "janesroom", "user": {"name": "Jane Doe", "id": "janedoe"}}" "https://api.eyeson.team/rooms"
{
"access_key": "9G1y4JiTV7mPV10ZlZ3YxQwN",
"ready": false,
"locked": false,
"room": {
"id": "janesroom",
"name": "API magic",
"ready": true,
"started_at": "2025-03-17T09:02:22.800Z",
"shutdown": false,
"guest_token": "6R2KFOrUOL3MhE9LToUVUuau"
},
"team": {
"name": "API magic"
},
"user": {
"id": "janedoe",
"room_id": "janesroom",
"name": "Jane Doe",
"avatar": null,
"guest": false,
"blocked": false,
"ready": false
},
"links": {
"self": "https://api.eyeson.team/rooms/9G1y4JiTV7mPV10ZlZ3YxQwN",
"gui": "https://app.eyeson.team/?9G1y4JiTV7mPV10ZlZ3YxQwN",
"guest_join": "https://app.eyeson.team/?guest=6R2KFOrUOL3MhE9LToUVUuau",
"websocket": "https://api.eyeson.team/rt?access_key=9G1y4JiTV7mPV10ZlZ3YxQwN"
},
"options": {
"show_names": true,
"show_label": true,
"exit_url": null,
"recording_available": true,
"broadcast_available": true,
"layout_available": true,
"layout": "auto",
"reaction_available": true,
"suggest_guest_names": true,
"lock_available": true,
"kick_available": true,
"sfu_mode": "disabled",
"layout_users": null,
"layout_name": null,
"layout_map": null,
"voice_activation": false,
"custom_fields": {},
"widescreen": true,
"background_color": "#121212"
},
"playbacks": [],
"presentation": null,
"broadcasts": [],
"recording": null,
"snapshots": [],
"waiting_list": [],
"signaling": {
"type": "sepp",
"options": {
"client_id": "67d7e66685dc14f5cccf7ef8",
"conf_id": "67d7e51e7a286f59a764392f",
"auth_token": "eyJhbGciOiJFUzM4NCJ9.eyJpc3MiOiJleWVzb24tY29tYXBpIiwiY2xpZW50X2lkIjoiNjdkN2U2NjY4NWRjMTRmNWNjY2Y3ZWY4IiwiZXhwIjoxNzQyMjA2MDcwLCJjb25mX2lkIjoiNjdkN2U1MWU3YTI4NmY1OWE3NjQzOTJmIiwiYXVkIjoiZXllc29uLXNlcHAifQ.sMFOM4zSnnTICrspbL05NJ3AG7uAceWnA8Z7F-PIXd44moSJRic-6Z86EaWjCo9LPeeF2s9UPrY107MKAK9_yrz-M4iMhQAbzv_mcDdHZEgoonpbM7MjIW05OSeoEwEr",
"endpoint": "wss://sig.eyeson.com/call",
"stun_servers": [
"stun:nuts.eyeson.com:3478"
],
"turn_servers": [
{
"urls": [
"turn:nuts.eyeson.com:3478",
"turn:nuts.eyeson.com:3478?transport=tcp",
"turns:nuts.eyeson.com:443?transport=tcp"
],
"username": "1742288870:67d7e66685dc14f5cccf7ef8",
"password": "zDIbVEEWOF84HU3uYfrPLEcK2ts="
}
]
}
}
}
The links[gui]
is the host link and should be kept a secret as it can be used to start the meeting.
The links[guest_join]
can be shared and will guide people into a waiting room until the meeting is started.
id
Type: STRING
(required)
Default: RANDOM
Room id to get users into a specific meeting room.
If omitted, the user will be alone in a new meeting room.
user[id]
Type: STRING
(optional)
Default: RANDOM
Custom user ID to identify the user in further REST requests without the need to remember or save the Eyeson user ID, e.g., an internal user ID, an e-mail address, phone number, etc. If empty, a random id will be assigned.
Also see: User ID Behavior
user[name]
Type: STRING
(required)
Default:NULL
The display name that identifies the user in the meeting interface. This name will be shown in participant lists and user interface elements where participant identification is required.
user[avatar]
Type: URL
(optional)
Default: NULL
Link to the avatar image. Avatars will be displayed in the Prebuilt UI to show in the sidebar, as placeholder when camera is off and more.
The avatar should be a publicly accessible image file with square dimensions. For optimal display quality, use a 200×200 pixel PNG image.
Register Guest User
Using the guest token received from the create room
request, any number of guest users can be created.
This provides an option for you to offer a join method to any meeting.
A guest link is only valid for the running meeting session. Once a meeting ends, the guest link perishes and cannot be used to join any future meetings in this room.
It is a best practice to hand out guest links to call participants who are not part of your core team. They will only have access to the current meeting room session and not for any future ones - unless they get explicitly invited in real-time with a link.
POST /guests/`GUEST_TOKEN` # Create a guest user for a meeting.
RESPONSES 201 CREATED, 400 BAD REQUEST, 410 GONE, 423 LOCKED
REQUIRED name
RECOMMENDED id
Example Req/Res: Create a Guest User
curl -X POST -H "Content-Type: application/json" -d "{ "name": "John Doe", "id": "johndoe"}" "https://api.eyeson.team/guests/$GUEST_TOKEN"
{
"access_key": "7fEiVaXhZXfho26NjcVaSeAD",
"ready": false,
"locked": false,
"room": {
"id": "janesroom",
"name": "API magic",
"ready": true,
"started_at": "2025-03-17T09:54:24.388Z",
"shutdown": false,
"guest_token": "08TTSQkyD09JhVDqXrBISGly"
},
"team": {
"name": "API magic"
},
"user": {
"id": "johndoe",
"room_id": "janesroom",
"name": "John Doe",
"avatar": null,
"guest": true,
"blocked": false,
"ready": false
},
"links": {
"self": "https://api.eyeson.team/rooms/7fEiVaXhZXfho26NjcVaSeAD",
"gui": "https://app.eyeson.team/?7fEiVaXhZXfho26NjcVaSeAD",
"guest_join": "https://app.eyeson.team/?guest=08TTSQkyD09JhVDqXrBISGly",
"websocket": "https://api.eyeson.team/rt?access_key=7fEiVaXhZXfho26NjcVaSeAD"
},
"options": {
"show_names": true,
"show_label": true,
"exit_url": null,
"recording_available": true,
"broadcast_available": true,
"layout_available": true,
"layout": "auto",
"reaction_available": true,
"suggest_guest_names": true,
"lock_available": true,
"kick_available": true,
"sfu_mode": "disabled",
"layout_users": null,
"layout_name": null,
"layout_map": null,
"voice_activation": false,
"custom_fields": {},
"widescreen": true,
"background_color": "#121212"
},
"playbacks": [],
"presentation": null,
"broadcasts": [],
"recording": null,
"snapshots": [],
"waiting_list": [],
"signaling": {
"type": "sepp",
"options": {
"client_id": "67d7f26e0b9fc24d6b206763",
"conf_id": "67d7f150662b26dfda2ffd3f",
"auth_token": "eyJhbGciOiJFUzM4NCJ9.eyJpc3MiOiJleWVzb24tY29tYXBpIiwiY2xpZW50X2lkIjoiNjdkN2YyNmUwYjlmYzI0ZDZiMjA2NzYzIiwiZXhwIjoxNzQyMjA5MTUwLCJjb25mX2lkIjoiNjdkN2YxNTA2NjJiMjZkZmRhMmZmZDNmIiwiYXVkIjoiZXllc29uLXNlcHAifQ.CJ7T6jyXE-bIs02_hJs618Pz57yD7FR_WBtZYpewi5CUpQ8C97uLvis8bmk46J7d0eG1e0rPa3vhu3cXrbV7TdGYIOmqXkxaczlkps9txoABxvTH3F4PMhN1a8UVi1B9",
"endpoint": "wss://sig.eyeson.com/call",
"stun_servers": [
"stun:nuts.eyeson.com:3478"
],
"turn_servers": [
{
"urls": [
"turn:nuts.eyeson.com:3478",
"turn:nuts.eyeson.com:3478?transport=tcp",
"turns:nuts.eyeson.com:443?transport=tcp"
],
"username": "1742291950:67d7f26e0b9fc24d6b206763",
"password": "32ZpgARvgAXYPqhc9iq/+3BaJ9E="
}
]
}
}
}
id
Type: STRING
(optional)
User identifier
name
Type: STRING
(required)
Users name to be displayed in participants list.
avatar
Type: URL
(optional)
HTTP URI to a an avatar image shown in Prebuilt-UI.
custom_fields[locale]
Type: Language Code (optional)
User preferred language code in Prebuilt-UI.
Valid values: en
, de
, fr
Kick User
Sometimes it may be necessary to remove a participant from a meeting.
Please be aware, that kicked users can re-join at any time! You will need to lock the room right after someone is kicked, to keep the user from rejoining.
DELETE /rooms/`ACCESS_KEY`/users/`USER_ID`
RESPONSES 200 OK, 403 FORBIDDEN, 404 NOT FOUND, 410 GONE
Example Req/Res: Kick User
curl -X DELETE "https://api.eyeson.team/rooms/$ACCESS_KEY/users/$USER_ID"
No Repsonse
If options[kick_available] is set to FALSE
, related API requests will respond with status 403 FORBIDDEN
.
User ID Behavior
Cross-API Key Isolation
- User IDs from different API keys are completely isolated and will never collide
- These are logically decoupled systems with no shared user ID namespace
User ID Behavior Within the Same API Key
When using the same API key, the following rules apply:
Reusability
- A user ID previously used in any meeting can be reused in subsequent meetings
- The same user ID can function as either a guest user or a generic user
Meeting Rules
- Starting a new room: If a room is not running, any user ID can be used without conflicts, regardless of previous usage
- Joining existing rooms:
- If a room is running and the user hasn't joined yet, they can join without conflicts
- Rejoining: If rejoining the same running instance with the same user ID:
- Will receive identical credentials as initial join
- Must use the same access level (guest or generic user) as initial join
- Attempting to join with a different access level will result in a
Erro 409
Conflict.
Access Level Restrictions
- A single user ID cannot join a running meeting instance as both a guest and a generic user
- When a meeting ends, these rules reset for the next meeting session