This document describes the StageLinQ network protocol used by Denon DJ devices for communication between players, mixers, and software applications.
Based on reverse engineering work from:
- chrisle/StageLinq (TypeScript)
- icedream/go-stagelinq (Go)
- Jaxc/PyStageLinQ (Python)
StageLinQ is a proprietary protocol developed by Denon DJ (inMusic) for networking their DJ equipment. It enables:
- Device discovery on local networks
- Real-time state synchronization
- File transfers (databases, audio files)
- Beat and timing information sharing
- Library browsing (via EAAS)
┌─────────────────────────────────────────────────────────────────┐
│ StageLinQ Network │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ UDP 51337 ┌─────────────┐ │
│ │ SC6000 │◄──────────────────►│ SC6000 │ │
│ │ (Player) │ │ (Player) │ │
│ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │
│ │ TCP (Dynamic Ports) │ │
│ │ │ │
│ ┌──────▼──────┐ ┌──────▼──────┐ │
│ │ X1850 │ │ Software │ │
│ │ (Mixer) │ │ (Now Playing│ │
│ └─────────────┘ │ SoundSwitch│ │
│ │ Resolume) │ │
│ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
| Port | Protocol | Purpose |
|---|---|---|
| 51337 | UDP | Discovery announcements |
| Dynamic | TCP | Service connections (StateMap, FileTransfer, etc.) |
| 11224 | UDP | EAAS discovery |
| 50010 | TCP | EAAS gRPC |
| 50020 | TCP | EAAS HTTP |
All multi-byte values are big-endian (network byte order).
| Type | Size | Description |
|---|---|---|
| UInt8 | 1 | Unsigned 8-bit integer |
| UInt16 | 2 | Unsigned 16-bit integer, big-endian |
| UInt32 | 4 | Unsigned 32-bit integer, big-endian |
| UInt64 | 8 | Unsigned 64-bit integer, big-endian |
| Int32 | 4 | Signed 32-bit integer, big-endian |
| Float64 | 8 | IEEE 754 double, big-endian |
| Token | 16 | Device identifier (UUID bytes) |
| NetworkStringUTF16 | 4+n | Length-prefixed UTF-16BE string |
┌────────────────┬─────────────────────────────────┐
│ Length (UInt32)│ UTF-16BE Characters │
│ (byte count) │ (length / 2 characters) │
└────────────────┴─────────────────────────────────┘
Note: The length field contains the byte count, not character count.
Devices announce themselves and discover others via UDP broadcasts.
"airD" (0x61 0x69 0x72 0x44)
┌──────────────────────────────────────────────────────────────┐
│ Offset │ Size │ Field │ Description │
├────────┼──────┼────────────────────┼─────────────────────────┤
│ 0 │ 4 │ Magic │ "airD" │
│ 4 │ 16 │ Token │ Device identifier │
│ 20 │ var │ Source │ Device source name │
│ var │ var │ Action │ Login/Logout action │
│ var │ var │ Software Name │ Device/software name │
│ var │ var │ Software Version │ Version string │
│ var │ 2 │ Port │ TCP service port │
└──────────────────────────────────────────────────────────────┘
| Action | Description |
|---|---|
DISCOVERER_HOWDY_ |
Device announcing presence (login) |
DISCOVERER_EXIT_ |
Device leaving network (logout) |
Common software names:
SC6000,SC6000M- PlayersSC5000,SC5000M- PlayersPrime 4,Prime 2,Prime Go- All-in-one unitsX1850,X1800- MixersJM08- Mixer (ignored by most software)SoundSwitch- Lighting softwareResolume- VJ softwareOfflineAnalyzer- Track analysis (ignored)SSS0- SoundSwitch Embedded (ignored)
After discovery, devices connect via TCP for service communication.
- Client connects to device's announced TCP port
- Device sends
ServicesRequestmessage - Client sends
ServicesRequestwith its token - Device announces available services
- Client connects to desired service ports
| ID | Name | Description |
|---|---|---|
| 0x0 | ServicesAnnouncement | Announce a service and its port |
| 0x1 | TimeStamp | Time synchronization |
| 0x2 | ServicesRequest | Request service list |
┌──────────────────────────────────────────────────────────────┐
│ Offset │ Size │ Field │ Description │
├────────┼──────┼────────────────────┼─────────────────────────┤
│ 0 │ 4 │ Message ID │ 0x00000000 │
│ 4 │ 16 │ Token │ Device token │
│ 20 │ var │ Service Name │ e.g., "StateMap" │
│ var │ 2 │ Port │ Service TCP port │
└──────────────────────────────────────────────────────────────┘
| Service | Description |
|---|---|
| StateMap | Real-time state synchronization |
| FileTransfer | File downloads |
| BeatInfo | Beat and timing data |
| TimeSync | Clock synchronization |
| Directory | Service directory |
| Broadcast | Broadcast messages |
Real-time state updates for track info, playback status, mixer positions.
"smaa" (0x73 0x6D 0x61 0x61)
| Type ID | Name | Description |
|---|---|---|
| 0x00000000 | JSON State | State name + JSON value |
| 0x000007d2 | Interval Subscription | Subscribe with interval |
┌──────────────────────────────────────────────────────────────┐
│ Offset │ Size │ Field │ Description │
├────────┼──────┼────────────────────┼─────────────────────────┤
│ 0 │ 4 │ Magic │ "smaa" │
│ 4 │ 4 │ Type │ 0x00000000 │
│ 8 │ var │ State Name │ e.g., "/Engine/Deck1/Play" │
│ var │ var │ JSON Value │ State value as JSON │
└──────────────────────────────────────────────────────────────┘
/Engine/Deck1/Track/SongName- Track title/Engine/Deck1/Track/ArtistName- Artist name/Engine/Deck1/Track/TrackNetworkPath- Network path/Engine/Deck1/Track/TrackLength- Duration in seconds
/Engine/Deck1/Play- Play state (boolean)/Engine/Deck1/PlayState- Detailed play state/Engine/Deck1/CurrentBPM- Current BPM (float)/Engine/Deck1/Speed- Playback speed
/Engine/Deck1/SyncMode- Sync mode/Engine/Deck1/DeckIsMaster- Is master deck
/Mixer/CH1faderPosition- Channel fader (0.0-1.0)/Mixer/CrossfaderPosition- Crossfader position/Mixer/CH1OnAir- Channel on-air status
See types/models/State.ts for the complete list (~246 states).
Downloads files from devices including databases and audio files.
"fltx" (0x66 0x6C 0x74 0x78)
| ID | Name | Description |
|---|---|---|
| 0x0 | TimeCode | Time synchronization |
| 0x1 | FileStat | File metadata (size, etc.) |
| 0x2 | EndOfMessage | Transfer complete |
| 0x3 | SourceLocations | Available media sources |
| 0x4 | FileTransferId | Start file transfer |
| 0x5 | FileTransferChunk | File data chunk |
| 0x8 | Unknown | Unknown purpose |
| 0x9 | ServiceDisconnect | Disconnect service |
┌──────────────────────────────────────────────────────────────┐
│ Offset │ Size │ Field │ Description │
├────────┼──────┼────────────────────┼─────────────────────────┤
│ 0 │ 4 │ Magic │ "fltx" │
│ 4 │ 4 │ Type ID │ 0x00000000 │
│ 8 │ 4 │ Message ID │ 0x00000003 │
│ 12 │ 4 │ Source Count │ Number of sources │
│ 16 │ var │ Source Names │ Array of NetworkStrings │
│ var │ 3 │ Padding │ 0x01 0x01 0x01 │
└──────────────────────────────────────────────────────────────┘
- Request file with path
- Receive FileStat (size, metadata)
- Receive FileTransferChunk messages
- Receive EndOfMessage
Real-time beat and timing information for each deck.
┌──────────────────────────────────────────────────────────────┐
│ Offset │ Size │ Field │ Description │
├────────┼──────┼────────────────────┼─────────────────────────┤
│ 0 │ 4 │ ID │ Message identifier │
│ 4 │ 8 │ Clock │ Timestamp (nanoseconds) │
│ 12 │ 4 │ Deck Count │ Number of decks │
│ 16 │ 24*n │ Deck Data │ Per-deck beat info │
│ var │ 8*n │ Sample Positions │ Optional sample offsets │
└──────────────────────────────────────────────────────────────┘
Deck Data (24 bytes per deck):
┌──────────────────────────────────────────────────────────────┐
│ Offset │ Size │ Field │ Description │
├────────┼──────┼────────────────────┼─────────────────────────┤
│ 0 │ 8 │ Beat │ Current beat (Float64) │
│ 8 │ 8 │ Total Beats │ Total beats (Float64) │
│ 16 │ 8 │ BPM │ Current BPM (Float64) │
└──────────────────────────────────────────────────────────────┘
Tokens are 16-byte UUIDs identifying devices.
| Hex | Device |
|---|---|
52fdfcc721826541563f5f0f9a621d72 |
SoundSwitch |
828beb02da1f4e68a6afb0b167eaf0a2 |
SC6000 (default 1) |
26d238671cd64e3f80a111826ac41120 |
SC6000 (default 2) |
88fa2099ac7a4f3fbc16a995dbda2a42 |
Resolume |
Engine Application & Streaming provides modern gRPC/HTTP APIs.
Request: "EAAS" + 0x01 0x00 (6 bytes)
Response: "EAAS" + 0x01 0x01 + Token + Hostname + URL + Version
- EngineLibraryService - Library access, search, tracks
- NetworkTrustService - Device authentication
GET /ping- Health checkGET /download/{path}- File download