Dolby OptiView Real-time Streaming API

Real-time WebRTC streaming platform (formerly Millicast). Manage publish and subscribe tokens, configure webhook delivery for feeds, recordings, thumbnails, transcoders, and viewer connections, retrieve account analytics, and discover regional cluster URLs. Supports WHIP/WHEP, SRT, RTMP/RTMPS ingest with H.264, H.265, VP8, VP9, AV1 video and Opus audio. Sub-500ms latency to global audiences at scale.

Dolby OptiView Real-time Streaming API is one of 6 APIs that Dolby.io publishes on the APIs.io network, described by a machine-readable OpenAPI specification.

This API exposes 4 machine-runnable capabilities that can be deployed as REST, MCP, or Agent Skill surfaces via Naftiko and 3 JSON Schema definitions.

Tagged areas include Real-time Streaming, WebRTC, WHIP, WHEP, and Live Streaming. The published artifact set on APIs.io includes API documentation, an OpenAPI specification, a JSON-LD context, 4 Naftiko capability specs, and 3 JSON Schemas.

Documentation

Specifications

Schemas & Data

Other Resources

OpenAPI Specification

dolby-io-realtime-streaming-api-openapi.yml Raw ↑
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}