openapi: 3.0.3
info:
title: Dolby OptiView Real-time Streaming API
description: |
REST API for managing OptiView Real-time Streaming (formerly Millicast / Dolby.io
Real-time Streaming) — publish/subscribe tokens, recordings, transcoders,
encoder profiles, clusters, analytics, and webhooks. All requests are
authenticated with a Bearer API Secret created in the streaming dashboard
(Settings -> Security -> API Secrets).
version: '2026.05'
contact:
name: Dolby OptiView Support
url: https://optiview.dolby.com/docs/millicast/
servers:
- url: https://api.millicast.com/api
description: Production REST API
security:
- BearerAuth: []
tags:
- name: PublishToken
description: Create and manage publish (broadcaster) tokens.
- name: SubscribeToken
description: Create and manage subscribe (viewer) tokens.
- name: Webhook
description: Register and manage event-driven webhooks for feeds, recordings, thumbnails, transcoders, and viewer connections.
- name: Analytics
description: Account-level usage, tracking, and advanced reporting.
- name: Cluster
description: Cluster discovery for region-specific publish/subscribe URLs.
paths:
/publish_token:
post:
tags: [PublishToken]
summary: Create Publish Token
description: Create a new publish token bound to one or more stream names. Tokens may include geo restrictions, allowed origins, and recording configuration.
operationId: createPublishToken
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PublishTokenCreate'
responses:
'200':
description: Publish token created
content:
application/json:
schema:
$ref: '#/components/schemas/PublishToken'
/publish_token/list:
get:
tags: [PublishToken]
summary: List Publish Tokens
operationId: listPublishTokens
parameters:
- name: page
in: query
schema: {type: integer, minimum: 0}
- name: itemsOnPage
in: query
schema: {type: integer, minimum: 1, maximum: 100}
responses:
'200':
description: Page of publish tokens
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/PublishToken'
/publish_token/{tokenID}:
get:
tags: [PublishToken]
summary: Get Publish Token
operationId: getPublishToken
parameters:
- name: tokenID
in: path
required: true
schema: {type: integer}
responses:
'200':
description: Publish token
content:
application/json:
schema:
$ref: '#/components/schemas/PublishToken'
patch:
tags: [PublishToken]
summary: Update Publish Token
operationId: updatePublishToken
parameters:
- name: tokenID
in: path
required: true
schema: {type: integer}
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PublishTokenUpdate'
responses:
'200':
description: Publish token updated
content:
application/json:
schema:
$ref: '#/components/schemas/PublishToken'
delete:
tags: [PublishToken]
summary: Delete Publish Token
operationId: deletePublishToken
parameters:
- name: tokenID
in: path
required: true
schema: {type: integer}
responses:
'204':
description: Publish token deleted
/publish_token/account/tokens:
get:
tags: [PublishToken]
summary: List Active Publish Token IDs
operationId: listActivePublishTokenIds
responses:
'200':
description: Active token IDs for the account
content:
application/json:
schema:
type: array
items: {type: integer}
/subscribe_token:
post:
tags: [SubscribeToken]
summary: Create Subscribe Token
description: Create a viewer token bound to specific streams, with optional IP, origin, geo, or referer restrictions.
operationId: createSubscribeToken
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SubscribeTokenCreate'
responses:
'200':
description: Subscribe token created
content:
application/json:
schema:
$ref: '#/components/schemas/SubscribeToken'
/subscribe_token/list:
get:
tags: [SubscribeToken]
summary: List Subscribe Tokens
operationId: listSubscribeTokens
responses:
'200':
description: Subscribe tokens
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/SubscribeToken'
/subscribe_token/{tokenID}:
get:
tags: [SubscribeToken]
summary: Get Subscribe Token
operationId: getSubscribeToken
parameters:
- name: tokenID
in: path
required: true
schema: {type: integer}
responses:
'200':
description: Subscribe token
content:
application/json:
schema:
$ref: '#/components/schemas/SubscribeToken'
patch:
tags: [SubscribeToken]
summary: Update Subscribe Token
operationId: updateSubscribeToken
parameters:
- name: tokenID
in: path
required: true
schema: {type: integer}
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SubscribeTokenUpdate'
responses:
'200':
description: Subscribe token updated
content:
application/json:
schema:
$ref: '#/components/schemas/SubscribeToken'
delete:
tags: [SubscribeToken]
summary: Delete Subscribe Token
operationId: deleteSubscribeToken
parameters:
- name: tokenID
in: path
required: true
schema: {type: integer}
responses:
'204':
description: Subscribe token deleted
/webhooks:
get:
tags: [Webhook]
summary: List Webhooks
operationId: listWebhooks
responses:
'200':
description: Configured webhooks
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Webhook'
post:
tags: [Webhook]
summary: Create Webhook
description: Register a webhook URL to receive feeds, recordings, thumbnails, transcoder, and viewer-connection events. Payloads are signed with HMAC-SHA1 in the X-Millicast-Signature header.
operationId: createWebhook
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/WebhookCreate'
responses:
'200':
description: Webhook created
content:
application/json:
schema:
$ref: '#/components/schemas/Webhook'
/webhooks/{webhookID}:
delete:
tags: [Webhook]
summary: Delete Webhook
operationId: deleteWebhook
parameters:
- name: webhookID
in: path
required: true
schema: {type: integer}
responses:
'204':
description: Webhook removed
/analytics/tracking/total:
get:
tags: [Analytics]
summary: Get Account Tracking Totals
description: Return aggregate publish and viewer minute totals across the account.
operationId: getAnalyticsTrackingTotal
parameters:
- name: startDate
in: query
schema: {type: string, format: date}
- name: endDate
in: query
schema: {type: string, format: date}
responses:
'200':
description: Aggregated analytics
content:
application/json:
schema:
$ref: '#/components/schemas/AnalyticsTotals'
/cluster:
get:
tags: [Cluster]
summary: Get Cluster
description: Return the publish/subscribe URLs for the region the account is provisioned in.
operationId: getCluster
responses:
'200':
description: Cluster info
content:
application/json:
schema:
$ref: '#/components/schemas/Cluster'
components:
securitySchemes:
BearerAuth:
type: http
scheme: bearer
bearerFormat: API Secret
schemas:
PublishToken:
type: object
properties:
id: {type: integer}
label: {type: string}
token: {type: string, description: "JWT used by the broadcaster (WebRTC/WHIP) to publish."}
addedOn: {type: string, format: date-time}
expiresOn: {type: string, format: date-time, nullable: true}
isActive: {type: boolean}
streams:
type: array
items:
type: object
properties:
streamName: {type: string}
isRegex: {type: boolean}
allowedOrigins:
type: array
items: {type: string}
originCluster: {type: string, nullable: true}
record: {type: boolean}
multisource: {type: boolean}
enableThumbnails: {type: boolean}
PublishTokenCreate:
type: object
required: [label, streams]
properties:
label: {type: string}
streams:
type: array
items:
type: object
properties:
streamName: {type: string}
isRegex: {type: boolean, default: false}
allowedOrigins:
type: array
items: {type: string}
record: {type: boolean, default: false}
multisource: {type: boolean, default: false}
enableThumbnails: {type: boolean, default: false}
expiresOn:
type: string
format: date-time
nullable: true
PublishTokenUpdate:
type: object
properties:
label: {type: string}
isActive: {type: boolean}
allowedOrigins:
type: array
items: {type: string}
record: {type: boolean}
enableThumbnails: {type: boolean}
SubscribeToken:
type: object
properties:
id: {type: integer}
label: {type: string}
token: {type: string}
addedOn: {type: string, format: date-time}
expiresOn: {type: string, format: date-time, nullable: true}
isActive: {type: boolean}
streams:
type: array
items:
type: object
properties:
streamName: {type: string}
isRegex: {type: boolean}
allowedOrigins:
type: array
items: {type: string}
allowedIpAddresses:
type: array
items: {type: string}
bindIpsOnUsage: {type: integer, nullable: true}
allowedCountries:
type: array
items: {type: string}
deniedCountries:
type: array
items: {type: string}
SubscribeTokenCreate:
type: object
required: [label, streams]
properties:
label: {type: string}
streams:
type: array
items:
type: object
properties:
streamName: {type: string}
isRegex: {type: boolean, default: false}
allowedOrigins:
type: array
items: {type: string}
allowedIpAddresses:
type: array
items: {type: string}
bindIpsOnUsage: {type: integer, nullable: true}
allowedCountries:
type: array
items: {type: string}
deniedCountries:
type: array
items: {type: string}
expiresOn:
type: string
format: date-time
nullable: true
SubscribeTokenUpdate:
type: object
properties:
label: {type: string}
isActive: {type: boolean}
allowedOrigins:
type: array
items: {type: string}
allowedIpAddresses:
type: array
items: {type: string}
Webhook:
type: object
properties:
id: {type: integer}
url: {type: string, format: uri}
secret: {type: string, description: "HMAC-SHA1 secret used to sign event payloads (X-Millicast-Signature header)."}
isFeedHooks: {type: boolean}
isRecordingHooks: {type: boolean}
isThumbnailHooks: {type: boolean}
isTranscoderHooks: {type: boolean}
isViewerConnectionHooks: {type: boolean}
WebhookCreate:
type: object
required: [url]
properties:
url: {type: string, format: uri}
isFeedHooks: {type: boolean, default: false}
isRecordingHooks: {type: boolean, default: false}
isThumbnailHooks: {type: boolean, default: false}
isTranscoderHooks: {type: boolean, default: false}
isViewerConnectionHooks: {type: boolean, default: false}
AnalyticsTotals:
type: object
properties:
publishedMinutes: {type: number}
viewedMinutes: {type: number}
bytesTransferred: {type: number}
startDate: {type: string, format: date}
endDate: {type: string, format: date}
Cluster:
type: object
properties:
publishUrl: {type: string, format: uri}
subscribeUrl: {type: string, format: uri}
wsUrl: {type: string, format: uri}