Download OpenAPI specification:Download
Test the API with Swagger at https://api.cdn.vindral.com/api-docs
The API key used for authentication is tied to a user and shares the permissions of that user which is configured in the Vindral Portal. In addition to the user level permissions each API key has a scope of either read-only or read-write.
Read more about permissions here
Get a list of channels that the provided api key has access to.
| skip | number Default: 0 Omits the specified number of returned records. This is useful, for example, to paginate responses. |
| take | number Default: 100 Specifies how many records to include in the response. |
| orderBy | string Default: "name" Enum: "channelId" "name" "streamKey" Specifies which column to sort the response by. |
string or string Default: "asc" How to sort the response records, either in ascending or descending order. |
{- "items": [
- {
- "authRequired": true,
- "channelId": "string",
- "name": "string",
- "notes": "string",
- "streamKey": "string",
- "suspended": true,
- "isLive": true,
- "organizationId": "7bc05553-4b68-44e8-b7bc-37be63c6d9e9",
- "transcodingProfileId": "string",
- "viewerCountryLimitation": {
- "mode": "allow",
- "limited": [
- "string"
]
}, - "restreaming": [
- {
- "enabled": true,
- "url": "string"
}
], - "recording": {
- "enabled": true,
- "retentionDays": 1
}
}
], - "total": 0
}Create a new channel. Requires a read-write scoped API key with sufficient permissions.
| name required | string [ 2 .. 50 ] characters Name of the channel. |
| authRequired | boolean Default: false
|
| notes | string <= 500 characters Default: "" Notes for the channel. |
| transcodingProfileId required | string <uuid> Transcoding profile to use for this channel. |
object | |
object Recording configuration. | |
Array of objects Restreaming configuration. | |
| organizationId required | string <uuid> Organization that the channel should be added to. |
| channelId | string ChannelId (public id) for the channel, required as: |
| streamKey | string Stream key (private id) for the channel, required as: |
{- "name": "string",
- "authRequired": false,
- "notes": "",
- "transcodingProfileId": "837bdf0e-3944-423b-9940-32e2c71da88b",
- "viewerCountryLimitation": {
- "mode": "allow",
- "limited": [
- "string"
]
}, - "recording": {
- "enabled": true,
- "retentionDays": 1
}, - "restreaming": [
- {
- "enabled": true,
- "url": "string"
}
], - "organizationId": "7bc05553-4b68-44e8-b7bc-37be63c6d9e9",
- "channelId": "string",
- "streamKey": "string"
}{- "authRequired": true,
- "channelId": "string",
- "name": "string",
- "notes": "string",
- "streamKey": "string",
- "suspended": true,
- "isLive": true,
- "organizationId": "7bc05553-4b68-44e8-b7bc-37be63c6d9e9",
- "transcodingProfileId": "string",
- "viewerCountryLimitation": {
- "mode": "allow",
- "limited": [
- "string"
]
}, - "restreaming": [
- {
- "enabled": true,
- "url": "string"
}
], - "recording": {
- "enabled": true,
- "retentionDays": 1
}
}Get a list of channels belonging to a specific channel group.
| channelGroupId required | string The channel group id to get channels for. |
| skip | number Default: 0 Omits the specified number of returned records. This is useful, for example, to paginate responses. |
| take | number Default: 100 Specifies how many records to include in the response. |
| orderBy | string Default: "name" Enum: "channelId" "name" "streamKey" Specifies which column to sort the response by. |
string or string Default: "asc" How to sort the response records, either in ascending or descending order. |
{- "items": [
- {
- "authRequired": true,
- "channelId": "string",
- "name": "string",
- "notes": "string",
- "streamKey": "string",
- "suspended": true,
- "isLive": true,
- "organizationId": "7bc05553-4b68-44e8-b7bc-37be63c6d9e9",
- "transcodingProfileId": "string",
- "viewerCountryLimitation": {
- "mode": "allow",
- "limited": [
- "string"
]
}, - "restreaming": [
- {
- "enabled": true,
- "url": "string"
}
], - "recording": {
- "enabled": true,
- "retentionDays": 1
}
}
], - "total": 0
}Get a list of channels with a specific transcoding profile.
| transcodingProfileId required | string <uuid> The transcoding profile id to get channels for. |
| skip | number Default: 0 Omits the specified number of returned records. This is useful, for example, to paginate responses. |
| take | number Default: 100 Specifies how many records to include in the response. |
| orderBy | string Default: "name" Enum: "channelId" "name" "streamKey" Specifies which column to sort the response by. |
string or string Default: "asc" How to sort the response records, either in ascending or descending order. |
{- "items": [
- {
- "authRequired": true,
- "channelId": "string",
- "name": "string",
- "notes": "string",
- "streamKey": "string",
- "suspended": true,
- "isLive": true,
- "organizationId": "7bc05553-4b68-44e8-b7bc-37be63c6d9e9",
- "transcodingProfileId": "string",
- "viewerCountryLimitation": {
- "mode": "allow",
- "limited": [
- "string"
]
}, - "restreaming": [
- {
- "enabled": true,
- "url": "string"
}
], - "recording": {
- "enabled": true,
- "retentionDays": 1
}
}
], - "total": 0
}Get a channel by channel id.
| channelId required | string ID of the channel to get. |
{- "authRequired": true,
- "channelId": "string",
- "name": "string",
- "notes": "string",
- "streamKey": "string",
- "suspended": true,
- "isLive": true,
- "organizationId": "7bc05553-4b68-44e8-b7bc-37be63c6d9e9",
- "transcodingProfileId": "string",
- "viewerCountryLimitation": {
- "mode": "allow",
- "limited": [
- "string"
]
}, - "restreaming": [
- {
- "enabled": true,
- "url": "string"
}
], - "recording": {
- "enabled": true,
- "retentionDays": 1
}
}Update a channel by channel id. Requires a read-write scoped API key with sufficient permissions.
| channelId required | string ID of the channel to update. |
| name | string [ 2 .. 50 ] characters Name of the channel. |
| authRequired | boolean
|
| notes | string <= 500 characters Notes for the channel. |
| transcodingProfileId | string <uuid> Transcoding profile to use for this channel. |
object | |
object Recording configuration. | |
Array of objects Restreaming configuration. |
{- "name": "string",
- "authRequired": true,
- "notes": "string",
- "transcodingProfileId": "837bdf0e-3944-423b-9940-32e2c71da88b",
- "viewerCountryLimitation": {
- "mode": "allow",
- "limited": [
- "string"
]
}, - "recording": {
- "enabled": true,
- "retentionDays": 1
}, - "restreaming": [
- {
- "enabled": true,
- "url": "string"
}
]
}{- "authRequired": true,
- "channelId": "string",
- "name": "string",
- "notes": "string",
- "streamKey": "string",
- "suspended": true,
- "isLive": true,
- "organizationId": "7bc05553-4b68-44e8-b7bc-37be63c6d9e9",
- "transcodingProfileId": "string",
- "viewerCountryLimitation": {
- "mode": "allow",
- "limited": [
- "string"
]
}, - "restreaming": [
- {
- "enabled": true,
- "url": "string"
}
], - "recording": {
- "enabled": true,
- "retentionDays": 1
}
}Creates or updates a channel by channelId.
If the channelId exists, it will be updated - otherwise created.
channelId, streamKey or organizationId will not be changed on an existing channel, but are required to match.
Requires a read-write scoped API key with sufficient permissions.
| channelId required | string ChannelId (public id) for the channel, required as: |
| name required | string [ 2 .. 50 ] characters Name of the channel. |
| transcodingProfileId required | string <uuid> Transcoding profile to use for this channel. |
| authRequired | boolean Default: false
|
| notes | string <= 500 characters Default: "" Notes for the channel. |
| organizationId required | string <uuid> Organization that the channel should be added to. Will not update on existing channel. |
required | object |
required | object or (any or null) Recording configuration, passing |
required | Array of objects Restreaming configuration. |
| streamKey required | string Stream key (private id) for the channel, required as: |
{- "name": "string",
- "transcodingProfileId": "837bdf0e-3944-423b-9940-32e2c71da88b",
- "authRequired": false,
- "notes": "",
- "organizationId": "7bc05553-4b68-44e8-b7bc-37be63c6d9e9",
- "viewerCountryLimitation": {
- "mode": "allow",
- "limited": [
- "string"
]
}, - "recording": {
- "enabled": true,
- "retentionDays": 1
}, - "restreaming": [
- {
- "enabled": true,
- "url": "string"
}
], - "streamKey": "string"
}{- "authRequired": true,
- "channelId": "string",
- "name": "string",
- "notes": "string",
- "streamKey": "string",
- "suspended": true,
- "isLive": true,
- "organizationId": "7bc05553-4b68-44e8-b7bc-37be63c6d9e9",
- "transcodingProfileId": "string",
- "viewerCountryLimitation": {
- "mode": "allow",
- "limited": [
- "string"
]
}, - "restreaming": [
- {
- "enabled": true,
- "url": "string"
}
], - "recording": {
- "enabled": true,
- "retentionDays": 1
}
}Get one channel group by id.
| channelGroupId required | string ID of the channel group to get. |
{- "channelGroupId": "string",
- "name": "string",
- "organizationId": "7bc05553-4b68-44e8-b7bc-37be63c6d9e9"
}Update a channel group with by channel group id. If the channel array is passed in the whole array will be updated with the new array. Requires a read-write scoped API key with sufficient permissions.
| channelGroupId required | string ID of the channel group to update. |
| name | string <= 50 characters Name of the channel group. |
| channelIds | Array of strings List of channel IDs that should be part of the group. |
{- "name": "string",
- "channelIds": [
- "string"
]
}{- "channelGroupId": "string",
- "name": "string",
- "organizationId": "7bc05553-4b68-44e8-b7bc-37be63c6d9e9"
}Get a list of channel groups that the provided api key has access to.
| skip | number Default: 0 Omits the specified number of returned records. This is useful, for example, to paginate responses. |
| take | number Default: 100 Specifies how many records to include in the response. |
| orderBy | string Default: "name" Enum: "name" "channelGroupId" Specifies which column to sort the response by. |
string or string Default: "asc" How to sort the response records, either in ascending or descending order. |
{- "items": [
- {
- "channelGroupId": "string",
- "name": "string",
- "organizationId": "7bc05553-4b68-44e8-b7bc-37be63c6d9e9"
}
], - "total": 0
}Create a new channel group for a specified name and organization. Optionally add a list of channel ids that should belong to the new channel group. Requires a read-write scoped API key with sufficient permissions.
| name required | string <= 50 characters Name of the channel group. |
| organizationId required | string <uuid> Organization that the channel group should be added to. |
| channelIds | Array of strings List of channel IDs that should be part of the group. |
{- "name": "string",
- "organizationId": "7bc05553-4b68-44e8-b7bc-37be63c6d9e9",
- "channelIds": [
- "string"
]
}{- "channelGroupId": "string",
- "name": "string",
- "organizationId": "7bc05553-4b68-44e8-b7bc-37be63c6d9e9"
}Add one channel to a channel group. Specify a channelGroupId and a channelId you wish to add to the channel group. Requires a read-write scoped API key with sufficient permissions.
| channelGroupId required | string ID of the channel group to add channel to. |
| channelId required | string ID of the channel that should be added to the channel group. |
{ }nullRemove one channel from a channel group. Specify a channelGroupId and a channelId you wish to remove from the channel group. Requires a read-write scoped API key with sufficient permissions.
| channelGroupId required | string ID of the channel group to remove channel from. |
| channelId required | string ID of the channel to remove from the channel group. |
nullGet a list of transcoding profiles that the provided api key has access to.
| skip | number Default: 0 Omits the specified number of returned records. This is useful, for example, to paginate responses. |
| take | number Default: 100 Specifies how many records to include in the response. |
| orderBy | string Default: "name" Value: "name" Specifies which column to sort the response by. |
string or string Default: "asc" How to sort the response records, either in ascending or descending order. |
{- "items": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "notes": "string",
- "organizationId": "7bc05553-4b68-44e8-b7bc-37be63c6d9e9",
- "config": {
- "streams": [
- {
- "id": "string",
- "passthrough": true,
- "matchSource": {
- "streamId": 0
}, - "type": "audio",
- "renditions": [
- {
- "id": "string",
- "bitRate": 8000,
- "codec": "string",
- "sampleRate": 0,
- "channels": 1
}
]
}
]
}
}
], - "total": 0
}Create a new transcoding profile. Requires a read-write scoped API key with sufficient permissions.
| name required | string |
| notes required | string |
| organizationId required | string <uuid> |
required | object |
{- "name": "string",
- "notes": "string",
- "organizationId": "7bc05553-4b68-44e8-b7bc-37be63c6d9e9",
- "config": {
- "streams": [
- {
- "type": "audio",
- "renditions": [
- {
- "bitRate": 96000,
- "codec": "opus",
- "sampleRate": 0,
- "channels": 1
}
], - "passthrough": true,
- "matchSource": {
- "streamId": 0
}
}
]
}
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "notes": "string",
- "organizationId": "7bc05553-4b68-44e8-b7bc-37be63c6d9e9",
- "config": {
- "streams": [
- {
- "id": "string",
- "passthrough": true,
- "matchSource": {
- "streamId": 0
}, - "type": "audio",
- "renditions": [
- {
- "id": "string",
- "bitRate": 8000,
- "codec": "string",
- "sampleRate": 0,
- "channels": 1
}
]
}
]
}
}Get a transcoding profile by id.
| transcodingProfileId required | string <uuid> ID of the transcoding profile to get. |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "notes": "string",
- "organizationId": "7bc05553-4b68-44e8-b7bc-37be63c6d9e9",
- "config": {
- "streams": [
- {
- "id": "string",
- "passthrough": true,
- "matchSource": {
- "streamId": 0
}, - "type": "audio",
- "renditions": [
- {
- "id": "string",
- "bitRate": 8000,
- "codec": "string",
- "sampleRate": 0,
- "channels": 1
}
]
}
]
}
}Update a transcoding profile by id. Requires a read-write scoped API key with sufficient permissions.
| transcodingProfileId required | string <uuid> |
| id | string <uuid> |
| name | string |
| notes | string |
object |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "notes": "string",
- "config": {
- "streams": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "passthrough": true,
- "matchSource": {
- "streamId": 0
}, - "type": "audio",
- "renditions": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "bitRate": 96000,
- "codec": "opus",
- "sampleRate": 0,
- "channels": 1
}
]
}
]
}
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "notes": "string",
- "organizationId": "7bc05553-4b68-44e8-b7bc-37be63c6d9e9",
- "config": {
- "streams": [
- {
- "id": "string",
- "passthrough": true,
- "matchSource": {
- "streamId": 0
}, - "type": "audio",
- "renditions": [
- {
- "id": "string",
- "bitRate": 8000,
- "codec": "string",
- "sampleRate": 0,
- "channels": 1
}
]
}
]
}
}Delete a transcoding profile by id. Channels that referenced the deleted transcoding profile will be unusable until assigned a new transcoding profile. Requires a read-write scoped API key with sufficient permissions.
| transcodingProfileId required | string <uuid> |
nullGet the transcoding profile configured for the specific channel.
| channelId required | string ID of the channel to get the transcoding profile for. |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "notes": "string",
- "organizationId": "7bc05553-4b68-44e8-b7bc-37be63c6d9e9",
- "config": {
- "streams": [
- {
- "id": "string",
- "passthrough": true,
- "matchSource": {
- "streamId": 0
}, - "type": "audio",
- "renditions": [
- {
- "id": "string",
- "bitRate": 8000,
- "codec": "string",
- "sampleRate": 0,
- "channels": 1
}
]
}
]
}
}Get profile info based on the api token used to make the request.
{- "apiKey": {
- "name": "string",
- "scope": "read"
}, - "user": {
- "name": "string",
- "email": "string"
}, - "organizations": [
- {
- "name": "string",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "role": "administrator"
}
]
}Drop ingest for a channel.
| channelId required | string ID of the channel to drop. |
{ }{- "status": "Drop requested"
}Get live status and viewers for all channels in an organization.
| organizationId required | string <uuid> ID of the organization to get analytics data for. |
{- "viewersTotal": 0,
- "ingressBps": 0,
- "egressBps": 0,
- "channels": [
- {
- "channelId": "string",
- "viewers": 0,
- "isLive": true
}
]
}Get current number of viewers for an organization.
Use the optional query parameters channelId, countryCode and continent to filter the results.
Use the optional query parameter groupBy to group the results by country or channel.
| organizationId required | string <uuid> ID of the organization to get analytics data for. |
| channelId | string Filters for the specific channel. |
any or string Country code (ISO 3166-1 alpha-2) to filter the data on a specific country. Special code Example: | |
any or string Continent code to filter the data for a specific continent. Valid continent codes:
Example: | |
| groupBy | string Enum: "channel" "country" Optionally group by channel or country. Default is no grouping. Valid values: |
{- "channels": [
- {
- "channelId": "string",
- "viewers": 0
}
]
}Get metrics.
Use the optional query parameters channelId, countryCode and continent to filter the results.
Metrics are calculated for the time range between from and to.
By default all available metrics are returned, to limit the response use the optional query parameter fields to specify which metrics to return.
Note that viewerBitrateAverage, totalIngressBytes, restartCount, hlsEgressBytes, clippingBytes, rtmpEgressBytes and restreamBytes disregards country and continent filters!
| organizationId required | string <uuid> ID of the organization to get analytics data for. |
| channelId | string Filters for the specific channel. |
any or string Country code (ISO 3166-1 alpha-2) to filter the data on a specific country. Special code Example: | |
any or string Continent code to filter the data for a specific continent. Valid continent codes:
Example: | |
| fields | string Limit the response by selecting specific fields as a comma separated list. Available fields are:
Example: |
| groupBy | string Enum: "channel" "country" Optionally group by channel or country. Default is no grouping. Valid values: |
| from required | string Date in ISO 8601 format. Example: |
| to required | string Date in ISO 8601 format. Example: |
{- "viewerSessions": 0,
- "viewerSeconds": 0,
- "viewerSessionsAvgDurationSeconds": 0,
- "viewerBitrateAverage": 0,
- "totalEgressBytes": 0,
- "totalIngressBytes": 0,
- "restartCount": 0,
- "hlsEgressBytes": 0,
- "clippingBytes": 0,
- "rtmpEgressBytes": 0,
- "restreamBytes": 0,
- "timeToFirstFrameMedianMs": { },
- "roundTripTimeMedianMs": { },
- "browserDistribution": [
- {
- "key": "string",
- "value": 100
}
], - "osDistribution": [
- {
- "key": "string",
- "value": 100
}
], - "deviceDistribution": [
- {
- "key": "string",
- "value": 100
}
]
}Get time series.
Use the optional query parameters channelId, countryCode and continent to filter the results.
Time series are calculated for the time range between from and to (rounded to the nearest minute).
By default all available time series are returned, to limit the response use the optional query parameter fields to specify which metrics to return.
Note that ingressBps, keyframeDelta, averagePacketArrivalTime and highestPacketArrivalTime disregards country and continent filters and is not returned when grouped by country!
| organizationId required | string <uuid> ID of the organization to get analytics data for. |
| channelId | string Filters for the specific channel. |
any or string Country code (ISO 3166-1 alpha-2) to filter the data on a specific country. Special code Example: | |
any or string Continent code to filter the data for a specific continent. Valid continent codes:
Example: | |
| fields | string Limit the response by selecting specific fields as a comma separated list. Available fields are:
Example: |
| from required | string Date in ISO 8601 format. Example: |
| to required | string Date in ISO 8601 format. Example: |
{- "viewers": [
- {
- "timestamp": "string",
- "value": 0
}
], - "egressBps": [
- {
- "timestamp": "string",
- "value": 0
}
], - "ingressBps": [
- {
- "timestamp": "string",
- "value": 0
}
], - "keyframeDeltaVideo": [
- {
- "timestamp": "string",
- "value": 0
}
], - "averagePacketArrivalTimeVideo": [
- {
- "timestamp": "string",
- "value": 0
}
], - "highestPacketArrivalTimeVideo": [
- {
- "timestamp": "string",
- "value": 0
}
], - "keyframeDeltaAudio": [
- {
- "timestamp": "string",
- "value": 0
}
], - "averagePacketArrivalTimeAudio": [
- {
- "timestamp": "string",
- "value": 0
}
], - "highestPacketArrivalTimeAudio": [
- {
- "timestamp": "string",
- "value": 0
}
]
}Creates a custom clip of a recorded live stream.
This endpoint will return a m3u8 playlist which can be used in any HLS-compatible video player.
Please note that the response will be a 302 redirect, with the Location header set to the URL of your clip.
| channelId required | string ID of the channel |
| from required | string Date in ISO 8601 format. Example: |
| to required | string Date in ISO 8601 format. Example: |
nullCreates a custom clip of a recorded live stream.
This endpoint will return a mp4 which can be used in any compatible video player.
Please note that the response will be a 302 redirect, with the Location header set to the URL of your clip.
| channelId required | string ID of the channel |
| from required | string Date in ISO 8601 format. Example: |
| to required | string Date in ISO 8601 format. Example: |
null