Communications
13 routes. Paths are relative to https://api.intersink.com/v1.
- POST/comms/call-qualityReport one finished call's quality numbers (numbers and types only; no addresses or content)
- GET/comms/channels/{channelId}/overviewStatus, limits and this month's usage (channel managers)
- GET/comms/channels/{channelId}/roomsThe channel's rooms, newest first (channel managers)
- DELETE/comms/channels/{channelId}/rooms/{id}End a call on the channel (channel managers)
- PUT/comms/channels/{channelId}/settingsTurn calls on or off for the channel (channel managers)
- GET/comms/ice-serversSTUN/TURN servers with TURN credentials for peer-to-peer calls
- POST/comms/roomsOpen a room for a resource (or return its open one), or an ad hoc room
- GET/comms/rooms/{id}A room you can join, with who is in the call
- DELETE/comms/rooms/{id}End the call for everyone (host/moderator)
- POST/comms/rooms/{id}/inviteInvite people of your channel to an ad hoc room (host/moderator)
- POST/comms/rooms/{id}/removeRemove someone from the call (host/moderator)
- POST/comms/rooms/{id}/tokenA join token for this room only, as you
- GET/comms/rooms/findThe open room of a group, business or connection, if any
Report one finished call's quality numbers (numbers and types only; no addresses or content)
POST/comms/call-quality
Needs a signed-in user (Bearer token or access_token cookie).
One report per account per call; a second answers { stored: false, reason: duplicate }. If the person turned off call_quality in their preferences (PATCH /users/me/preferences), nothing is kept: { stored: false, reason: opted_out }. Rows hold the channel, call id and numbers only, and are deleted after 30 days. 60 reports an hour per account. A call rung through the relay (POST /e2ee/calls/:call_id/ring) takes reports only from its caller and callee for a day: anyone else gets 403 NOT_IN_CALL.
Request body application/json
| Field | Type | Description |
|---|---|---|
| call_idrequired | string | The call's id (the one the call was rung with) |
| platform | string | One of: "ios", "android", "web", "desktop". |
| direction | string | One of: "outgoing", "incoming". |
| local_candidates | object | Local ICE candidates gathered, per type |
| local_candidates.host | number | Minimum 0, maximum 200. |
| local_candidates.srflx | number | Minimum 0, maximum 200. |
| local_candidates.prflx | number | Minimum 0, maximum 200. |
| local_candidates.relay | number | Minimum 0, maximum 200. |
| remote_candidates | object | Remote ICE candidates received, per type |
| remote_candidates.host | number | Minimum 0, maximum 200. |
| remote_candidates.srflx | number | Minimum 0, maximum 200. |
| remote_candidates.prflx | number | Minimum 0, maximum 200. |
| remote_candidates.relay | number | Minimum 0, maximum 200. |
| selected_local | string | Type of the local candidate of the selected pair One of: "host", "srflx", "prflx", "relay". |
| selected_remote | string | Type of the remote candidate of the selected pair One of: "host", "srflx", "prflx", "relay". |
| selected_protocol | string | Transport of the selected pair (tls: TURN over TLS) One of: "udp", "tcp", "tls". |
| rtt_ms | number | Round-trip time, milliseconds (median over the call) Minimum 0, maximum 60000. |
| jitter_ms | number | Jitter, milliseconds (median over the call) Minimum 0, maximum 10000. |
| packet_loss_pct | number | Packets lost, percent of those expected (0 to 100) Minimum 0, maximum 100. |
| codec | string | One of: "opus", "pcmu", "pcma", "g722", "isac", "vp8", "vp9", "h264", "av1", "other". |
| duration_s | number | Seconds the call was connected Minimum 0, maximum 86400. |
| setup_ms | number | Milliseconds from start to connected Minimum 0, maximum 600000. |
| audio_route | string | Where the audio played for most of the call One of: "receiver", "speaker", "wired", "bluetooth", "car", "airplay", "usb", "other". |
| end_reason | string | One of: "hangup", "remote_hangup", "failed", "dropped", "declined", "missed". |
| video | boolean | Video was on |
Response
200. The payload in data is of type object.
Status, limits and this month's usage (channel managers)
GET/comms/channels/{channelId}/overview
Needs a signed-in user (Bearer token or access_token cookie).
Parameters
| Name | Type | Description |
|---|---|---|
| channelIdrequired | string, path |
Response
200. The payload in data is not described in the spec yet.
The channel's rooms, newest first (channel managers)
GET/comms/channels/{channelId}/rooms
Needs a signed-in user (Bearer token or access_token cookie).
Parameters
| Name | Type | Description |
|---|---|---|
| channelIdrequired | string, path |
Response
200. The payload in data is not described in the spec yet.
End a call on the channel (channel managers)
DELETE/comms/channels/{channelId}/rooms/{id}
Needs a signed-in user (Bearer token or access_token cookie).
Parameters
| Name | Type | Description |
|---|---|---|
| channelIdrequired | string, path | |
| idrequired | string, path |
Response
200. The payload in data is not described in the spec yet.
Turn calls on or off for the channel (channel managers)
PUT/comms/channels/{channelId}/settings
Needs a signed-in user (Bearer token or access_token cookie).
Parameters
| Name | Type | Description |
|---|---|---|
| channelIdrequired | string, path |
Response
200. The payload in data is not described in the spec yet.
STUN/TURN servers with TURN credentials for peer-to-peer calls
GET/comms/ice-servers
Needs a signed-in user (Bearer token or access_token cookie).
TURN URLs over UDP and TCP (3478) and, when configured, TURN over TLS (turns:, port 443). The credential is computed on the server without any network call and lives 24 hours by default (expires_at); cache the answer and ask again at refresh_at. 60 requests an hour per account.
Response
200. The payload in data is not described in the spec yet.
Open a room for a resource (or return its open one), or an ad hoc room
POST/comms/rooms
Needs a signed-in user (Bearer token or access_token cookie).
Response
201. The payload in data is of type object.
A room you can join, with who is in the call
GET/comms/rooms/{id}
Needs a signed-in user (Bearer token or access_token cookie).
Parameters
| Name | Type | Description |
|---|---|---|
| idrequired | string, path |
Response
200. The payload in data is not described in the spec yet.
End the call for everyone (host/moderator)
DELETE/comms/rooms/{id}
Needs a signed-in user (Bearer token or access_token cookie).
Parameters
| Name | Type | Description |
|---|---|---|
| idrequired | string, path |
Response
200. The payload in data is not described in the spec yet.
Invite people of your channel to an ad hoc room (host/moderator)
POST/comms/rooms/{id}/invite
Needs a signed-in user (Bearer token or access_token cookie).
Parameters
| Name | Type | Description |
|---|---|---|
| idrequired | string, path |
Response
200. The payload in data is not described in the spec yet.
Remove someone from the call (host/moderator)
POST/comms/rooms/{id}/remove
Needs a signed-in user (Bearer token or access_token cookie).
Parameters
| Name | Type | Description |
|---|---|---|
| idrequired | string, path |
Response
200. The payload in data is not described in the spec yet.
A join token for this room only, as you
POST/comms/rooms/{id}/token
Needs a signed-in user (Bearer token or access_token cookie).
Parameters
| Name | Type | Description |
|---|---|---|
| idrequired | string, path |
Response
200. The payload in data is not described in the spec yet.
The open room of a group, business or connection, if any
GET/comms/rooms/find
Needs a signed-in user (Bearer token or access_token cookie).
Parameters
| Name | Type | Description |
|---|---|---|
| kindrequired | string, query | |
| resource_idrequired | string, query |
Response
200. The payload in data is not described in the spec yet.