Dolby OptiView Director API (Millicast)

Millicast Director API - the WebRTC/WHIP/WHEP signalling entry point clients call to obtain publish and subscribe endpoints, plus the DRM proxy and multi-track video configuration. 7 paths / 7 operations.

Operations 7

POST /api/director/publish Publish #
POST /api/director/subscribe Subscribe #
POST /api/drm_proxy/{licenseType}/{assetId} #
GET /api/drm_proxy/fair_play/cert #
POST /api/multitrackvideo/configuration Configuration #
POST /api/whep/{streamAccountId}/{streamName} WHEP #
POST /api/whip/{streamName} WHIP #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/millicast-director"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

dolby-millicast-director-openapi.yml Raw ↑
x-generator: NSwag v14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))
openapi: 3.0.0
info:
  title: Director API
  version: 1.0.0
servers:
- url: https://director.millicast.com
paths:
  /api/director/publish:
    post:
      tags:
      - Director
      summary: Publish
      description: Request for url and authorization to publish a stream.
      operationId: Director_Publish
      requestBody:
        x-name: model
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PublishStreamModel'
            examples:
              ? ''
              : summary: ''
                value:
                  streamName: my_stream
        required: true
        x-position: 1
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessPublishDirectorResponseModel'
              examples:
                ? ''
                : summary: ''
                  value:
                    status: success
                    data:
                      urls:
                      - wss://domain.millicast.com/ws/pub/faux
                      jwt: long_jwt_string
                      iceServers:
                      - urls: stun:stun.example.com:3478
                      - urls: turn:turn.example.com:443?transport=tcp
                        username: user
                        credential: secret
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailResponse'
        default:
          description: Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
      - Token: []
      x-codeSamples:
      - lang: curl
        source: "curl -H \"Authorization: Bearer your_api_secret\" \\\n     -H \"Content-Type: application/json\" \\\n   \
          \  https://director.millicast.com/api/director/publish \\\n     -d '{\"streamName\": \"my_stream\"}'"
  /api/director/subscribe:
    post:
      tags:
      - Director
      summary: Subscribe
      description: Request for url and authorization to subscribe to a stream.
      operationId: Director_Subscribe
      requestBody:
        x-name: model
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubscribeStreamModel'
            examples:
              noauth:
                summary: noauth
                value:
                  streamName: my_insecure_stream
                  streamAccountId: abc123
              auth:
                summary: auth
                value:
                  streamName: my_secure_stream
        required: true
        x-position: 1
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessSubscribeDirectorResponseModel'
              examples:
                noauth:
                  summary: noauth
                  value:
                    status: success
                    data:
                      urls:
                      - wss://domain.millicast.com/ws/sub/faux
                      jwt: long_jwt_string
                      iceServers:
                      - urls: stun:stun.example.com:3478
                      - urls: turn:turn.example.com:443?transport=tcp
                        username: user
                        credential: secret
                auth:
                  summary: auth
                  value:
                    status: success
                    data:
                      urls:
                      - wss://domain.millicast.com/ws/sub/faux
                      jwt: long_jwt_string
                      iceServers:
                      - urls: stun:stun.example.com:3478
                      - urls: turn:turn.example.com:443?transport=tcp
                        username: user
                        credential: secret
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailResponse'
        default:
          description: Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
      - Token: []
      x-codeSamples:
      - lang: curl
        source: "curl -H \"Authorization: Bearer your_api_secret\" \\\n     -H \"Content-Type: application/json\" \\\n   \
          \  https://director.millicast.com/api/director/subscribe \\\n     -d '{\"streamName\": \"my_insecure_stream\", \"\
          streamAccountId\": \"abc123\"}'"
  /api/drm_proxy/{licenseType}/{assetId}:
    post:
      tags:
      - DrmLicence
      operationId: DrmLicence_GetDrmLicence
      parameters:
      - name: licenseType
        in: path
        required: true
        schema:
          type: string
        x-position: 1
      - name: assetId
        in: path
        required: true
        schema:
          type: string
        x-position: 2
      - name: specConform
        in: query
        required: true
        schema:
          type: boolean
          nullable: true
        x-position: 3
      responses:
        '200':
          description: ''
          content:
            application/octet-stream:
              schema:
                type: string
                format: binary
      security:
      - Token: []
  /api/drm_proxy/fair_play/cert:
    get:
      tags:
      - DrmLicence
      operationId: DrmLicence_GetFairplayCertificate
      responses:
        '200':
          description: ''
          content:
            application/octet-stream:
              schema:
                type: string
                format: binary
      security:
      - Token: []
  /api/multitrackvideo/configuration:
    post:
      tags:
      - MultiTrackVideo
      summary: Configuration
      description: 'Supplies multi track video configuration to OBS. Please refer to OBS for request schema. Supports OBS
        schema versions: [2024-06-04, 2025-01-25].'
      operationId: MultiTrackVideo_Configuration
      requestBody:
        x-name: json
        content:
          application/json:
            schema: {}
        required: true
        x-position: 1
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MultiTrackVideoConfigurationResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailResponse'
        default:
          description: Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
      - Token: []
  /api/whep/{streamAccountId}/{streamName}:
    post:
      tags:
      - Whep
      summary: WHEP
      description: 'WHEP endpoint for subscribers. Request body is SDP Offer. Response body will contain SDP Answer. Location
        header contains remote WHEP endpoint url.


        All errors are returned as plain text. If you send a request with the Accept header you must allow both mime types
        `application/sdp, text/plain`.'
      operationId: Whep_WhepSubscribe
      parameters:
      - name: streamAccountId
        in: path
        required: true
        schema:
          type: string
        x-position: 1
      - name: streamName
        in: path
        required: true
        schema:
          type: string
        x-position: 2
      - name: sourceId
        in: query
        schema:
          type: string
          nullable: true
        x-position: 4
      requestBody:
        x-name: sdpOffer
        content:
          application/sdp:
            schema:
              type: string
            examples:
              ? ''
              : summary: ''
                value: 'v=0\r\no=- ident1234 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=extmap-allow-mixed\r\na=msid-semantic:
                  WMS ident5678\r\n...'
        required: true
        x-position: 3
      responses:
        '201':
          description: Success
          content:
            application/sdp:
              schema:
                type: string
              examples:
                ? ''
                : summary: ''
                  value: 'v=0\r\no=- ident1234 1 IN IP4 127.0.0.1\r\ns=semantic-sdp\r\nc=IN IP4 0.0.0.0\r\nt=0 0\r\na=ice-lite\r\na=msid-semantic:
                    WMS *\r\na=group:BUNDLE 0 1\r\n...'
        '400':
          description: Bad Request
          content:
            text/plain:
              schema:
                type: string
              examples:
                ? ''
                : summary: ''
                  value: 'Validation errors:

                    A non-empty request body is required.'
        '401':
          description: Unauthorized
          content:
            text/plain:
              schema:
                type: string
              examples:
                ? ''
                : summary: ''
                  value: 'Unauthorized: authentication_error_reason'
        '409':
          description: Conflict
          content:
            text/plain:
              schema:
                type: string
              examples:
                ? ''
                : summary: ''
                  value: Stream not found
        '500':
          description: Server Error
          content:
            text/plain:
              schema:
                type: string
      security:
      - Token: []
      x-codeSamples:
      - lang: curl
        source: "curl -H \"Authorization: Bearer your_api_secret\" \\\n     -H \"Content-Type: application/sdp\" \\\n    \
          \ https://director.millicast.com/api/whep/abc123/my_stream \\\n     -d 'v=0\\r\\no=- ident1234 2 IN IP4 127.0.0.1\\\
          r\\ns=-\\r\\nt=0 0\\r\\na=group:BUNDLE 0 1\\r\\na=extmap-allow-mixed\\r\\na=msid-semantic: WMS ident5678\\r\\n...'"
  /api/whip/{streamName}:
    post:
      tags:
      - Whip
      summary: WHIP
      description: 'WHIP endpoint for publishers. Request body is SDP Offer. Response body will contain SDP Answer. Location
        header contains remote WHIP endpoint url.


        All errors are returned as plain text. If you send a request with the Accept header you must allow both mime types
        `application/sdp, text/plain`.'
      operationId: Whip_WhipPublish
      parameters:
      - name: streamName
        in: path
        required: true
        schema:
          type: string
        x-position: 1
      - name: codec
        in: query
        schema:
          type: string
          default: h264
          nullable: true
        x-position: 3
      - name: sourceId
        in: query
        schema:
          type: string
          nullable: true
        x-position: 4
      requestBody:
        x-name: sdpOffer
        content:
          application/sdp:
            schema:
              type: string
            examples:
              ? ''
              : summary: ''
                value: 'v=0\r\no=- ident1234 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=extmap-allow-mixed\r\na=msid-semantic:
                  WMS ident5678\r\n...'
        required: true
        x-position: 2
      responses:
        '201':
          description: Success
          content:
            application/sdp:
              schema:
                type: string
              examples:
                ? ''
                : summary: ''
                  value: 'v=0\r\no=- ident1234 1 IN IP4 127.0.0.1\r\ns=semantic-sdp\r\nc=IN IP4 0.0.0.0\r\nt=0 0\r\na=ice-lite\r\na=msid-semantic:
                    WMS *\r\na=group:BUNDLE 0 1\r\n...'
        '400':
          description: Bad Request
          content:
            text/plain:
              schema:
                type: string
              examples:
                ? ''
                : summary: ''
                  value: 'Validation errors:

                    A non-empty request body is required.'
        '401':
          description: Unauthorized
          content:
            text/plain:
              schema:
                type: string
              examples:
                ? ''
                : summary: ''
                  value: 'Unauthorized: authentication_error_reason'
        '500':
          description: Server Error
          content:
            text/plain:
              schema:
                type: string
      security:
      - Token: []
      x-codeSamples:
      - lang: curl
        source: "curl -H \"Authorization: Bearer your_api_secret\" \\\n     -H \"Content-Type: application/sdp\" \\\n    \
          \ https://director.millicast.com/api/whip/my_stream \\\n     -d 'v=0\\r\\no=- ident1234 2 IN IP4 127.0.0.1\\r\\\
          ns=-\\r\\nt=0 0\\r\\na=group:BUNDLE 0 1\\r\\na=extmap-allow-mixed\\r\\na=msid-semantic: WMS ident5678\\r\\n...'"
