Summary
The Blackmagic Design HyperDeck family of disk recorders and playback decks can be controlled over Ethernet via a line-oriented text protocol on TCP port 9993. The protocol supports transport control (play, record, stop, jog, shuttle), clip and timeline management, slot selection, configuration, asynchronous event notifications, and digital slate metadata. This spec covers all models in the HyperDeck range.
Transport
protocols:
- tcp
addressing:
port: 9993
auth:
type: password # UNRESOLVED: source describes authenticate command with username/password
# and error codes 121 (authentication failed) and 122 (authentication required),
# but does not state whether auth is required by default or only on certain configurations
Traits
traits:
- powerable # inferred: reboot command present
- queryable # inferred: extensive query commands (transport info, slot info, device info, configuration, clip info)
- routable # inferred: slot select, video format selection, input routing commands
- levelable # inferred: play speed -5000 to 5000, shuttle speed control
Actions
actions:
- id: play
label: Play
kind: action
params:
- name: speed
type: integer
description: "Play speed percentage (-5000 to 5000)"
- name: loop
type: boolean
description: "Loop playback"
- name: single_clip
type: boolean
description: "Play single clip instead of all clips"
- name: clip_id
type: integer
description: "Play from specified clip ID"
- name: timecode
type: string
description: "Play from timecode position (HH:MM:SS:FF)"
- id: stop
label: Stop
kind: action
params: []
- id: record
label: Record
kind: action
params:
- name: name
type: string
description: "Name for the recorded clip"
- id: record_spill
label: Record Spill
kind: action
params:
- name: slot_id
type: integer
description: "Spill recording to specified slot ID"
- id: goto
label: Go To
kind: action
params:
- name: clip_id
type: string
description: "Clip ID (integer, +/-offset, or start/end)"
- name: clip
type: string
description: "Frame position within clip (integer, +/-offset, or start/end)"
- name: timeline
type: string
description: "Timeline position (integer, +/-offset, or start/end)"
- name: timecode
type: string
description: "Timecode position (HH:MM:SS:FF, +/-duration)"
- name: slot_id
type: integer
description: "Switch to specified slot ID"
- id: jog
label: Jog
kind: action
params:
- name: timecode
type: string
description: "Jog to timecode (HH:MM:SS:FF, +/-duration)"
- id: shuttle
label: Shuttle
kind: action
params:
- name: speed
type: integer
description: "Shuttle speed (-5000 to 5000)"
- id: slot_select
label: Select Slot
kind: action
params:
- name: slot_id
type: integer
description: "Slot ID to select"
- name: device
type: string
description: "Disk device name to select"
- name: video_format
type: string
description: "Video format for clip filtering"
- id: slot_unblock
label: Unblock Slot
kind: action
params:
- name: slot_id
type: integer
description: "Slot ID to unblock"
- name: device
type: string
description: "Disk device name to unblock"
- id: external_drive_select
label: Select External Drive
kind: action
params:
- name: device
type: string
description: "External drive device name"
- id: preview
label: Preview Mode
kind: action
params:
- name: enable
type: boolean
description: "Enable or disable preview mode"
- id: remote_enable
label: Remote Control Enable
kind: action
params:
- name: enable
type: boolean
description: "Enable or disable remote control"
- id: remote_override
label: Remote Override
kind: action
params:
- name: enable
type: boolean
description: "Override remote control state for current session"
- id: playrange_set
label: Set Play Range
kind: action
params:
- name: clip_id
type: integer
description: "Starting clip ID"
- name: count
type: integer
description: "Number of clips to include"
- name: in
type: string
description: "In timecode (HH:MM:SS:FF)"
- name: out
type: string
description: "Out timecode (HH:MM:SS:FF)"
- name: timeline_in
type: integer
description: "Timeline frame in position"
- name: timeline_out
type: integer
description: "Timeline frame out position"
- id: playrange_clear
label: Clear Play Range
kind: action
params: []
- id: play_on_startup
label: Play on Startup
kind: action
params:
- name: enable
type: boolean
description: "Enable or disable play on startup"
- name: single_clip
type: boolean
description: "Play single clip or all clips on startup"
- id: play_option
label: Play Option
kind: action
params:
- name: stop_mode
type: string
description: "Output frame when stopped (lastframe, nextframe, black)"
- id: configuration
label: Configure
kind: action
params:
- name: video_input
type: string
description: "Video input (SDI, 4xSDI, HDMI, component, composite)"
- name: audio_input
type: string
description: "Audio input (embedded, XLR, RCA)"
- name: file_format
type: string
description: "Recording file format"
- name: audio_codec
type: string
description: "Audio codec (PCM, AAC)"
- name: timecode_input
type: string
description: "Timecode source (external, embedded, internal, preset, clip)"
- name: timecode_output
type: string
description: "Timecode output (clip, timeline)"
- name: timecode_preference
type: string
description: "Timecode type (default, dropframe, nondropframe)"
- name: timecode_preset
type: string
description: "Preset timecode value (HH:MM:SS:FF)"
- name: audio_input_channels
type: integer
description: "Number of audio input channels"
- name: record_trigger
type: string
description: "Record trigger mode (none, recordbit, timecoderun)"
- name: record_prefix
type: string
description: "File name prefix for recordings"
- name: record_cache
type: boolean
description: "Enable or disable record cache"
- name: append_timestamp
type: boolean
description: "Append timestamp to file names"
- name: usb_spill
type: boolean
description: "Enable/disable spilling between USB disks"
- name: reference_source
type: string
description: "Reference signal source (auto, input, external)"
- name: genlock_input_resync
type: boolean
description: "Enable/disable genlock input resync"
- name: default_standard
type: string
description: "Default playback video format"
- name: xlr_mapping
type: string
description: "Map XLR inputs to channels starting from channel N, or none"
- name: rca_mapping
type: string
description: "Map RCA inputs to channels starting from channel N, or none"
- id: clips_add
label: Add Clip to Timeline
kind: action
params:
- name: in
type: string
description: "In timecode"
- name: out
type: string
description: "Out timecode"
- name: frame_in
type: integer
description: "In frame number"
- name: frame_out
type: integer
description: "Out frame number"
- name: name
type: string
description: "Clip name"
- id: clips_remove
label: Remove Clip from Timeline
kind: action
params:
- name: clip_id
type: integer
description: "Clip ID to remove"
- id: clips_clear
label: Clear Timeline
kind: action
params: []
- id: clips_rebuild
label: Rebuild Timeline
kind: action
params: []
- id: notify
label: Set Notifications
kind: action
params:
- name: transport
type: boolean
- name: slot
type: boolean
- name: remote
type: boolean
- name: configuration
type: boolean
- name: dropped_frames
type: boolean
- name: display_timecode
type: boolean
- name: timeline_position
type: boolean
- name: playrange
type: boolean
- name: cache
type: boolean
- name: dynamic_range
type: boolean
- name: slate
type: boolean
- name: clips
type: boolean
- name: disk
type: boolean
- name: device_info
type: boolean
- name: nas
type: boolean
- id: format_prepare
label: Prepare Format
kind: action
params:
- name: slot_id
type: integer
description: "Slot ID (omit for current)"
- name: device
type: string
description: "Disk device name"
- name: prepare
type: string
description: "Filesystem type (exFAT, HFS+)"
- name: name
type: string
description: "Volume name (supports UTF-8)"
- id: format_confirm
label: Confirm Format
kind: action
params:
- name: token
type: string
description: "Token from format prepare response"
- id: identify
label: Identify Device
kind: action
params:
- name: enable
type: boolean
- id: watchdog
label: Set Watchdog
kind: action
params:
- name: period
type: integer
description: "Timeout period in seconds (0 to disable)"
- id: reboot
label: Reboot
kind: action
params: []
- id: authenticate
label: Authenticate
kind: action
params:
- name: username
type: string
description: "Case-sensitive username"
- name: password
type: string
description: "Case-sensitive password"
- id: dynamic_range
label: Set Dynamic Range
kind: action
params:
- name: playback_override
type: string
description: "off, Rec709, Rec2020_SDR, HLG, ST2084_300, ST2084_500, ST2084_800, ST2084_1000, ST2084_2000, ST2084_4000, ST2084"
- name: record_override
type: string
description: "off, Rec709, Rec2020_SDR, HLG, ST2084_300, ST2084_500, ST2084_800, ST2084_1000, ST2084_2000, ST2084_4000, ST2084"
- id: slate_clips
label: Set Slate Clips
kind: action
params:
- name: reel
type: integer
description: "Reel number (1-999)"
- name: scene_id
type: string
description: "Scene ID"
- name: shot_type
type: string
description: "WS, MS, CU, BCU, MCU, ECU, none"
- name: take
type: integer
description: "Take number (1-99)"
- name: take_scenario
type: string
description: "PU, VFX, SER, none"
- name: take_auto_inc
type: boolean
- name: good_take
type: boolean
- name: environment
type: string
description: "interior, exterior"
- name: day_night
type: string
description: "day, night"
- id: slate_project
label: Set Slate Project
kind: action
params:
- name: project_name
type: string
- name: camera
type: string
description: "Camera index e.g. A"
- name: director
type: string
- name: camera_operator
type: string
- id: slate_lens
label: Set Slate Lens
kind: action
params:
- name: lens_type
type: string
- name: iris
type: string
- name: focal_length
type: string
- name: distance
type: string
- name: filter
type: string
- id: nas_add
label: Add NAS Bookmark
kind: action
params:
- name: url
type: string
description: "NAS share URL e.g. smb://server.local/path"
- name: username
type: string
description: "Username (optional, defaults to guest)"
- name: password
type: string
description: "Password (optional)"
- id: nas_remove
label: Remove NAS Bookmark
kind: action
params:
- name: url
type: string
description: "NAS share URL"
- id: nas_select
label: Mount NAS Share
kind: action
params:
- name: url
type: string
description: "NAS share URL"
- id: nas_deselect
label: Unmount NAS Share
kind: action
params: []
- id: quit
label: Disconnect
kind: action
params: []
- id: ping
label: Ping
kind: action
params: []
Feedbacks
feedbacks:
- id: transport_info
type: composite
description: "Current transport state"
fields:
- name: status
type: enum
values: [preview, stopped, play, forward, rewind, jog, shuttle, record]
- name: speed
type: integer
description: "Play speed (-5000 to 5000 %)"
- name: slot_id
type: string
description: "Active slot ID or 'none'"
- name: clip_id
type: string
description: "Active clip ID or 'none'"
- name: single_clip
type: boolean
- name: display_timecode
type: string
description: "Timecode shown on front panel (HH:MM:SS:FF)"
- name: timecode
type: string
description: "Current timeline/clip timecode (HH:MM:SS:FF)"
- name: video_format
type: string
- name: loop
type: boolean
- name: timeline
type: integer
- name: input_video_format
type: string
- name: dynamic_range
type: string
- name: reference_locked
type: boolean
- id: device_info
type: composite
description: "Device identification"
fields:
- name: protocol_version
type: string
- name: model
type: string
- name: unique_id
type: string
- name: slot_count
type: integer
- name: software_version
type: string
- name: name
type: string
- id: slot_info
type: composite
description: "Slot status"
fields:
- name: slot_id
type: integer
- name: slot_name
type: string
- name: device_name
type: string
- name: status
type: enum
values: [empty, mounting, error, mounted]
- name: volume_name
type: string
- name: recording_time
type: integer
description: "Available recording time in seconds"
- name: video_format
type: string
- name: blocked
type: boolean
- name: remaining_size
type: integer
description: "Remaining size in bytes"
- name: total_size
type: integer
description: "Total size in bytes"
- id: disk_list
type: composite
description: "List of playable clips on disk"
fields:
- name: slot_id
type: integer
- name: clips
type: array
description: "List of {index, name, file_format, video_format, duration_timecode}"
- id: clips_count
type: composite
description: "Number of clips on timeline"
fields:
- name: clip_count
type: integer
- id: clips_get
type: composite
description: "Timeline clip info"
fields:
- name: clip_count
type: integer
- name: clips
type: array
description: "List of {clip_id, name, start_timecode, duration_timecode}"
- id: clip_info
type: composite
description: "Individual clip info"
fields:
- name: clip_id
type: integer
- name: name
type: string
- name: start_timecode
type: string
- name: duration_timecode
type: string
- id: configuration
type: composite
description: "Current device configuration"
fields:
- name: audio_input
type: enum
values: [embedded, XLR, RCA]
- name: video_input
type: enum
values: [SDI, 4xSDI, HDMI, component, composite]
- name: file_format
type: string
- name: audio_codec
type: enum
values: [PCM, AAC]
- name: timecode_input
type: enum
values: [external, embedded, preset, clip]
- name: timecode_output
type: enum
values: [clip, timeline]
- name: timecode_preference
type: enum
values: [default, dropframe, nondropframe]
- name: timecode_preset
type: string
- name: audio_input_channels
type: integer
- name: record_trigger
type: enum
values: [none, recordbit, timecoderun]
- name: record_prefix
type: string
- name: record_cache
type: boolean
- name: append_timestamp
type: boolean
- name: reference_source
type: enum
values: [auto, input, external]
- name: genlock_input_resync
type: boolean
- name: usb_spill
type: boolean
- name: default_standard
type: string
- name: xlr_mapping
type: string
- name: rca_mapping
type: string
- id: remote_info
type: composite
description: "Remote control state"
fields:
- name: enabled
type: boolean
- name: override
type: boolean
- id: notify_status
type: composite
description: "Current notification subscription state"
fields:
- name: transport
type: boolean
- name: slot
type: boolean
- name: remote
type: boolean
- name: configuration
type: boolean
- name: dropped_frames
type: boolean
- name: display_timecode
type: boolean
- name: timeline_position
type: boolean
- name: playrange
type: boolean
- name: cache
type: boolean
- name: dynamic_range
type: boolean
- name: slate
type: boolean
- name: clips
type: boolean
- name: disk
type: boolean
- name: device_info
type: boolean
- name: nas
type: boolean
- id: playrange
type: composite
description: "Current play range setting"
- id: play_on_startup
type: composite
description: "Play on startup state"
fields:
- name: enabled
type: boolean
- name: single_clip
type: boolean
- id: play_option
type: composite
description: "Play stop mode setting"
fields:
- name: stop_mode
type: enum
values: [lastframe, nextframe, black]
- id: commands
type: string
description: "Supported commands in XML format"
- id: external_drive_list
type: array
description: "Available USB/network drives"
- id: external_drive_selected
type: string
description: "Currently selected external drive"
- id: cache_info
type: composite
description: "Cache status"
- id: dynamic_range
type: composite
description: "Dynamic range settings"
- id: uptime
type: string
description: "Time since last boot"
- id: spill_order
type: composite
description: "Record spill device order"
- id: nas_list
type: array
description: "NAS share bookmarks"
- id: nas_discovered
type: array
description: "NAS servers discovered via mDNS"
- id: nas_selected
type: composite
description: "Currently selected NAS share"
- id: help
type: string
description: "Human-readable help text for all commands"
Variables
variables: [] # No persistent settable variables beyond configuration actions
Events
events:
- id: connection_info
code: 500
description: "Sent on connection with protocol version and model name"
fields:
- name: protocol_version
type: string
- name: model
type: string
- id: transport_info_async
code: 508
description: "Asynchronous transport state change notification"
fields:
- name: status
type: enum
values: [preview, stopped, play, forward, rewind, jog, shuttle, record]
- name: speed
type: integer
- name: slot_id
type: string
- name: clip_id
type: string
- name: single_clip
type: boolean
- name: display_timecode
type: string
- name: timecode
type: string
- name: video_format
type: string
- name: loop
type: boolean
- name: timeline
type: integer
- id: slot_info_async
code: 502
description: "Asynchronous slot state change notification"
fields:
- name: slot_id
type: integer
- name: status
type: enum
values: [empty, mounting, error, mounted]
- name: volume_name
type: string
- name: recording_time
type: integer
- name: video_format
type: string
- name: blocked
type: boolean
- id: remote_info_async
code: 510
description: "Asynchronous remote control state change notification"
fields:
- name: enabled
type: boolean
- name: override
type: boolean
- id: configuration_async
code: 511
description: "Asynchronous configuration change notification"
- id: connection_rejected
code: 120
description: "Connection rejected due to too many concurrent clients"
Macros
macros: [] # No multi-step sequences explicitly defined in source
Safety
confirmation_required_for:
- format_confirm # requires token from format_prepare
interlocks:
- playback stops when switching to preview mode
- switching to playback not permitted during record; must stop first
- remote: enable must be true or override must be true for ethernet control to work
- file format changes may cause deck reboot (response 213), closing client connection
# UNRESOLVED: power-on sequencing requirements not stated in source
Notes
The HyperDeck protocol is line-oriented text over TCP. Commands use a {command}: {param}: {value} syntax with optional multiline form. Client messages may use LF or CR LF line terminators; server responses use CR LF. Error codes range from 100-199 (failures), successful responses 200-299, and asynchronous notifications 500-599. The notify command enables/disables async event subscriptions (all disabled by default). Video format and file format support varies by model. Clip IDs are invalidated when clips are removed from the timeline. The remote: override setting is session-scoped and resets when the connection closes.
Provenance
source_domains:
- documents.blackmagicdesign.com
source_urls:
- https://documents.blackmagicdesign.com/DeveloperManuals/HyperDeckEthernetProtocol.pdf
retrieved_at: 2026-04-30T04:40:45.767Z
last_checked_at: 2026-06-02T21:54:37.032Z
Verification Summary
verdict: verified
checked_at: 2026-06-02T21:54:37.032Z
matched_actions: 39
action_count: 39
confidence: medium
summary: "All 39 spec actions traced to source HyperDeck protocol documentation. Commands match source syntax and parameter structure. (9 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "specific firmware version compatibility not stated in source"
- "exact model feature differences beyond video format support not fully documented"
- "source describes authenticate command with username/password"
- "power-on sequencing requirements not stated in source"
- "exact model-to-feature mapping not fully documented (which models support NAS, slate, etc.)"
- "maximum concurrent client connections not stated (only that it is limited)"
- "whether authentication is required by default or only on certain configurations"
- "watchdog default period not stated"
- "protocol version number not stated"
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0