Summary

Sennheiser SSCv2 (Sound Control Protocol v2) is a REST API over HTTPS (HTTP/1.1, TLS 1.2) with JSON serialization, used by ceiling microphone arrays (TCC M), bar speakers, and wireless receiver systems. The address tree is under /api. Authentication supports password via HTTP Basic Auth or token-based auth; credential details beyond these methods are not specified. Server-sent events (SSE) support real-time subscription-based state notifications.

Transport

protocols:
  - https
addressing:
  base_url: https://{host}
  base_path: /api
  port: 443
http_version: "1.1"
auth:
  type: basic
  alternative_types:
    - token
  credentials:
    username: UNRESOLVED  # username not stated in source
    password: UNRESOLVED  # password value and provisioning method not stated in source
transport_security:
  tls_version: "1.2"
  unencrypted_http_allowed: false
connection_model:
  persistent: recommended
  session_scope: https_connection  # sessions tied to HTTPS connection duration

Traits

- queryable       # GET requests read property values
- routable        # audio input routing present (beam direction, gain per channel)
- levelable       # gain, mute controls present
- eventable       # SSE subscriptions for real-time notifications

Actions

# --- Device management ---

- id: device_restart
  label: Device Restart
  kind: action
  params: []
  method: POST
  path: /api/device/restart

- id: factory_restore
  label: Factory Restore
  kind: action
  params:
    - name: body
      type: object
      required: true
      description: JSON request body, e.g. {"type": "Factory Defaults"}
  method: POST
  path: /api/device/restore
  response:
    status: 200
    body:
      type: Factory Defaults

- id: device_time_set
  label: Set Device Time
  kind: action
  description: Optional endpoint; read-only if device uses NTP/PTP
  params:
    - name: body
      type: object
      description: Time payload (schema not specified in source)
  method: PUT
  path: /api/device/time

# --- Subscription management (SSE) ---

- id: subscription_start
  label: Start SSE Subscription
  kind: action
  description: Opens SSE stream; server replies with text/event-stream and Content-Location header
  params: []
  method: GET
  path: /api/ssc/state/subscriptions
  response:
    content_type: text/event-stream
    content_location: /api/ssc/state/subscriptions/{sessionUUID}

- id: subscription_replace
  label: Replace Subscription List
  kind: action
  description: Replace full subscription list
  params:
    - name: sessionUUID
      type: string
      required: true
      description: Session identifier from SSE open event
    - name: body
      type: array
      required: true
      description: JSON array of resource paths, e.g. ["/api/device/site", "/api/device/identity"]
  method: PUT
  path: /api/ssc/state/subscriptions/{sessionUUID}

- id: subscription_add
  label: Add Subscription Resources
  kind: action
  description: Add resources to subscription; empty list = no action, replies 200
  params:
    - name: sessionUUID
      type: string
      required: true
    - name: body
      type: array
      required: true
      description: JSON array of resource paths to add
  method: PUT
  path: /api/ssc/state/subscriptions/{sessionUUID}/add

- id: subscription_remove
  label: Remove Subscription Resources
  kind: action
  description: Remove resources from subscription; empty list = no action, replies 200. 404 = resource not in subscribed list.
  params:
    - name: sessionUUID
      type: string
      required: true
    - name: body
      type: array
      required: true
      description: JSON array of resource paths to remove
  method: PUT
  path: /api/ssc/state/subscriptions/{sessionUUID}/remove

- id: subscription_end
  label: End Subscription
  kind: action
  description: Closes subscription; server sends close-event before closing
  params:
    - name: sessionUUID
      type: string
      required: true
  method: DELETE
  path: /api/ssc/state/subscriptions/{sessionUUID}

# --- Dynamic DSP module resources ---

- id: create_dynamic_resource
  label: Create Dynamic Resource
  kind: action
  params:
    - name: module
      type: string
      required: true
      description: Module collection, e.g. agc
    - name: body
      type: object
      required: true
      description: Field values for the new instance, e.g. {"value1": "x", "value2": "y"}
  method: POST
  path: /api/device/dsp/modules/{module}
  response:
    status: 201
    headers:
      Location: /api/device/dsp/modules/{module}/{instanceId}

- id: delete_dynamic_resource
  label: Delete Dynamic Resource
  kind: action
  params:
    - name: module
      type: string
      required: true
      description: Module type, e.g. agc
    - name: instanceId
      type: string
      required: true
  method: DELETE
  path: /api/device/dsp/modules/{module}/{instanceId}