components:
  schemas:
    SuccessPublishDirectorResponseModel:
      type: object
      additionalProperties: false
      required:
      - status
      - data
      properties:
        status:
          type: string
          default: success
          minLength: 1
        data:
          $ref: '#/components/schemas/PublishDirectorResponseModel'
    PublishDirectorResponseModel:
      type: object
      additionalProperties: false
      properties:
        wsUrl:
          type: string
          deprecated: true
          x-deprecatedMessage: Use Urls property
        urls:
          type: array
          items:
            type: string
        jwt:
          type: string
        iceServers:
          type: array
          items:
            $ref: '#/components/schemas/IceServerModel'
        streamAccountId:
          type: string
        drmObject:
          nullable: true
          oneOf:
          - $ref: '#/components/schemas/DrmLicenseServers'
        subscribeRequiresAuth:
          type: boolean
    IceServerModel:
      type: object
      additionalProperties: false
      properties:
        urls:
          type: array
          items:
            type: string
        username:
          type: string
          nullable: true
        credential:
          type: string
          nullable: true
    DrmLicenseServers:
      type: object
      additionalProperties: false
      properties:
        widevineUrl:
          type: string
          nullable: true
        fairPlayUrl:
          type: string
          nullable: true
        fairPlayCertUrl:
          type: string
          nullable: true
    FailResponse:
      type: object
      additionalProperties: false
      required:
      - status
      - data
      properties:
        status:
          type: string
          default: fail
          minLength: 1
        data: {}
    ErrorResponse:
      type: object
      additionalProperties: false
      required:
      - status
      - message
      properties:
        status:
          type: string
          default: error
          minLength: 1
        message:
          type: string
          minLength: 1
        code:
          type: integer
          format: int32
          nullable: true
        data:
          nullable: true
    PublishStreamModel:
      type: object
      additionalProperties: false
      required:
      - streamName
      properties:
        streamName:
          type: string
          minLength: 1
        streamAccountId:
          type: string
          nullable: true
    SuccessSubscribeDirectorResponseModel:
      type: object
      additionalProperties: false
      required:
      - status
      - data
      properties:
        status:
          type: string
          default: success
          minLength: 1
        data:
          $ref: '#/components/schemas/DirectorResponseModel'
    DirectorResponseModel:
      type: object
      additionalProperties: false
      properties:
        wsUrl:
          type: string
          deprecated: true
          x-deprecatedMessage: Use Urls property
        urls:
          type: array
          items:
            type: string
        jwt:
          type: string
        iceServers:
          type: array
          items:
            $ref: '#/components/schemas/IceServerModel'
        streamAccountId:
          type: string
        drmObject:
          nullable: true
          oneOf:
          - $ref: '#/components/schemas/DrmLicenseServers'
    SubscribeStreamModel:
      type: object
      additionalProperties: false
      required:
      - streamName
      properties:
        streamName:
          type: string
          minLength: 1
        streamAccountId:
          type: string
          description: Required **only** for published streams which have `subscribeRequiresAuth=false`.
          nullable: true
    MultiTrackVideoConfigurationResponse:
      type: object
      additionalProperties: false
      properties:
        meta:
          nullable: true
          oneOf:
          - $ref: '#/components/schemas/Meta'
        ingest_endpoints:
          type: array
          nullable: true
          items:
            $ref: '#/components/schemas/IngestEndpoint'
        encoder_configurations:
          type: array
          nullable: true
          items:
            $ref: '#/components/schemas/EncoderConfiguration'
        audio_configurations:
          nullable: true
          oneOf:
          - $ref: '#/components/schemas/AudioConfigurations'
    Meta:
      type: object
      additionalProperties: false
      properties:
        schema_version:
          type: string
          nullable: true
        service:
          type: string
          nullable: true
        config_id:
          type: string
          nullable: true
    IngestEndpoint:
      type: object
      additionalProperties: false
      properties:
        protocol:
          type: string
          nullable: true
        url_template:
          type: string
          nullable: true
        authentication:
          type: string
          nullable: true
    EncoderConfiguration:
      type: object
      additionalProperties: false
      properties:
        type:
          type: string
          nullable: true
        bitrate_interpolation_points:
          type: array
          nullable: true
          items:
            type: integer
            format: int32
        canvas_index:
          type: integer
          format: int32
        framerate:
          nullable: true
          oneOf:
          - $ref: '#/components/schemas/Framerate'
        gpu_scale_type:
          type: string
          nullable: true
        width:
          type: integer
          format: int32
        height:
          type: integer
          format: int32
        settings:
          nullable: true
          oneOf:
          - $ref: '#/components/schemas/EncoderConfigurationSettings'
    Framerate:
      type: object
      additionalProperties: false
      properties:
        numerator:
          type: integer
          format: int32
        denominator:
          type: integer
          format: int32
    EncoderConfigurationSettings:
      type: object
      additionalProperties: false
      properties:
        bitrate:
          type: integer
          format: int32
        bf:
          type: integer
          format: int32
        bframes:
          type: integer
          format: int32
        keyint:
          type: integer
          format: int32
          nullable: true
        keyint_sec:
          type: integer
          format: int32
        lookahead:
          type: boolean
        preset2:
          type: string
          nullable: true
        profile:
          type: string
          nullable: true
        psycho_aq:
          type: boolean
        rate_control:
          type: string
          nullable: true
        tune:
          type: string
          nullable: true
        latency:
          type: string
          nullable: true
        target_usage:
          type: string
          nullable: true
    AudioConfigurations:
      type: object
      additionalProperties: false
      properties:
        live:
          type: array
          nullable: true
          items:
            $ref: '#/components/schemas/AudioConfiguration'
        vod:
          type: array
          nullable: true
          items:
            $ref: '#/components/schemas/AudioConfiguration'
    AudioConfiguration:
      type: object
      additionalProperties: false
      properties:
        codec:
          type: string
          nullable: true
        track_id:
          type: integer
          format: int32
        channels:
          type: integer
          format: int32
        settings:
          nullable: true
          oneOf:
          - $ref: '#/components/schemas/AudioConfigurationSettings'
    AudioConfigurationSettings:
      type: object
      additionalProperties: false
      properties:
        bitrate:
          type: integer
          format: int32
    SdpOffer:
      type: object
      additionalProperties: false
      properties:
        sdp:
          type: string
  securitySchemes:
    Token:
      type: http
      description: '### Usage

        #### Acquire token from dashboard or api.

        Token will be specific to publishing or subscribing.'
      scheme: bearer
security:
- Token: []
x-code-samples-replace: {}