- id: update_dynamic_resource
  label: Update Dynamic Resource
  kind: action
  description: Update an existing module instance; the subresource supports GET, PUT, and DELETE
  params:
    - name: module
      type: string
      required: true
      description: Module type, e.g. agc
    - name: instanceId
      type: string
      required: true
    - name: body
      type: object
      required: true
      description: Field values to update, e.g. {"value1": "x", "value2": "y"}
  method: PUT
  path: /api/device/dsp/modules/{module}/{instanceId}

- id: ssc_version_read
  label: Read SSCv2 Version
  kind: action
  params: []
  method: GET
  path: /api/ssc/version

- id: subscription_list_read
  label: Read Subscription List
  kind: action
  params:
    - name: sessionUUID
      type: string
      required: true
  method: GET
  path: /api/ssc/state/subscriptions/{sessionUUID}

- id: device_identity_read
  label: Read Device Identity
  kind: action
  params: []
  method: GET
  path: /api/device/identity

- id: device_site_read
  label: Read Device Site
  kind: action
  params: []
  method: GET
  path: /api/device/site

- id: device_site_update
  label: Update Device Site
  kind: action
  params:
    - name: body
      type: object
      required: true
      description: {"deviceName": "MyDevice", "location": "Chemistry Building 5, Room 15", "position": "Left side near the big pillar"}
  method: PUT
  path: /api/device/site

- id: device_time_read
  label: Read Device Time
  kind: action
  params: []
  method: GET
  path: /api/device/time

- id: dynamic_resource_list
  label: List Dynamic Resources
  kind: action
  params: []
  method: GET
  path: /api/device/dsp/modules/agc

- id: dynamic_module_instance_read
  label: Read Dynamic Module Instance
  kind: action
  params:
    - name: instanceId
      type: string
      required: true
  method: GET
  path: /api/device/dsp/modules/agc/{instanceId}

- id: preset_bank_read
  label: Read Preset Bank
  kind: action
  params: []
  method: GET
  path: /api/presets/bank1

- id: preset_bank_update
  label: Update Preset Bank
  kind: action
  params:
    - name: body
      type: object
      required: true
      description: {"carriers": [470000, 470400, 470800, 471250, 471600]}
  method: PUT
  path: /api/presets/bank1

Feedbacks

# All SSCv2 resources are readable via GET; no separate query endpoint.
# Use Variables for persistent state, Events for subscriptions.

Variables

# Device Identity
- id: device_identity
  label: Device Identity
  type: object
  read_only: true
  fields:
    - product: string
    - serial: string
    - vendor: string  # "Sennheiser electronic GmbH & Co. KG"
    - hardwareRevision: string
  method: GET
  path: /api/device/identity

# Device Site (read/write)
- id: device_site
  label: Device Site
  type: object
  read_only: false
  fields:
    - name: string  # max 60 chars (entity name "deviceName")
    - location: string  # max 240 chars
    - position: string  # max 240 chars
  method: GET|PUT
  path: /api/device/site

# Protocol Version
- id: ssc_version
  label: SSCv2 Version
  type: object
  read_only: true
  fields:
    - protocol: string  # e.g. "2.0"
    - schema: string  # e.g. "1.5"
  method: GET
  path: /api/ssc/version

# Device Time (read/write; read-only if device uses NTP/PTP)
- id: device_time
  label: Device Time
  type: object
  read_only: false
  description: Optional endpoint. Read-only if device synchronizes via NTP/PTP.
  fields: []  # UNRESOLVED: time payload schema not specified in source
  method: GET|PUT
  path: /api/device/time

# Audio Gain (example per-channel property)
- id: channel_gain
  label: Channel Gain
  type: object
  fields:
    - gain: number  # dB value
    - mute: boolean
  method: GET|PUT
  path: /api/out1/xlr2

# Preset Bank (array example from source)
- id: presets_bank
  label: Preset Bank
  type: object
  fields:
    - carriers: array  # of integers, e.g. [470000, 470400, 470800, 471200, 471600]
  method: GET|PUT
  path: /api/presets/bank1

# Dynamic Module Instance (single instance read)
- id: dynamic_module_instance
  label: Dynamic Module Instance
  type: object
  read_only: false
  description: Read a single DSP module instance (subresource also supports PUT/DELETE)
  fields:
    - instanceId: string
    - value1: string
    - value2: string
  method: GET|PUT|DELETE
  path: /api/device/dsp/modules/{module}/{instanceId}

# Subscription State (read)
- id: subscriptions
  label: Active Subscriptions
  type: array
  read_only: true
  method: GET
  path: /api/ssc/state/subscriptions/{sessionUUID}

# UNRESOLVED: full endpoint list not included; source references OpenAPI schema at /api/openapi.json

Events

# SSE-based subscriptions. Device sends notifications on state changes.
# Event types: open, message, close

- id: subscription_open
  label: Subscription Opened
  type: event
  fields:
    - path: string  # /api/ssc/state/subscriptions/{sessionUUID}
    - sessionUUID: string

- id: resource_update
  label: Resource Updated
  type: event
  description: Sent when subscribed resource changes; body contains {path: {field: value}}
  fields:
    - path: string
    - values: object

- id: resource_created
  label: Resource Created
  type: event
  description: On dynamic resource creation, server sends empty object {} then immediate update with current values
  fields:
    - path: string
    - values: object  # empty {} initially

- id: resource_deleted
  label: Resource Deleted
  type: event
  description: Sent when subscribed resource is deleted; value is null
  fields:
    - path: string
    - value: null

- id: subscription_close
  label: Subscription Closed
  type: event
  fields:
    - path: string
    - sessionUUID: string

Macros

# UNRESOLVED: no explicit multi-step sequences described in source

Safety

confirmation_required_for: []
interlocks: []
# UNRESOLVED: source does not specify confirmation requirements, safety warnings, interlock procedures, or power sequencing

Notes

SSCv2 is a REST API over HTTPS using HTTP/1.1. Request and response bodies use JSON; subscription list request bodies are JSON arrays. Content-Type is application/json for request/response bodies. Each HTTP request carries one SSCv2 message. Commands exceeding 5s execution time trigger HTTP 102 (Processing) immediately; final response is sent when complete.

Subscriptions use Server-Sent Events (SSE) with format event: <eventtype>\ndata: <updatejson>\n\n. Once a subscription is established, the SSE connection is dedicated — no further regular HTTP requests on that connection.

Dynamic resources (DSP modules) may be supported by the server. Control resources support GET (list) and POST (create); instance subresources support GET, PUT, and DELETE. On creation, the server sends an SSE notification with empty object {}, then an immediate update with current values. A deletion notification uses null. The server sends 404 if a resource is not in the subscribed list on a remove attempt.

Invalid partial parameters in a multi-parameter PUT result in no applied changes (transactional).

Array resources are read and written identically to elementary values. Array ranges from earlier spec versions should not be used.

HTTP status code mappings: 400 (bad request / broken JSON / invalid enum / entity limit), 401 (no credentials sent), 403 (authenticated but not authorized), 404 (resource not found), 405 (method not allowed), 409 (state conflict), 422 (semantic error), 102 (long-running command in progress).

Authentication is checked before authorization. Authentication supports password via HTTP Basic Auth or token-based auth; the source does not specify a username, token scheme details, or password provisioning method.

SSCv2 protocol version history: 0.1 (2022-08-02 Draft) → 0.8 (2022-09-09 Draft) → 2.0 (2022-10-10) → 2.1 (2022-12-02) → 2.2 (2023-03-01) → 2.3 (2023-10-27).

Provenance

source_domains:
  - sennheiser-sites.com
source_urls:
  - https://www.sennheiser-sites.com/responsive-manuals/en/api-docs/index.html
retrieved_at: 2026-07-16T08:31:35.583Z
last_checked_at: 2026-10-07T12:36:48.994Z

Verification Summary

verdict: verified
checked_at: 2026-10-07T12:36:48.994Z
matched_actions: 21
action_count: 21
confidence: medium
summary: "All 21 spec actions match source endpoints and verbs one-to-one, transport values are supported, and the spec covers the source's full command catalogue. (9 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "maximum simultaneous sessions not stated in source"
- "time payload schema not specified in source"
- "full endpoint list not included; source references OpenAPI schema at /api/openapi.json"
- "no explicit multi-step sequences described in source"
- "source does not specify confirmation requirements, safety warnings, interlock procedures, or power sequencing"
- "complete endpoint inventory not included; only key endpoints shown from spec overview"
- "DSP module types and parameter ranges not enumerated in source excerpt"
- "maximum command execution time beyond 5s not stated"
- "device/time payload schema not specified"

From the AI4AV catalog (https://ai4av.net) · ODbL-1.0