Files
chanora/docs/references/respeak-protocol-reference.md
T
Edison Jwa 328776622f docs(references): fix formatting issues (TODO-074,075,076,077,078,082)
Fix malformed MIFCOM badge table row, replace section numbering
placeholder, split respeak reference into Part I/II, add version
notes for teaspeak contradictions, fix truncated YaTQA error codes.
2026-06-11 09:40:03 +09:00

100 KiB

ReSpeak TeamSpeak Protocol Reference

Comprehensive offline reference compiled from ReSpeak/tsdeclarations and ReSpeak/tsclientlib.


Table of Contents

Part I — TS3 Protocol Specification

  1. TS3 Protocol Specification

Part II — Reference Data

  1. Error Codes
  2. Permissions
  3. Client Versions
  4. Badges
  5. Enums
  6. Book (State Tracking) Definitions
  7. Packet Definitions
  8. tsdeclarations README
  9. tsclientlib Architecture & API

Part I — TS3 Protocol Specification

1. TS3 Protocol Specification

0. Naming Conventions

  • (Client -> Server) denotes packets from client to server.
  • (Client <- Server) denotes packets from server to client.
  • All datatypes are sent in network order (Big Endian) unless otherwise specified.
  • Datatypes are declared with a prefixing u or i for unsigned and signed and a number for the bitlength. For example u8 would be the C equivalent of uint8 or unsigned char
  • Arrays are represented by the underlying datatype in square brackets, additionally if the length is known it is added in the brackets, separated by a semicolon. Eg: [u8], [i32; 16]
  • Array ranges (parts of an array) are specified in square brackets with the included lower bound, two points (..) and the excluded upper bound. Eg: [0..10]

1. Low-Level Packets

1.1 Packet structure

  • The packets are build in a fixed scheme, though have differences depending in which direction.
  • Every column here represents 1 byte.
  • The entire packet size must be at max 500 bytes.

1.1.1 (Client -> Server)

+--+--+--+--+--+--+--+--+--+--+--+--+--+---------//----------+
|          MAC          | PId | CId |PT|        Data         |
+--+--+--+--+--+--+--+--+--+--+--+--+--+---------//----------+
|                       \     Meta     |
\                Header                /
Name Size Datatype Explanation
MAC 8 bytes [u8] EAX Message Authentication Code
PId 2 bytes u16 Packet Id
CId 2 bytes u16 Client Id
PT 1 byte u8 Packet Type + Flags
Data ≤487 bytes [u8] The packet payload

1.1.2 (Client <- Server)

+--+--+--+--+--+--+--+--+--+--+--+------------//-------------+
|          MAC          | PId |PT|           Data            |
+--+--+--+--+--+--+--+--+--+--+--+------------//-------------+
|                       \  Meta  |
\             Header             /
Name Size Datatype Explanation
MAC 8 bytes [u8] EAX Message Authentication Code
PId 2 bytes u16 Packet Id
PT 1 byte u8 Packet Type + Flags
Data ≤489 bytes [u8] The packet payload

1.2 Packet Types

  • 0x00 Voice
  • 0x01 VoiceWhisper
  • 0x02 Command
  • 0x03 CommandLow
  • 0x04 Ping
  • 0x05 Pong
  • 0x06 Ack
  • 0x07 AckLow
  • 0x08 Init1

1.3 Packet Type + Flags byte

The final byte then looks like this:

MSB                   LSB
+--+--+--+--+--+--+--+--+
|UE|CP|NP|FR|   Type    |
+--+--+--+--+--+--+--+--+
Name Size Hex Explanation
UE 1 bit 0x80 Unencrypted
CP 1 bit 0x40 Compressed
NP 1 bit 0x20 Newprotocol
FR 1 bit 0x10 Fragmented
Type 4 bit 0-8 The packet type

1.4 Packet Compression

To reduce packet size, the data can be compressed. When the data is compressed the Compressed flag must be set. The algorithm "QuickLZ" with Level 1 is used for compression.

1.5 Packet Splitting

When the packet payload exceeds the maximum datablock size the data can be split up across multiple packets. The current protocol only allows Command and CommandLow to be split and/or compressed. When splitting occurs, the Fragmented flag must be set on the first and the last packet. The Unencrypted and Compressed flag, if set in the original packet, are only set on the first packet. (Though commands always have to be encrypted) The Newprotocol flag has to be set on all commands and therefore also has to be applied on all splitted command packets. The data can additionally be compressed before splitting.

Example: The packet to split has the following flags:

[__|CP|NP|__]  Packet Id: 42

it must be split into:

[__|CP|NP|FR]  Packet Id: 42
[__|__|NP|__]  Packet Id: 43
[__|__|NP|FR]  Packet Id: 44

1.6 Packet Encryption

When a packet is not encrypted the Unencrypted flag is set. For encrypted packets the flag gets cleared. Packets get encrypted with EAX mode (AES_128_CTR with OMAC). The en/decryption parameters are generated for each packet as follows:

1.6.1 Inputs

Name Type Explanation
PT u8 Packet Type
PId u16 Packet Id
PGId u32 Packet GenerationId (see 1.9.2)
PD bool Packet Direction
SIV [u8; 20] Shared IV (see 3.2)

1.6.2 Generation pseudocode

Note that the temporary variable will have a different length depending on the result from the crypto init handshake. The old protocol SharedIV (see 3.2.1) will be 20 bytes long, since it is generated with sha1, while the new protocol SharedIV (see 3.2.2) will have 64 bytes, since it is generated with sha512.

let temporary: [u8; 26] OR [u8; 70]
temporary[0]    = 0x30 if (Client <- Server)
                  0x31 if (Client -> Server)
temporary[1]    = PT
temporary[2..6] = (PGId in network order)[0..4]
if SIV.length == 20
    temporary[6..26] = SIV[0..20]
else
    temporary[6..70] = SIV[0..64]

let keynonce: [u8; 32]
keynonce        = sha256(temporary)

key: [u8; 16]   = keynonce[ 0..16]
nonce: [u8; 16] = keynonce[16..32]
key[0]          = key[0] xor ((PId & 0xFF00) >> 8)
key[1]          = key[1] xor ((PId & 0x00FF) >> 0)

Note: The key and nonce can be cached for each tuple of (PT, PD, PGId) which will require 8 * 2 = 16 entries. And must only be recalculated each time the PG changes. For each packet to encrypt only the first 2 bytes must be xor'd with the PId as shown in the pseudocode.

1.6.3 Encryption

The data can now be encrypted with the key and nonce from (see 1.6.2) as the EAX key and nonce and the packet Meta as defined in (see 1.1) as the EAX header (sometimes called "Associated Text"). The resulting EAX mac (sometimes called "Tag") will be stored in the MAC field as defined in (see 1.1.1).

1.6.4 Not encrypted packets

When a packet is not encrypted, no MAC can be generated by EAX. In this case the SharedMac (see 3.2) will be used instead.

1.7 Packet Stack Wrap-up

This stack is a reference for the execution order of the set data operations. For incoming packets the stack is executed bot to top, for outgoing packets top to bot.

    Send                 Receive   
+-----------+         +-----------+
|   Data    | |     Λ |   Data    |
+-----------+ |     | +-----------+
| Compress  | |     | | Decompress|
+-----------+ |     | +-----------+
|   Split   | |     | |   Merge   |
+-----------+ |     | +-----------+
|  Encrypt  | V     | |  Decrypt  |
+-----------+         +-----------+

1.8 Packet Types Data Structures

1.8.1.1 Voice (Client -> Server)

+--+--+--+---------//---------+
| VId |C |        Data        |
+--+--+--+---------//---------+
Name Type Explanation
VId u16 Voice Packet Id
C u8 Codec Type
Data var Voice Data

1.8.1.2 Voice (Client <- Server)

+--+--+--+--+--+---------//---------+
| VId | CId |C |        Data        |
+--+--+--+--+--+---------//---------+
Name Type Explanation
VId u16 Voice Packet Id
CId u16 Talking Client
C u8 Codec Type
Data var Voice Data

1.8.2.1 VoiceWhisper (Client -> Server)

For direct user/channel targeting (The Newprotocol Flag must be unset):

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+---------//---------+
| VId |C |N |M |           U*          |  T* |        Data        |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+---------//---------+
Name Type Explanation
VId u16 Voice Packet Id
C u8 Codec Type
N u8 Count of ChannelIds to send to
M u8 Count of ClientIds to send to
U [u64] Targeted ChannelIds, repeated N times
T [u16] Targeted ClientIds, repeated M times
Data var Voice Data

For targeting special groups (The Newprotocol Flag must be set):

+--+--+--+--+--+--+--+--+--+--+--+--+--+---------//---------+
| VId |C |TY|TA|           U           |        Data        |
+--+--+--+--+--+--+--+--+--+--+--+--+--+---------//---------+
Name Type Explanation
VId u16 Voice Packet Id
C u8 Codec Type
TY u8 GroupWhisperType (see below)
TA u8 GroupWhisperTarget (see below)
U u64 the targeted channelId or groupId (0 if not applicable)
Data var Voice Data
enum GroupWhisperType : u8
{
    ServerGroup      = 0, /* U = servergroup targetId */
    ChannelGroup     = 1, /* U = channelgroup targetId */
    ChannelCommander = 2, /* U = 0 (ignored) */
    AllClients       = 3, /* U = 0 (ignored) */
}

enum GroupWhisperTarget : u8
{
    AllChannels           = 0,
    CurrentChannel        = 1,
    ParentChannel         = 2,
    AllParentChannel      = 3,
    ChannelFamily         = 4,
    CompleteChannelFamily = 5,
    Subchannels           = 6,
}

1.8.2.2 VoiceWhisper (Client <- Server)

+--+--+--+--+--+---------//---------+
| VId | CId |C |        Data        |
+--+--+--+--+--+---------//---------+
Name Type Explanation
VId u16 Voice Packet Id
CId u16 Talking Client
C u8 Codec Type
Data var Voice Data

1.8.3-4 Command and CommandLow

The TeamSpeak3 Query like command string encoded in UTF-8.

1.8.5 Ping

Empty.

1.8.6-8 Pong, Ack and AckLow

+--+--+
| PId |
+--+--+
Name Type Explanation
PId u16 The packet id that is acknowledged
  • In case of Pong a matching ping packet id is acknowledged.
  • In case of Ack or AckLow a matching Command or CommandLow packet id respectively is acknowledged.

1.8.9 Init1

(see 2.1)-(see 2.5)

1.9 Packet Ids and Generations

1.9.1 Packet Ids

Each packet type and packet direction must be maintained by an own packet id counter. This means the client has 9 different packet id counter for outgoing packets. For each new packet the counter gets increased by 1. This also applies to split packets. The client must also maintain packet ids for incoming packets in case of packets arriving out of order. All Packet Ids start at 1 unless otherwise specified.

1.9.2 Generations

Packet Ids are stored as u16, this means they range from 0 up to 65535 included. When the packet id overflows from 65535 to 0 at a packet, the generation counter for this packet type gets increased by 1. Note that the new generation id immediately applies to the 'overflowing' packet. The generation id counter is solely used for encryption (see 1.6).

1.10 Packet Acknowledgement / Packet Loss

In order to reliably send packets over UDP some packet types must get acknowledged when received (see 1.11). The protocol uses selective repeat for lost packets. This means each packet has its own timeout. Already acknowledged later packets must not be resent. When a packet times out, the exact same packet should be resent until properly acknowledged by the server. If after 30 seconds no resent packet gets acknowledged the connection should be closed. Packet resend timeouts should be calculated with an exponential backoff to prevent network congestion.

1.11 Wrap-up

Type Acknowledged (by) Resend Encrypted Splittable Compressible
Voice Optional
VoiceWhisper Optional
Command ✓ (Ack)
CommandLow ✓ (AckLow)
Ping ✓ (Pong)
Pong
Ack
AckLow
Init1 ✓ (next Init1)

2. The (Low-Level) Initiation/Handshake

A connection is started from the client by sending the first handshake packet. The handshake process consists of 5 different init packets. This includes the so called RSA puzzle to prevent DOS attacks.

The packet header values are set as following for all packets here:

Parameter Value
MAC [u8]{ 0x54, 0x53, 0x33, 0x49, 0x4E, 0x49, 0x54, 0x31 }
key N/A
nonce N/A
Type Init1
Encrypted
Packet Id u16: 101
Client Id u16: 0

Init packets from the client contain a version field, which is the build timestamp of the client. This is a unix timestamp subtracted with 1356998400. The unix timestamp 1461588969 (date 2016-04-25) is encoded as 1461588969 - 1356998400 = 0x063bece9 = { 0x06, 0x3b, 0xec, 0xe9 }.

2.1 Packet 0 (Client -> Server)

04 bytes : Version of the TeamSpeak client as timestamp
           Example: { 0x06, 0x3b, 0xec, 0xe9 }
01 bytes : Init-packet step number
           Const: 0x00
04 bytes : Current timestamp in unix format
04 bytes : Random bytes := [A0]
08 bytes : Zeros, reserved.

2.2 Packet 1 (Client <- Server)

01 bytes : Init-packet step number
           Const: 0x01
16 bytes : Server stuff := [A1]
04 bytes : The bytes from [A0] in reversed order (not always) := [A0r]

This packets usually contains the bytes from [A0] in reversed order, except when connecting from some networks for a yet unknown reason.

2.3 Packet 2 (Client -> Server)

04 bytes : Version of the TeamSpeak client as timestamp
01 bytes : Init-packet step number
           Const: 0x02
16 bytes : The bytes from [A1]
04 bytes : The bytes from [A0r]

2.4 Packet 3 (Client <- Server)

01 bytes : Init-packet step number
           Const: 0x03
64 bytes : 'x', an unsigned BigInteger
64 bytes : 'n', an unsigned BigInteger
04 bytes : 'level' a u32
100 bytes : Server stuff := [A2]

Note: Sometimes, instead of sending an init with step 3, the server responds with an init that contains 127 as step number. In that case, the client has to restart the connection by sending packet 0 again.

2.5 Packet 4 (Client -> Server)

04 bytes : Version of the TeamSpeak client as timestamp
01 bytes : Init-packet step number
           Const: 0x04
64 bytes : the received 'x'
64 bytes : the received 'n'
04 bytes : the received 'level'
100 bytes : The bytes from [A2]
64 bytes : 'y' which is the result of x ^ (2 ^ level) % n as an unsigned
           BigInteger. Padded from the lower side with '0x00' when shorter
           than 64 bytes.
           Example: { 0x00, 0x00, data ... data}
var bytes : The clientinitiv command data as explained in (see 3.1)

Note:

  • ^ in this context means 'power to'
  • To calculate the power of such a high number use a language integrated function like ModPow or similar, when available. If you don't have this function available you can multiply x iteratively and apply the modulo operation after each multiplication.

3. The (High-Level) Initiation/Handshake

In this phase the client and server exchange basic information and agree on/calculate the symmetric AES encryption key with the ECDH public/private key exchange technique.

Both the client and the server will need a EC public/private key. This key is also the identity which the server uses to recognize a user again. The curve used is 'prime256v1'.

All high level packets specified in this chapter are sent as Command Type packets as explained in (see 2.8.3). Additionally the Newprotocol flag (see 2.3) must be set on all Command, CommandLow and Init1 packets.

All commands are specified in the Messages.txt file.

The packet header/encryption values for (see 3.1) and (see 3.2) are as following:

Parameter Value
MAC (Generated by EAX)
key [u8]{0x63, 0x3A, 0x5C, 0x77, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x5C, 0x73, 0x79, 0x73, 0x74, 0x65}
nonce [u8]{0x6D, 0x5C, 0x66, 0x69, 0x72, 0x65, 0x77, 0x61, 0x6C, 0x6C, 0x33, 0x32, 0x2E, 0x63, 0x70, 0x6C}
Type Command
Encrypted
Packet Id u16: 0
Client Id u16: 0

The acknowledgement packets use the same parameters as the commands, except with the Type Ack.

3.1 clientinitiv (Client -> Server)

The first packet is sent (Client -> Server) although this is only sent for legacy reasons since newer servers (at least 3.0.13.0?) use the data part embedded in the last Init1 packet from the low-level handshake (see 2.5).

clientinitiv alpha={alpha} omega={omega} ot={ot} ip={ip}
  • alpha is set to base64(random[u8; 10]) which are 10 random bytes for entropy.

  • omega is set to base64(publicKey[u8]) omega is an ASN.1-DER encoded public key from the ECDH parameters as following:

    Type Value Explanation
    BIT STRING 1bit, Value: 0 LibTomCrypt uses 0 for a public key
    INTEGER 32 The LibTomCrypt used keysize
    INTEGER publicKey.x The affine X-Coordinate of the public key
    INTEGER publicKey.y The affine Y-Coordinate of the public key
  • ot should always be 1

  • ip should be set to the final resolved ip address of the server you are actually connecting to.

3.2 initivexpand/initivexpand2 (Client <- Server)

Depending on the server version the server will send a different init request.

  • TS3 server <3.1 will send initivexpand. Continue with (see 3.2.1)
  • TS3 server ≥3.1 will send initivexpand2. Continue with (see 3.2.2)

If you want to support both protocol standards you don't need to check/know the server version. The client just has to act accordingly depending on which packet the server sends.

3.2.1 initivexpand (Client <- Server)

The server responds with this command.

initivexpand alpha={alpha} beta={beta} omega={omega}
  • alpha must have the same value as sent to the server in the previous step.
  • beta is set to base64(random[u8; 10]) by the server.
  • omega is set to base64(publicKey[u8]) with the public key from the server, encoded same as in (see 3.1)

With this information the client now must calculate the shared secret.

let sharedSecret: ECPoint
let x: [u8]
let sharedData: [u8; 32]
let SharedIV: [u8; 20]
let SharedMac: [u8; 8]
let ECDH(A, B)    := (A * B).Normalize

sharedSecret         = ECDH(serverPublicKey, ownPrivateKey)
x                    = sharedSecret.x.AsByteArray()
if x.length < 32
    sharedData[ 0..(32-x.length)] = [0..0]
    sharedData[(32-x.length)..32] = x[0..x.length]
elseif x.length == 32
    sharedData[0..32] = x[0..32]
elseif x.length > 32
    sharedData[0..32] = x[(x.length-32)..x.length]
SharedIV              = sha1(sharedData)
SharedIV[0..10]       = SharedIV[0..10] xor alpha.decode64()
SharedIV[10..20]      = SharedIV[10..20] xor beta.decode64()
SharedMac[0..8]       = sha1(SharedIV)[0..8]

3.2.2 initivexpand2 (Client <- Server)

The server responds with this command.

initivexpand2 l={l} beta={beta} omega={omega} ot={ot} proof={proof} tvd={tvd}
  • l the server license (see 3.2.2.2)
  • beta is set to base64(random[u8; 54]) by the server.
  • omega is a base64(publicKey[u8]) with the public key from the server, encoded same as in (see 3.1)
  • ot should always be 1
  • proof is a base64(ecdh_sign(l))
  • tvd (base64, unknown; only set on servers with a license)
3.2.2.1 Verify integrity

This step must be done to verify the integrity of the connection.

The proof parameter is the sign of the l parameter (not base64 encoded). The client can verify the l parameter with the public key of the server which is sent in omega.

Both proofs which are exchanged (the one you received in (see 3.2.2), and the one sent in (see 3.2.2.5)) use 'prime256v1 with sha256, DER encoded'. Note that the identity keys from client/server already should be keys on 'prime256v1' as noted in (see 3).

3.2.2.2 Parsing the license

The license has a small header continued by a list of blocks. Each block may vary in length and must be parsed sequentially therefore.

The license header:

01 bytes : License version
           Const: 0x01

The block base layout:

01 bytes : Key type
           Const: 0x00 (public key)
32 bytes : Block public key
01 bytes : License block type
04 bytes : Not valid before date
04 bytes : Not valid after date
var bytes : (Content from the block type)

There are currently 4 different License block types used:

  • 00 Intermediate. content:

    04 bytes : Unknown
    var bytes : A null terminated string, which describes the issuer of this certificate.
    
  • 01 Website/03 Code content:

    var bytes : A null terminated string, which describes the issuer of this certificate.
    
  • 02 TS3 Server content:

    01 bytes : Server License Type
    04 bytes : Max clients allowed on the server
    var bytes : A null terminated string, which describes the issuer of this certificate.
    
  • 08 TS5 Server content:

    01 bytes : Server License Type
    01 bytes : Property count
    var bytes : Properties, see following description on how each property is encoded
    
    Per property:
    01 bytes : Length of following data
    01 bytes : Property Id
    01 bytes : Data Type
    var bytes : Content depending on data type, see below
    

    Data Types:

    • 00: Null-terminated string
    • 01/03: 4 byte data
    • 02/04: 8 byte data

    Property Id:

    • 01 (type 01): Unknown
    • 02 (type 00): Issuer of the certificate
    • 03 (type 01): Max clients allowed on the server, defaults to 32 if not present
  • 32 Ephemeral content: none

Both dates are stored in BigEndian, when read you must add 0x50e22700 to the number and import as a unix timestamp.

Each Not valid before and Not valid after timespan must be within the range of the parent license block.

The license must consist of 2 ≤ count ≤ 8 blocks. The second to last block must be of type Server and the last block must be of type Ephemeral.

3.2.2.4 Calculating the shared secret

All elliptic curve operations for this step are done on the Curve25519. You might find more tools looking for Ed25519 but keep in mind that Ed25519 describes an EdDsa signing/verify operation and is not the curve itself.

To calculate the shared secret each license block now must be processed sequentially the following way:

next_key = public_key * clamp(sha512(block[1..])[0..32]) + parent

Where:

  • public_key is the Block public key taken from the current license block. This array must be imported as a compressed Curve25519 EC point.
  • sha512(block[1..])[0..32] is the sha512 of the current license block. Note that the first byte (Key type) is skipped for the sha calculation. For the result only the first 32 bytes are used. This resulting array must be imported as a Curve25519 private key.
  • parent which is the resulting next_key from the previous block. This is a compressed Curve25519 EC point.
  • clamp(num) is a function describing abs(num) mod B where B is the base point of Curve25519. This function can usually be implemented conveniently on the number buffer like this:
    let buffer: [u8; 32]
    buffer[0]  &= 0xF8
    buffer[31] &= 0x3F
    buffer[31] |= 0x40
    

Since the first block has no predecessor, a fixed 'root' key is used as parent. This key must be imported as a compressed Curve25519 EC point.

[u8; 32] {0xcd, 0x0d, 0xe2, 0xae, 0xd4, 0x63, 0x45, 0x50, 0x9a, 0x7e, 0x3c,
          0xfd, 0x8f, 0x68, 0xb3, 0xdc, 0x75, 0x55, 0xb2, 0x9d, 0xcc, 0xec,
          0x73, 0xcd, 0x18, 0x75, 0x0f, 0x99, 0x38, 0x12, 0x40, 0x8a}

The last next_key is now used as the public key from the server (see pseudocode below).

The client now has to create a temporary Curve25519 public/private keypair. We will call them client_public_key and client_private_key.

Now the SharedIV and SharedMac which will be used in the encryption, just as in the old protocol, can be calculated.

let SharedIV: [u8; 64]
let SharedMac: [u8; 8]
let sharedData: [u8; 32]

sharedData           = next_key * client_private_key
SharedIV             = sha512(sharedData[0..32])
SharedIV[ 0..10]     = SharedIV[ 0..10] xor alpha.decode64()
SharedIV[10..64]     = SharedIV[10..64] xor  beta.decode64()
SharedMac[0..8]      = sha1(SharedIV)[0..8]
3.2.2.5 clientek (Client -> Server)
clientek ek={ek} proof={proof}
  • ek is base64(client_public_key) which the ephemeral (temporary) key created in (see 3.2.2.4) by the client. This should obviously be the public key part only.
  • proof is base64(client_public_key + beta) which is a sign of the client_public_key (the ek) concatenated with the beta parameter from the initivexpand2 command. The sign must be done with the private key from the identity keypair.

The normal packet id counting starts with this packet. This means that clientek already has the packet id 1 and the next command will continue with 2.

3.2.3 Notes

  • Only SharedIV and SharedMac are needed. The other values can (and should) be discarded.
  • The crypto handshake is now completed. The normal encryption scheme (see 1.6) is from now on used.
  • All Command, CommandLow, Ack and AckLow packets must get encrypted.
  • Voice packets (and VoiceWhisper when wanted) should be encrypted when the channel encryption or server wide encryption flag is set.
  • Ping and Pong must not be encrypted.

3.3 clientinit (Client -> Server)

clientinit client_nickname client_version client_platform client_input_hardware client_output_hardware client_default_channel client_default_channel_password client_server_password client_meta_data client_version_sign client_key_offset client_nickname_phonetic client_default_token hwid
  • client_nickname the desired nickname
  • client_version the client version
  • client_platform the client platform
  • client_input_hardware whether an input device is available
  • client_output_hardware whether an output device is available
  • client_default_channel the default channel to join. This can be a channel path or /<id> (eg /1) for a channel id.
  • client_default_channel_password the password for the join channel, prepared the following way base64(sha1(password))
  • client_server_password the password to enter the server, prepared the following way base64(sha1(password))
  • client_meta_data (can be left empty)
  • client_version_sign a cryptographic sign to verify the genuinity of the client
  • client_key_offset the number offset used to calculate the hashcash (see 4.1) value of the used identity
  • client_nickname_phonetic the phonetic nickname for text-to-speech
  • client_default_token permission token to be used when connecting to a server
  • hwid hardware identification string

Notes:

  • Since client signs are only generated and distributed by TeamSpeak systems, this is the recommended client triple, as it is the reference for this paper:
    • Version: 3.0.19.3 [Build: 1466672534]
    • Platform: Windows
    • Sign: a1OYzvM18mrmfUQBUgxYBxYz2DUU6y5k3/mEL6FurzU0y97Bd1FL7+PRpcHyPkg4R+kKAFZ1nhyzbgkGphDWDg==
  • The hwid usually consists of two 32 char strings concatenated with , and looks like 87056c6e1268aaf5055abf8256415e0e,408978b6d98810cc03f0aa16a4c75600 but even empty strings are accepted. On windows the hwid seems to be generated from a registry key (HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductId). On linux and macOS it seems to derive from the MAC address of the primary Ethernet/Wifi adapter.
  • Parameters which are empty or not used must be declared but left without value and the = character

3.4 initserver (Client <- Server)

The server sends the initserver command.

Note: From this point on the client knows his client id, therefore it must be set in the header of each packet. Newer versions of the server send parts of the clientinit command in the initserver command.

3.5 Further notifications

The server will now send all needed information to display the entire server properly. Those notifications are in no fixed order, although they are most of the time sent in the here declared order.

3.5.1 channellist and channellistfinished

The channellist notification type will be sent multiple times as needed to transfer the entire server structure. After the last channellist notification the server will send channellistfinished.

3.5.2 notifycliententerview

The notifycliententerview notification will be sent multiple times as needed for each client currently connected. This is the same notification as when a new client connects.

4. Further Concepts

4.1 Hashcash

To prevent client spamming (connecting to a server with many different clients) the server requires a certain hashcash level on each identity. This level has a exponentially growing calculation time with increasing level. This ensures that a user wanting to spam a certain server needs to invest some time into calculating the required level.

  • The publicKey is a string encoded as in (see 3.1) the omega value.
  • The key offset is a u64 number, which gets converted to a string when concatenated.

The first step is to calculate a hash as following:

let data: [u8; 20] = sha1(publicKey + keyOffset)

The level can now be calculated by counting the continuous leading zero bits in the data array. The bytes in the array get counted from 0 to 20 and the bits in each byte from least significant to most significant.

4.2 Uid

To calculate the uid of an identity the public key is required. Therefore you can only calculate the uid of your own identity and the servers identity you are connecting to.

The publicKey is a string encoded as in (see 3.1) the omega value.

The uid can be calculated as following:

let uid: string = base64(sha1(publicKey))

4.3 Ping/Pong

The server will regularly send ping packets to check if a client is still alive. The client must answer them with the according pong packet. The client should also send ping packets to the server to check for connection. They will be answered with according pong packets. Sending ping packets from the client side should not be started before the crypto handshake has been completed (see 3.3).

4.4 Passwords

All passwords when sent are hashed and encoded with base64(sha1(password))

4.5 Importing/Deobfuscating Identities from the TeamSpeak3 Client

The TeamSpeak3 Client exports identities the following way:

<key_offset> + 'V' + <obfuscaded_identity>

(For an explanation of the key offset (see 4.1))

const staticObfucationKey = b"b9dfaa7bee6ac57ac7b65f1094a1c155e747327bc2fe5d51c512023fe54a280201004e90ad1daaae1075d53b7d571c30e063b5a62a4a017bb394833aa0983e6e"
let ident = obfuscaded_identity.decode64()
let sha_part = ident[20..]
let idx = sha_part.indexof('\0') // where '\0' is the null-byte
let sha = sha1(sha_part[..idx])
ident[0..20] = ident[0..20] xor sha[0..20]
let xorlen = min(ident.length, 100)
ident[0..xorlen] = ident[0..xorlen] xor staticObfucationKey[0..xorlen]

4.6 Audio

When the Opus codec is used, Voice and VoiceWhisper packets are using a sampling rate of 48 kHz. A voice packet without audio data signals the end of a stream.

4.7 Permissions

permissionlist requests the list of all permissions of the server. notifypermissionlist returns the list of permissions and a grouping as a list of group_id_ends. The end ids are excluding, so a group_id_end=6 for the first group means the first 6 permissions (perms[0..6]) are in this group.

4.8 Channel Subscription

Clients can subscribe channels, so they get notifications when someone enters or leaves from a subscribed channel. If a new channel is subscribed, the server usually sends a notification, except in some cases:

  • If the client server groups or permissions change, it stays subscribed, even if it does not have the power anymore
  • If the channel permissions change, the server sends a notification if the subscription status changed
  • If a client enters a channel, it gets subscribed but there is no notification
  • If a client leaves a channel, there is a notification that it unsubscribed
  • If a new channel is created, clients are not automatically subscribed

4.9 Differences between Query and Full Client

  • notifyconnectioninforequest
  • => setconnectioninfo

Part II — Reference Data

2. Error Codes

Name Doc Hex
ok unknown error code 0x0000
undefined undefined error 0x0001
not_implemented not implemented 0x0002
ok_no_update 0x0003
dont_notify 0x0004
lib_time_limit_reached library time limit reached 0x0005
command_not_found command not found 0x0100
unable_to_bind_network_port unable to bind network port 0x0101
no_network_port_available no network port available 0x0102
client_invalid_id invalid clientID 0x0200
client_nickname_inuse nickname is already in use 0x0201
client_invalid_error_code invalid error code 0x0202
client_protocol_limit_reached max clients protocol limit reached 0x0203
client_invalid_type invalid client type 0x0204
client_already_subscribed already subscribed 0x0205
client_not_logged_in not logged in 0x0206
client_could_not_validate_identity could not validate client identity 0x0207
client_invalid_password invalid loginname or password 0x0208
client_too_many_clones_connected too many clones already connected 0x0209
client_version_outdated client version outdated, please update 0x020a
client_is_online client is online 0x020b
client_is_flooding client is flooding 0x020c
client_hacked client is modified 0x020d
client_cannot_verify_now can not verify client at this moment 0x020e
client_login_not_permitted client is not permitted to log in 0x020f
client_not_subscribed client is not subscribed to the channel 0x0210
channel_invalid_id invalid channelID 0x0300
channel_protocol_limit_reached max channels protocol limit reached 0x0301
channel_already_in already member of channel 0x0302
channel_name_inuse channel name is already in use 0x0303
channel_not_empty channel not empty 0x0304
channel_can_not_delete_default can not delete default channel 0x0305
channel_default_require_permanent default channel requires permanent 0x0306
channel_invalid_flags invalid channel flags 0x0307
channel_parent_not_permanent permanent channel can not be child of non permanent channel 0x0308
channel_maxclients_reached channel maxclient reached 0x0309
channel_maxfamily_reached channel maxfamily reached 0x030a
channel_invalid_order invalid channel order 0x030b
channel_no_filetransfer_supported channel does not support filetransfers 0x030c
channel_invalid_password invalid channel password 0x030d
channel_is_private_channel channel is private channel 0x030e
channel_invalid_security_hash invalid security hash supplied by client 0x030f
server_invalid_id invalid serverID 0x0400
server_running server is running 0x0401
server_is_shutting_down server is shutting down 0x0402
server_maxclients_reached server maxclient reached 0x0403
server_invalid_password invalid server password 0x0404
server_deployment_active deployment active 0x0405
server_unable_to_stop_own_server unable to stop own server in your connection class 0x0406
server_is_virtual server is virtual 0x0407
server_wrong_machineid server wrong machineID 0x0408
server_is_not_running server is not running 0x0409
server_is_booting server is booting up 0x040a
server_status_invalid server got an invalid status for this operation 0x040b
server_modal_quit server modal quit 0x040c
server_version_outdated server version is too old for command 0x040d
database database error 0x0500
database_empty_result database empty result set 0x0501
database_duplicate_entry database duplicate entry 0x0502
database_no_modifications database no modifications 0x0503
database_constraint database invalid constraint 0x0504
database_reinvoke database reinvoke command 0x0505
parameter_quote invalid quote 0x0600
parameter_invalid_count invalid parameter count 0x0601
parameter_invalid invalid parameter 0x0602
parameter_not_found parameter not found 0x0603
parameter_convert convert error 0x0604
parameter_invalid_size invalid parameter size 0x0605
parameter_missing missing required parameter 0x0606
parameter_checksum invalid checksum 0x0607
vs_critical virtual server got a critical error 0x0700
connection_lost Connection lost 0x0701
not_connected not connected 0x0702
no_cached_connection_info no cached connection info 0x0703
currently_not_possible currently not possible 0x0704
failed_connection_initialisation failed connection initialization 0x0705
could_not_resolve_hostname could not resolve hostname 0x0706
invalid_server_connection_handler_id invalid server connection handler ID 0x0707
could_not_initialise_input_manager could not initialize Input Manager 0x0708
clientlibrary_not_initialised client library not initialized 0x0709
serverlibrary_not_initialised server library not initialized 0x070a
whisper_too_many_targets too many whisper targets 0x070b
whisper_no_targets no whisper targets found 0x070c
file_invalid_name invalid file name 0x0800
file_invalid_permissions invalid file permissions 0x0801
file_already_exists file already exists 0x0802
file_not_found file not found 0x0803
file_io_error file input/output error 0x0804
file_invalid_transfer_id invalid file transfer ID 0x0805
file_invalid_path invalid file path 0x0806
file_no_files_available no files available 0x0807
file_overwrite_excludes_resume overwrite excludes resume 0x0808
file_invalid_size invalid file size 0x0809
file_already_in_use file already in use 0x080a
file_could_not_open_connection could not open file transfer connection 0x080b
file_no_space_left_on_device no space left on device (disk full?) 0x080c
file_exceeds_file_system_maximum_size file exceeds file system's maximum file size 0x080d
file_transfer_connection_timeout file transfer connection timeout 0x080e
file_connection_lost lost file transfer connection 0x080f
file_exceeds_supplied_size file exceeds supplied file size 0x0810
file_transfer_complete file transfer complete 0x0811
file_transfer_canceled file transfer canceled 0x0812
file_transfer_interrupted file transfer interrupted 0x0813
file_transfer_server_quota_exceeded file transfer server quota exceeded 0x0814
file_transfer_client_quota_exceeded file transfer client quota exceeded 0x0815
file_transfer_reset file transfer reset 0x0816
file_transfer_limit_reached file transfer limit reached 0x0817
sound_preprocessor_disabled preprocessor disabled 0x0900
sound_internal_preprocessor internal preprocessor 0x0901
sound_internal_encoder internal encoder 0x0902
sound_internal_playback internal playback 0x0903
sound_no_capture_device_available no capture device available 0x0904
sound_no_playback_device_available no playback device available 0x0905
sound_could_not_open_capture_device could not open capture device 0x0906
sound_could_not_open_playback_device could not open playback device 0x0907
sound_handler_has_device ServerConnectionHandler has a device registered 0x0908
sound_invalid_capture_device invalid capture device 0x0909
sound_invalid_playback_device invalid playback device 0x090a
sound_invalid_wave invalid wave file 0x090b
sound_unsupported_wave wave file type not supported 0x090c
sound_open_wave could not open wave file 0x090d
sound_internal_capture internal capture 0x090e
sound_device_in_use device still in use 0x090f
sound_device_already_registerred device already registerred 0x0910
sound_unknown_device device not registered/known 0x0911
sound_unsupported_frequency unsupported frequency 0x0912
sound_invalid_channel_count invalid channel count 0x0913
sound_read_wave read error in wave 0x0914
sound_need_more_data sound need more data 0x0915
sound_device_busy sound device was busy 0x0916
sound_no_data there is no sound data for this period 0x0917
sound_channel_mask_mismatch Channelmask set bits count (speakers) is not the same as (count) 0x0918
permission_invalid_group_id invalid group ID 0x0a00
permission_duplicate_entry duplicate entry 0x0a01
permission_invalid_perm_id invalid permission ID 0x0a02
permission_empty_result empty result set 0x0a03
permission_default_group_forbidden access to default group is forbidden 0x0a04
permission_invalid_size invalid size 0x0a05
permission_invalid_value invalid value 0x0a06
permissions_group_not_empty group is not empty 0x0a07
permissions_client_insufficient insufficient client permissions 0x0a08
permissions_insufficient_group_power insufficient group modify power 0x0a09
permissions_insufficient_permission_power insufficient permission modify power 0x0a0a
permission_template_group_is_used template group is currently used 0x0a0b
permissions permission error 0x0a0c
accounting_virtualserver_limit_reached virtualserver limit reached 0x0b00
accounting_slot_limit_reached max slot limit reached 0x0b01
accounting_license_file_not_found license file not found 0x0b02
accounting_license_date_not_ok license date not ok 0x0b03
accounting_unable_to_connect_to_server unable to connect to accounting server 0x0b04
accounting_unknown_error unknown accounting error 0x0b05
accounting_server_error accounting server error 0x0b06
accounting_instance_limit_reached instance limit reached 0x0b07
accounting_instance_check_error instance check error 0x0b08
accounting_license_file_invalid license file invalid 0x0b09
accounting_running_elsewhere virtualserver is running elsewhere 0x0b0a
accounting_instance_duplicated virtualserver running in same instance already 0x0b0b
accounting_already_started virtualserver already started 0x0b0c
accounting_not_started virtualserver not started 0x0b0d
accounting_to_many_starts 0x0b0e
message_invalid_id invalid message id 0x0c00
ban_invalid_id invalid ban id 0x0d00
connect_failed_banned connection failed, you are banned 0x0d01
rename_failed_banned rename failed, new name is banned 0x0d02
ban_flooding flood ban 0x0d03
tts_unable_to_initialize unable to initialize tts 0x0e00
privilege_key_invalid invalid privilege key 0x0f00
voip_pjsua 0x1000
voip_already_initialized 0x1001
voip_too_many_accounts 0x1002
voip_invalid_account 0x1003
voip_internal_error 0x1004
voip_invalid_connectionId 0x1005
voip_cannot_answer_initiated_call 0x1006
voip_not_initialized 0x1007
provisioning_invalid_password invalid password 0x1100
provisioning_invalid_request invalid request 0x1101
provisioning_no_slots_available no(more) slots available 0x1102
provisioning_pool_missing pool missing 0x1103
provisioning_pool_unknown pool unknown 0x1104
provisioning_unknown_ip_location unknown ip location(perhaps LAN ip?) 0x1105
provisioning_internal_tries_exceeded internal error(tried exceeded) 0x1106
provisioning_too_many_slots_requested too many slots requested 0x1107
provisioning_too_many_reserved too many reserved 0x1108
provisioning_could_not_connect could not connect to provisioning server 0x1109
provisioning_auth_server_not_connected authentication server not connected 0x1110
provisioning_auth_data_too_large authentication data too large 0x1111
provisioning_already_initialized already initialized 0x1112
provisioning_not_initialized not initialized 0x1113
provisioning_connecting already connecting 0x1114
provisioning_already_connected already connected 0x1115
provisioning_not_connected 0x1116
provisioning_io_error io_error 0x1117
provisioning_invalid_timeout 0x1118
provisioning_ts3server_not_found 0x1119
provisioning_no_permission unknown permissionID 0x111A

3. Permissions

Name Doc
unknown May occur on error returns with no associated permission
b_serverinstance_help_view Retrieve information about ServerQuery commands
b_serverinstance_version_view Retrieve global server version (including platform and build number)
b_serverinstance_info_view Retrieve global server information
b_serverinstance_virtualserver_list List virtual servers stored in the database
b_serverinstance_binding_list List active IP bindings on multi-homed machines
b_serverinstance_permission_list List permissions available on the server instance
b_serverinstance_permission_find Search permission assignments by name or ID
b_virtualserver_create Create virtual servers
b_virtualserver_delete Delete virtual servers
b_virtualserver_start_any Start any virtual server in the server instance
b_virtualserver_stop_any Stop any virtual server in the server instance
b_virtualserver_change_machine_id Change a virtual servers machine ID
b_virtualserver_change_template Edit virtual server default template values
b_serverquery_login Login to ServerQuery
b_serverinstance_textmessage_send Send text messages to all virtual servers at once
b_serverinstance_log_view Retrieve global server log
b_serverinstance_log_add Write to global server log
b_serverinstance_stop Shutdown the server process
b_serverinstance_modify_settings Edit global settings
b_serverinstance_modify_querygroup Edit global ServerQuery groups
b_serverinstance_modify_templates Edit global template groups
b_virtualserver_select Select a virtual server
b_virtualserver_info_view Retrieve virtual server information
b_virtualserver_connectioninfo_view Retrieve virtual server connection information
b_virtualserver_channel_list List channels on a virtual server
b_virtualserver_channel_search Search for channels on a virtual server
b_virtualserver_client_list List clients online on a virtual server
b_virtualserver_client_search Search for clients online on a virtual server
b_virtualserver_client_dblist List client identities known by the virtual server
b_virtualserver_client_dbsearch Search for client identities known by the virtual server
b_virtualserver_client_dbinfo Retrieve client information
b_virtualserver_permission_find Find permissions
b_virtualserver_custom_search Find custom fields
b_virtualserver_start Start own virtual server
b_virtualserver_stop Stop own virtual server
b_virtualserver_token_list List privilege keys available
b_virtualserver_token_add Create new privilege keys
b_virtualserver_token_use Use a privilege keys to gain access to groups
b_virtualserver_token_delete Delete a privilege key
b_virtualserver_log_view Retrieve virtual server log
b_virtualserver_log_add Write to virtual server log
b_virtualserver_join_ignore_password Join virtual server ignoring its password
b_virtualserver_notify_register Register for server notifications
b_virtualserver_notify_unregister Unregister from server notifications
b_virtualserver_snapshot_create Create server snapshots
b_virtualserver_snapshot_deploy Deploy server snapshots
b_virtualserver_permission_reset Reset the server permission settings to default values
b_virtualserver_modify_name Modify server name
b_virtualserver_modify_welcomemessage Modify welcome message
b_virtualserver_modify_maxclients Modify servers max clients
b_virtualserver_modify_reserved_slots Modify reserved slots
b_virtualserver_modify_password Modify server password
b_virtualserver_modify_default_servergroup Modify default Server Group
b_virtualserver_modify_default_channelgroup Modify default Channel Group
b_virtualserver_modify_default_channeladmingroup Modify default Channel Admin Group
b_virtualserver_modify_channel_forced_silence Modify channel force silence value
b_virtualserver_modify_complain Modify individual complain settings
b_virtualserver_modify_antiflood Modify individual antiflood settings
b_virtualserver_modify_ft_settings Modify file transfer settings
b_virtualserver_modify_ft_quotas Modify file transfer quotas
b_virtualserver_modify_hostmessage Modify individual hostmessage settings
b_virtualserver_modify_hostbanner Modify individual hostbanner settings
b_virtualserver_modify_hostbutton Modify individual hostbutton settings
b_virtualserver_modify_port Modify server port
b_virtualserver_modify_autostart Modify server autostart
b_virtualserver_modify_needed_identity_security_level Modify required identity security level
b_virtualserver_modify_priority_speaker_dimm_modificator Modify priority speaker dimm modificator
b_virtualserver_modify_log_settings Modify log settings
b_virtualserver_modify_min_client_version Modify min client version
b_virtualserver_modify_icon_id Modify server icon
b_virtualserver_modify_weblist Modify web server list reporting settings
b_virtualserver_modify_codec_encryption_mode Modify codec encryption mode
b_virtualserver_modify_temporary_passwords Modify temporary serverpasswords
b_virtualserver_modify_temporary_passwords_own Modify own temporary serverpasswords
b_virtualserver_modify_channel_temp_delete_delay_default Modify default temporary channel delete delay
b_virtualserver_modify_nickname Modify server nicknames
b_virtualserver_modify_integrations Modify integrations
i_channel_min_depth Min channel creation depth in hierarchy
i_channel_max_depth Max channel creation depth in hierarchy
b_channel_group_inheritance_end Stop inheritance of channel group permissions
i_channel_permission_modify_power Modify channel permission power
i_channel_needed_permission_modify_power Needed modify channel permission power
b_channel_info_view Retrieve channel information
b_channel_create_child Create sub-channels
b_channel_create_permanent Create permanent channels
b_channel_create_semi_permanent Create semi-permanent channels
b_channel_create_temporary Create temporary channels
b_channel_create_private Create private channel
b_channel_create_with_topic Create channels with a topic
b_channel_create_with_description Create channels with a description
b_channel_create_with_password Create password protected channels
b_channel_create_modify_with_codec_speex8 Create channels using Speex Narrowband (8 kHz) codecs
b_channel_create_modify_with_codec_speex16 Create channels using Speex Wideband (16 kHz) codecs
b_channel_create_modify_with_codec_speex32 Create channels using Speex Ultra-Wideband (32 kHz) codecs
b_channel_create_modify_with_codec_celtmono48 Create channels using the CELT Mono (48 kHz) codec
b_channel_create_modify_with_codec_opusvoice Create channels using OPUS (voice) codec
b_channel_create_modify_with_codec_opusmusic Create channels using OPUS (music) codec
i_channel_create_modify_with_codec_maxquality Create channels with custom codec quality
i_channel_create_modify_with_codec_latency_factor_min Create channels with minimal custom codec latency factor
b_channel_create_with_maxclients Create channels with custom max clients
b_channel_create_with_maxfamilyclients Create channels with custom max family clients
b_channel_create_with_sortorder Create channels with custom sort order
b_channel_create_with_default Create default channels
b_channel_create_with_needed_talk_power Create channels with needed talk power
b_channel_create_modify_with_force_password Create new channels only with password
i_channel_create_modify_with_temp_delete_delay Max delete delay for temporary channels
b_channel_modify_parent Move channels
b_channel_modify_make_default Make channel default
b_channel_modify_make_permanent Make channel permanent
b_channel_modify_make_semi_permanent Make channel semi-permanent
b_channel_modify_make_temporary Make channel temporary
b_channel_modify_name Modify channel name
b_channel_modify_topic Modify channel topic
b_channel_modify_description Modify channel description
b_channel_modify_password Modify channel password
b_channel_modify_codec Modify channel codec
b_channel_modify_codec_quality Modify channel codec quality
b_channel_modify_codec_latency_factor Modify channel codec latency factor
b_channel_modify_maxclients Modify channels max clients
b_channel_modify_maxfamilyclients Modify channels max family clients
b_channel_modify_sortorder Modify channel sort order
b_channel_modify_needed_talk_power Change needed channel talk power
i_channel_modify_power Channel modify power
i_channel_needed_modify_power Needed channel modify power
b_channel_modify_make_codec_encrypted Make channel codec encrypted
b_channel_modify_temp_delete_delay Modify temporary channel delete delay
b_channel_delete_permanent Delete permanent channels
b_channel_delete_semi_permanent Delete semi-permanent channels
b_channel_delete_temporary Delete temporary channels
b_channel_delete_flag_force Force channel delete
i_channel_delete_power Delete channel power
i_channel_needed_delete_power Needed delete channel power
b_channel_join_permanent Join permanent channels
b_channel_join_semi_permanent Join semi-permanent channels
b_channel_join_temporary Join temporary channels
b_channel_join_ignore_password Join channel ignoring its password
b_channel_join_ignore_maxclients Ignore channels max clients limit
i_channel_join_power Channel join power
i_channel_needed_join_power Needed channel join power
i_channel_subscribe_power Channel subscribe power
i_channel_needed_subscribe_power Needed channel subscribe power
i_channel_description_view_power Channel description view power
i_channel_needed_description_view_power Channel needed description view power
i_icon_id Group icon identifier
i_max_icon_filesize Max icon filesize in bytes
b_icon_manage Enables icon management
b_group_is_permanent Group is permanent
i_group_auto_update_type Group auto-update type
i_group_auto_update_max_value Group auto-update max value
i_group_sort_id Group sort id
i_group_show_name_in_tree Show group name in tree depending on selected mode
b_virtualserver_servergroup_list List server groups
b_virtualserver_servergroup_permission_list List server group permissions
b_virtualserver_servergroup_client_list List clients from a server group
b_virtualserver_channelgroup_list List channel groups
b_virtualserver_channelgroup_permission_list List channel group permissions
b_virtualserver_channelgroup_client_list List clients from a channel group
b_virtualserver_client_permission_list List client permissions
b_virtualserver_channel_permission_list List channel permissions
b_virtualserver_channelclient_permission_list List channel client permissions
b_virtualserver_servergroup_create Create server groups
b_virtualserver_channelgroup_create Create channel groups
i_group_modify_power Group modify power
i_group_needed_modify_power Needed group modify power
i_group_member_add_power Group member add power
i_group_needed_member_add_power Needed group member add power
i_group_member_remove_power Group member delete power
i_group_needed_member_remove_power Needed group member delete power
i_permission_modify_power Permission modify power
b_permission_modify_power_ignore Ignore needed permission modify power
b_virtualserver_servergroup_delete Delete server groups
b_virtualserver_channelgroup_delete Delete channel groups
i_client_permission_modify_power Client permission modify power
i_client_needed_permission_modify_power Needed client permission modify power
i_client_max_clones_uid Max additional connections per client identity
i_client_max_idletime Max idle time in seconds
i_client_max_avatar_filesize Max avatar filesize in bytes
i_client_max_channel_subscriptions Max channel subscriptions
b_client_is_priority_speaker Client is priority speaker
b_client_skip_channelgroup_permissions Ignore channel group permissions
b_client_force_push_to_talk Force Push-To-Talk capture mode
b_client_ignore_bans Ignore bans
b_client_ignore_antiflood Ignore antiflood measurements
b_client_issue_client_query_command Issue query commands from client
b_client_use_reserved_slot Use an reserved slot
b_client_use_channel_commander Use channel commander
b_client_request_talker Allow to request talk power
b_client_avatar_delete_other Allow deletion of avatars from other clients
b_client_is_sticky Client will be sticked to current channel
b_client_ignore_sticky Client ignores sticky flag
b_client_info_view Retrieve client information
b_client_permissionoverview_view Retrieve client permissions overview
b_client_permissionoverview_own Retrieve clients own permissions overview
b_client_remoteaddress_view View client IP address and port
i_client_serverquery_view_power ServerQuery view power
i_client_needed_serverquery_view_power Needed ServerQuery view power
b_client_custom_info_view View custom fields
i_client_kick_from_server_power Client kick power from server
i_client_needed_kick_from_server_power Needed client kick power from server
i_client_kick_from_channel_power Client kick power from channel
i_client_needed_kick_from_channel_power Needed client kick power from channel
i_client_ban_power Client ban power
i_client_needed_ban_power Needed client ban power
i_client_move_power Client move power
i_client_needed_move_power Needed client move power
i_client_complain_power Complain power
i_client_needed_complain_power Needed complain power
b_client_complain_list Show complain list
b_client_complain_delete_own Delete own complains
b_client_complain_delete Delete complains
b_client_ban_list Show banlist
b_client_ban_create Add a ban
b_client_ban_delete_own Delete own bans
b_client_ban_delete Delete bans
i_client_ban_max_bantime Max bantime
i_client_private_textmessage_power Client private message power
i_client_needed_private_textmessage_power Needed client private message power
b_client_server_textmessage_send Send text messages to virtual server
b_client_channel_textmessage_send Send text messages to channel
b_client_offline_textmessage_send Send offline messages to clients
i_client_talk_power Client talk power
i_client_needed_talk_power Needed client talk power
i_client_poke_power Client poke power
i_client_needed_poke_power Needed client poke power
b_client_set_flag_talker Set the talker flag for clients and allow them to speak
i_client_whisper_power Client whisper power
i_client_needed_whisper_power Client needed whisper power
b_client_modify_description Edit a clients description
b_client_modify_own_description Allow client to edit own description
b_client_modify_dbproperties Edit a clients properties in the database
b_client_delete_dbproperties Delete a clients properties in the database
b_client_create_modify_serverquery_login Create or modify own ServerQuery account
b_ft_ignore_password Browse files without channel password
b_ft_transfer_list Retrieve list of running filetransfers
i_ft_file_upload_power File upload power
i_ft_needed_file_upload_power Needed file upload power
i_ft_file_download_power File download power
i_ft_needed_file_download_power Needed file download power
i_ft_file_delete_power File delete power
i_ft_needed_file_delete_power Needed file delete power
i_ft_file_rename_power File rename power
i_ft_needed_file_rename_power Needed file rename power
i_ft_file_browse_power File browse power
i_ft_needed_file_browse_power Needed file browse power
i_ft_directory_create_power Create directory power
i_ft_needed_directory_create_power Needed create directory power
i_ft_quota_mb_download_per_client Download quota per client in MByte
i_ft_quota_mb_upload_per_client Upload quota per client in MByte

4. Client Versions

Format: version,platform,hash

This list contains 1536 known client version entries with their version hashes. Below is a representative sample spanning major releases from 3.0.11 through 5.0.0-alpha:

Version Platform Hash
3.0.11 [Build: 1374563791] Windows hQCwiLP5f4GIcDG5KQ1T+CNFGqRxyw5MXCHE8KjWRIgkjCuGSryK4vpPy70EURH3blQ8TKrax8BEorHlpnpdAQ==
3.0.11.1 [Build: 1375773286] Linux JMTTCSHw+ibyhqCDCWRgby/oJ5uAYHk0/QOwqqI5rNHCKTkb+ce6N+4J38WXAnRmtcEaMb0s30s3ipQBokrqDw==
3.0.11.1 [Build: 1375773286] OS X BngQ1112epNzhND5v7uDdbClbP9dSWczXKxvi1iRQo+xWt7WLYKJu/05MrW/CtPVtKwlT4PnbfI0Trvw+HvUCA==
3.0.16 [Build: 1407159763] Linux 8776GitHAgkFPfOLxEh5x+Luuh4NrYPEJUdsUzNKndcAuWMYjwQTZkmeZOeG/swdn/p2Cg2pRfZfsIFSOAUWCQ==
3.0.16 [Build: 1407159763] OS X vLAH2cYjkF/3sQCgr/zSmtffXcH2flI2vOnUP3uNIDSm8gKO61Q2hOdQaUzXE1yekLSMx2E9RYz+OQjQ868KAw==
3.0.18.2 [Build: 1445516611] iOS TEC965pHLJhoiNA2N95xBjQfh2n6uasS3BRFraucFv/+WgAKCKeoUYb3tu6feO5zvTEEiH6YCsedQdhbU1FFCw==
3.0.19.3 [Build: 1466672534] Windows a1OYzvM18mrmfUQBUgxYBxYz2DUU6y5k3/mEL6FurzU0y97Bd1FL7+PRpcHyPkg4R+kKAFZ1nhyzbgkGphDWDg==
3.0.19.4 [Build: 1468491418] Linux jvhhk75EV3nCGeewx4Y5zZmiZSN07q5ByKZ9Wlmg85aAbnw7c1jKq5/Iq0zY6dfGwCEwuKod0I5lQcVLf2NTCg==
3.0.19.4 [Build: 1468491418] OS X Pvcizdk3HRQMzTLt7goUYBmmS5nbAS1g2E6HIypLU+9eXTqGTBLim0UUtKc0s867TFHbK91GroDrTtv0aMUGAw==
3.1 [Build: 1471417187] Windows Vr9F7kbVorcrkV5b/Iw+feH9qmDGvfsW8tpa737zhc1fDpK5uaEo6M5l2DzgaGqqOr3GKl5A7PF9Sj6eTM26Aw==
3.1 [Build: 1475158080] Linux G0j7r7DswTMF+Fuqroy6/BR+tn02AOy0IZPlg9ZIW6r2m79yudZgrbm1TB4XoUpiFfex3ImdjOQnaFRQPONpBg==
3.1 [Build: 1481641346] iOS SDH0QNTA1wDQdfIU0HbcRugD3qkkPHnvlSq/IeW/I4A2myFQnDbzm8ilEGR0vOU4NoTae8CH5XsBmRqwyPIeBA==
3.1.0 [Build: 1481889010] Android eH8svg9XpltTbw+UYkQ4ixfqpbEAhwO9nmDDUWuI11swEU3Ye5HKGlFv70LxHZSgYlEqEH/N1J9U4ygptbPIDg==
3.1.7 [Build: 1512665843] Android J04O7RCgM3ZlecpZz5H8IgWggyCJQB5KG4/MEEB5/mrW6XJEK4J5IpU3jKztkvy54B8Nrj9tbwMaRujZfILSAg==
3.2.0 [Build: 1530859847] Android pjvK4iy+bB5X90mQI/Rzbkes27EokJjSOoGSXCqpjuPFj8Pe6BXt3M2E9VH/1Ec2hf8h51mr3D+cycGQpHq+DA==
3.2.0 [Build: 1533739581] Linux Vt+iPp952TU4uKwGXY0L61mXgBNfXg+1+16fnS0snPU9fhkfOKzdPN4rBELOwJ5XzZc33KdVC8rzZGYzlQceBg==
3.2.2 [Build: 1536587534] iOS 4rsRo3H9Uw0kui/cQkaBiqYy8ox6/gC6jDUVktcB6I71m1TeqUYy/IYMYbNSBtv0bmKntvcA0ZU79+zoXUkSAg==
3.2.5 [Build: 1555517253] Linux +nqAMBv2NxHYfPwHyRmleALMU/2gpiv1LAV6dmrLjNXaTS3BwLBVuysSuqHsuiK3/Xff0IRRFANz8qT1ztJqDQ==
3.3.0 [Build: 1555590310] OS X 4K5QbIPYfu42+ytMNgJOvYHB0kY/S+su1vsJ7zuLVlMs+XHbNhJEtjMANjDJAxfJ+fJ77VLBHf1Jo6Q5pSJFBA==
3.3.0 [Build: 1559834030] Android Ux59iejFFnEANHPjL4dmwUgXKhvnV7dPqjzAIqYMNs0RoF9RyhsgxEaJO72IgNt7D3yaD+4lGtYfcEFG8WDKCg==
3.3.1 [Build: 1561236585] Linux 2WaGpMt2Ky110SIh+byPcwkS+Dn9U2l7VffcJsoq2PNy0ZQ+o+N2i9wR4/7kEgtgB4SHIdoA7W8rQW2LLqUaAA==
5.0.0-alpha206 [Build: 1556530824] Linux jIng2diWQpiV/D0tMDJSoA24IB2kB1weMJi16NdXRVKaULISROJHhbZKVZwOvl7Dm2yQFneUXguxzUE5bHWXAA==
5.0.0-alpha206 [Build: 1556530824] macOS AaYqqXfOM9YSHTCNw/dVBrLUx8e/Kb+m7WmcRfEOrI+gqxS+EyqINxPQxpohpf7SW3OU2p2ic3BqaR89AFCqDQ==
5.0.0-alpha293 [Build: 1564586764] Windows ZT9k6ShVBg3ZF/koi55DJttu1vcI8AmZcULRfN8YhGQa9fEkS9qIpj3gP6HKq7fh9dESvoKksRORq59RiH8xBQ==

Note

: The complete list contains 1536 entries covering versions from 3.0.11 through 5.0.0-alpha293+ across Windows, Linux, OS X, macOS, Android, and iOS platforms. See the original Versions.csv in the tsdeclarations repository for the full list.


5. Badges

UID Name Description Filename Codes
4b27be5a-b92a-4b30-8b2d-14b59653f427 20th Anniversary Celebrating 20 Years of TeamSpeak 20_years
f81ad44d-e931-47d1-a3ef-5fd160217cf8 4Netplayers 4Netplayers customer 4netplayers
b78a0f3e-8758-4572-b102-42a79b4a0342 ???? Reads between the line hat
2bf80270-8efe-46dc-a472-3280a0479145 Alpha Tester Helped to test our software. THANK YOU! Alpha
05114019-6b46-4b13-b5a1-e5179ef69fb5 April Fools! Roses are red, gaming is fun, you are carrying too much to be able to run :( rpg
1a518885-520c-4f54-9f49-8b1acb674771 Braindance I'm chippin' in Braindance P4TEKZ80PZ
cbf5aafd-2554-4053-80bb-0cf82ec0a430 Bright Idea TeamSpeak took my idea on board FeatureBadge_Lightbulb
d6062d9c-42a3-49c9-91dd-8c43a5a46805 Bug Catcher I found a bug! BugBadge_Splat
dfc70674-0fd0-431e-b3a1-edc32d7b09b2 Challenge Accepted Unlocked at SCILL Play — Challenges, tournaments and more! scill
afed63f4-82f1-4479-ab02-0ef053f55723 Communities Early Adopter Thank you for your Support! communities_early_adopter
54be472d-3163-4076-9059-7f46128d937e Communities Purchase Purchased a TeamSpeak Community communities_purchase
f85f7e21-753a-4566-b26a-4e3e9155d2ef Cyberpunk We have a city to burn Cyberpunk
c028298c-84ff-4e22-be4e-b8c17552b4bb Digi Digi joined your channel #DIGWIN digi
56df5ce2-6c5a-4a24-90e2-29e497e26170 Drone Champions League I follow the Drone Champions League DCL_Badge DRONECHAMP
935e5a2a-954a-44ca-aa7a-55c79285b601 E3 2018 - Winner Discovered at E3 2018 E3-2018
61723e54-3da2-4f19-a33f-fcdc8ef5eaa0 Father's Day 2022 Not all heroes wear capes fathersday2022
b9c7d6ad-5b99-40fb-988c-1d02ab6cc130 Found Tim Speak Found Tim Speak at Gamescom 2018 met_tim XJN4WJZEJN
809bdd5a-2601-4152-82ff-a21d23d8fd46 G2 Esports Aged 20 years being a G2 fan G2_Esports
62444179-0d99-42ba-a45c-c6b1557d079a Gamescom 2014 Registered at Gamescom 2014 gamescom_2014
50bbdbc8-0f2a-46eb-9808-602225b49627 Gamescom 2016 Registered during Gamescom 2016 gamescom_2016
534c9582-ab02-4267-aec6-2d94361daa2a Gamescom 2017 Visited TeamSpeak at Gamescom 2017 gamescom_2017 DK9JGRJH1Q
4eef1ecf-a0ea-423d-bfd0-496543a00305 Gamescom 2018 Visited TeamSpeak at Gamescom 2018 gamescom_2018 8CXB49KPJ4
b82a45a5-b235-4926-be77-de102222e5eb Gamescom 2019 Visited TeamSpeak at Gamescom 2019 Gamescom19 PNKCB76VZ8
34dbfa8f-bd27-494c-aa08-a312fc0bb240 Gamescom Hero 2017 Gaming Hero at Gamescom 2017 hero_2017
24512806-f886-4440-b579-9e26e4219ef6 Gamescom Hero 2018 Gamescom Exclusive Gaming Hero 2018 gamescom_2018_played BJCFQBU53C
d49fd07e-99fb-41de-8d7b-c98064713171 GommeHD.net Your #1 Minecraft Network for over 10 years GMHD
c565972a-3912-457b-826f-84820c1ba6ca Halloween 2021 Happy Halloween 2021 halloween21
133595e7-950f-4ef2-b113-f91a68b5770d Halloween 2021 Special Earned by participating in our Halloween 2021 special stream halloween21_special
fb154277-5fe7-428a-85a4-43c0bdcdda3d Halloween 2022 Spooky_Scary_Skeletons.mp4 halloween22
e6679ce2-d458-493c-8ffb-5660e47ac99f Happy Hanami Enjoy the view hanami2023
de7bd960-eb02-47e1-9ce2-a44f6e255d8f Happy Holidays 2019 Happy holidays from everyone at TeamSpeak! Happy_Holidays
d4ea0251-ba46-4c1a-83b7-59db3f89e52c Happy New Year 2021 Survived the great toilet paper crisis of 2020 firework_2020
1519e001-06a0-458c-9195-a8a6d0ec87fc Happy New Year 2023 Aw man, here we go again 2023_NewYear
834d4cc1-cd80-48d6-96c4-23d131d78649 Happy Summer 2023 heat death of the universe happy_summer_2023
c68bcc52-7aeb-4868-b4d2-e7b20716f9ba Heatwave 2022 I'm melting... help summer_icecream
94242c4e-6742-4540-8b66-ce951ed57159 Helping Hand pushed some buttons beep bop ~ thanks! homebase
288a56c6-4da3-48de-9c9f-bd9eede5d832 Immortal Roleplay This is your life. Immortal_Roleplay
69bfffc8-e9c0-4f70-8a37-47cb8c73fb1d International Peace Day United we stand, divided we fall peaceday2022
9ea23c77-8755-4d82-b30c-92f4aac109ef International Women's Day 2021 To all the mums, sisters, aunties, nieces and beyond, Happy Women's Day! wft
7d9fa2b1-b6fa-47ad-9838-c239a4ddd116 MIFCOM MIFCOM — Entered Performance mifcom
ed85bdff-2a2b-4bea-a1a5-4d06fcc0d776 Merry Christmas 2019 It's the most wonderful 'Tim' of the Year Christmas
c6480fe2-ee25-4ee8-9853-243652c8ec54 Merry Christmas 2020 Let it snow, let it snow, let it snow! Christmas2020
0581aa0f-8c2d-4681-bb9f-8492fec49977 Merry Christmas 2021 Look what Santa's left under the server tree! christmas2021
d4875b30-9908-43cb-a1eb-1a958e226078 Merry Christmas 2022 There's snow place like home christmas2022
87ccf9ea-67c9-45e5-adbc-77e210e6128a Met Tim Met Tim Speak IRL tim_irl
0d98391c-ecdf-4f26-931a-49bfd669cda7 Mind Egg Found in the TeamSpeak 2020 Easter Egg Hunt E_MindEgg
2fdda3c6-20e0-48f1-9c12-f39239a2ed02 Mother's Day 2022 Thanks for bearing with us rose
c3f823eb-5d5c-40f9-9dbd-3437d59a539d Official TeamSpeak Gamer New myTeamSpeak member TS-2018
8dfa37ac-b40d-4466-b393-ff2184a9adf3 Overwatch League I follow the Overwatch League OWL_Badge
4ce435d1-6ac5-4530-b81d-6d14ddaaa1ac PGL Antwerp 2022 Watched the PGL CS:GO Major PGLant
fa3ece28-64df-431f-b1b3-90844bfdd2d9 Paris Games Week 2014 Registered at Paris Games Week 2014 paris_gamesweek_2014
d95f9901-c42d-4bac-8849-7164fd9e2310 Paris Games Week 2016 Registered during Paris Games Week 2016 paris_gamesweek_2016
0005232e-538e-4cb2-93b6-d7d83e873829 PietSmiet Werde Snob auf PietSmiet.de ;) PietSmiet
be932556-dfa9-4dc6-afd0-98de0ab25777 PolTeamgeist WooOOHoohOOHooo PolTeamgeist
5f6d49e4-35c8-4809-8c81-6e71f7f749e9 Power Egg Found in the TeamSpeak 2020 Easter Egg Hunt E_PowerEgg
ceee2445-4fbf-4f06-9421-286f0f4e875a Pride Never be afraid to show your colors. pride
1aa375e8-7207-45bf-8b80-556bafafc834 Reality Egg Found in the TeamSpeak 2020 Easter Egg Hunt E_RealityEgg
f22c22f1-8e2d-4d99-8de9-f352dc26ac5b Rocket Beans TV Rocket Beans TV Community rbtv RWGE2NURJZ
2c9698c1-1fec-4baa-a28f-4845f045f42f Soul Egg Found in the TeamSpeak 2020 Easter Egg Hunt E_SoulEgg
641a4d85-2351-482c-97a1-02fc3b6abbb5 Space Egg Found in the TeamSpeak 2020 Easter Egg Hunt E_SpaceEgg
63261116-4359-4842-873e-56820afbe068 SpartaTheOriginal Olaf Toast @ twitch.tv/SpartaTheOriginal Toast
ef567ec5-f46e-4520-be07-6021023cf6bd Sponsorship License Sponsored by TeamSpeak Sponsorship
7a627d47-5496-4d68-83b5-2c4eafff9b30 Stay Home, Stay Safe Playing Apart, Staying Connected StaySafeStayHome
7262a528-c7df-4369-bc2c-d34bf5853d7b TS Chat Alpha Tester Helped us test our new mobile app, thanks! slim_golden
6eee759e-b1e9-4937-b023-07fc778532a2 TS Gameday Participant At least i tried... silvered
e1447b99-53b0-448a-98b7-ee7bad8bd268 TS Gameday Winner As shiny as the golden frying pan goldenjoystick
1cb07348-34a4-4741-b50f-c41e584370f7 TeamSpeak Addon Author Creator of TeamSpeak Addons addon_author
450f81c1-ab41-4211-a338-222fa94ed157 TeamSpeak Addon Developer (Bronze) Creator of at least 1 TeamSpeak Addon addon_author_bronze
94ec66de-5940-4e38-b002-970df0cf6c94 TeamSpeak Addon Developer (Gold) Creator of at least 5 TeamSpeak Addons addon_author_gold
c9e97536-5a2d-4c8e-a135-af404587a472 TeamSpeak Addon Developer (Silver) Creator of at least 3 TeamSpeak Addons addon_author_silver
9cd152a7-bf65-4ece-aeba-62d27678f79a TeamSpeak Competition Winner Badge TeamSpeak Competition Winner CompWinnerBadge
64221fd1-706c-4bb2-ba55-996c39effa79 TeamSpeak Jedi myTeamSpeak early adopter TS-OG
6b187e83-873b-46b0-b2c2-a31af15e76a4 TeamSpeak Merch Badge TeamSpeak Merch Owner - 1st Edition cap_red
22b9ec39-7694-453e-864c-dfc7b1b0d7c7 TeamSpeak Merch Badge 2.0 TeamSpeak Merch Owner - 2nd Edition topper
205916f3-a953-4754-8905-bc15069b1f91 TeamSpeak Merch Badge 3.0 TeamSpeak Merch Owner — 3rd Edition Merch3
8d843dfa-c51a-407f-87b3-94cfc8f03e96 TeamSpeak Staff Official Staff Member teamspeak_staff
c2368518-3728-4260-bcd1-8b85e9f8984c Test Testing, Testing. Testing
4086a249-a503-4f31-9e83-8a0a8e3089bd Tim-o'-Lantern Mwuhaahaahaahaahaa Tim-O-Lantern JQGCTAQWHT
089c7295-3aa2-48b0-b2f1-2dd1bec12caf Time Egg Found in the TeamSpeak 2020 Easter Egg Hunt E_TimeEgg
904e232c-f369-44db-87f7-5142e15620cc Time Machine Worked like a machine to update addons in super-quick time. time_machine
4c61af66-22ef-4897-b0bb-25fcef2acf60 Undead Nightmare I'm the last of my kind undead_nightmare
b0a36aea-3e46-4e83-a455-6e92ae1b9d94 Undead Nightmare I'm the last of my kind undead_nightmare
0cd924ed-c5ea-459e-b60a-4f1bc0b65f07 Up, Up and Away! Find me on Mount Chiliad up,_up_and_away!
4b0fd4f5-d456-4294-973d-853a1db5c7d8 Valentim's Day 2019 Valentim's Day 2019 Valentines_Badge
92801833-e721-4b7e-84d4-6c02dbb332b9 Valentim's Day 2020 Valentim's Day 2020 Valentim2020
958f904b-8260-48a4-a961-f786cbd39411 Valentine's Day 2023 Love you like my Tamagotchi ValentinesDay23
a676c708-da67-4784-ba7f-3fb7e8d2e865 Valentines Day 2021 Roses are red, TS is blue, Servers are Sweet and so are you. valentine21
c54a9f92-07f7-4214-90f3-eafeea8005da World Backup Day Don't be an April Fool. Back up your data! backupday_2023
448a6d13-4e08-46a1-aafa-b4ff6d6c2d06 World Bonsai Day harmony, balance, patience bonsai_day
0f976a27-ddf5-447c-b79c-0644a8e8a297 Year of the Dragon 2024 Arise, Shenron! year_of_the_dragon_2024
8c22fe26-30ac-4231-8b31-67d8a75c808a Year of the Ox 2021 Only listen to the fortune cookie; disregard all other fortune telling units. ox21
970c70e6-00a1-41c1-ac5c-81c89a06c7a6 Year of the Rabbit 2023 Do a barrel roll! chineseNY2023
92356386-0451-4a97-87d9-10ff4f43260c Year of the Tiger 2022 Rocky sends his regards tiger

6. Enums

PermissionType

Variant Doc
ServerGroup Server group permission. (id1: ServerGroupId, id2: 0)
GlobalClient Client specific permission. (id1: ClientDbId, id2: 0)
Channel Channel specific permission. (id1: ChannelId, id2: 0)
ChannelGroup Channel group permission. (id1: ChannelId, id2: ChannelGroupId)
ChannelClient Channel-client specific permission. (id1: ChannelId, id2: ClientDbId)

TextMessageTargetMode

Variant Doc
Unknown Maybe to all servers?
Client Send to specific client
Channel Send to current channel
Server Send to server chat

HostMessageMode

Variant Doc
None Dont display anything
Log Display message inside log
Modal Display message inside a modal dialog
Modalquit Display message inside a modal dialog and quit/close server/connection

HostBannerMode

Variant Doc
NoAdjust Do not adjust
AdjustIgnoreAspect Adjust and ignore aspect ratio
AdjustKeepAspect Adjust and keep aspect ratio

Codec

Variant Doc
SpeexNarrowband Mono, 16bit, 8kHz, bitrate dependent on the quality setting
SpeexWideband Mono, 16bit, 16kHz, bitrate dependent on the quality setting
SpeexUltrawideband Mono, 16bit, 32kHz, bitrate dependent on the quality setting
CeltMono Mono, 16bit, 48kHz, bitrate dependent on the quality setting
OpusVoice Mono, 16bit, 48kHz, bitrate dependent on the quality setting, optimized for voice
OpusMusic Stereo, 16bit, 48kHz, bitrate dependent on the quality setting, optimized for music

CodecEncryptionMode

Variant Doc
PerChannel Voice encryption is configured per channel
ForcedOff Voice encryption is globally off
ForcedOn Voice encryption is globally on

Reason

Variant Doc
None No reason data
Moved Has invoker
Subscription No reason data
LostConnection Timeout
KickChannel Has invoker
KickServer Has invoker
KickServerBan Has invoker, bantime
Serverstop
Clientdisconnect
Channelupdate No reason data
Channeledit Has invoker
ClientdisconnectServerShutdown

GroupNamingMode

Variant Doc
None No group name is displayed.
Before Group name is displayed before the client name.
After Group name is displayed after the client name.

GroupType

Variant Doc
Template Template group (used for new virtual servers).
Regular Regular group (used for regular clients).
Query Global query group (used for server query clients).

LicenseType

Variant Doc
NoLicense No licence
Offline Offline/LAN license
Sdk TeamSpeak SDK license
SdkOffline TeamSpeak SDK offline license
Npl Non-Profit License (NPL)
Athp Authorised TeamSpeak Host Provider License (ATHP)
Aal Annual activation license (AAL)
Default Default license with 32 slots
Gamer Gamer license
Sponsorship Licenses sponsored by TeamSpeak
Commercial For use inside corporates

ChannelType

Variant Doc
Permanent Normal channel
SemiPermanent Deleted when the server restarts
Temporary Deleted when empty

TokenType

Variant Doc
ServerGroup Server group token (id1={groupId}, id2=0)
ChannelGroup Channel group token (id1={groupId}, id2={channelId})

PluginTargetMode

Variant Doc
CurrentChannel Send to all clients in the current channel.
Server Send to all clients on the server.
Client Send to all given clients ids.
CurrentChannelSubsribedClients Send to all given clients which are subscribed to the current channel (i.e. which see the this client).

LogLevel

Variant Value Doc
Error 1 Everything that is really bad.
Warning Everything that might be bad.
Debug Output that might help find a problem.
Info Informational output.

ChannelPermissionHint (Bitflag)

Variant Value Doc
Join 1 b_channel_join_*
Modify 2 i_channel_modify_power
ForceDelete 4 b_channel_delete_flag_force
Delete 8 b_channel_delete_*
Subscribe 16 i_channel_subscribe_power
ViewDescription 32 i_channel_description_view_power
FileUpload 64 i_ft_file_upload_power
FileDownload 128 i_ft_needed_file_download_power
FileDelete 256 i_ft_file_delete_power
FileRename 512 i_ft_file_rename_power
FileBrowse 1024 i_ft_file_browse_power
FileDirectoryCreate 2048 i_ft_directory_create_power
ModifyPermissions 4096 i_channel_permission_modify_power

ClientPermissionHint (Bitflag)

Variant Value Doc
KickServer 1 i_client_kick_from_server_power
KickChannel 2 i_client_kick_from_channel_power
Ban 4 i_client_ban_power
MoveClient 8 i_client_move_power
PrivateMessage 16 i_client_private_textmessage_power
Poke 32 i_client_poke_power
Whisper 64 i_client_whisper_power
Complain 128 i_client_complain_power
ModifyPermissions 256 i_client_permission_modify_power

7. Book (State Tracking) Definitions

The Book defines structures for keeping track of all things which happen on a server.

ServerGroup

  • Doc: Get in notifyservergrouplist
  • ID: ServerGroup.Id
Property Type Doc
Id ServerGroupId
Name str
GroupType GroupType
Icon IconId
IsPermanent bool If the group is saved to the server database
SortId i32
NamingMode GroupNamingMode
NeededModifyPower i32
NeededMemberAddPower i32
NeededMemberRemovePower i32 (optional)

ChannelGroup

  • Doc: Get in notifychannelgrouplist
  • ID: ChannelGroup.Id
Property Type Doc
Id ChannelGroupId
Name str
GroupType GroupType
Icon IconId
IsPermanent bool If the group is saved to the server database
SortId i32
NamingMode GroupNamingMode
NeededModifyPower i32
NeededMemberAddPower i32
NeededMemberRemovePower i32 (optional)

OptionalChannelData

  • Doc: Get in notifychanneledited by channelgetdescription
  • ID: Channel.Id
  • Optional: Yes
Property Type
Description str

Channel

  • Doc: Get in channellist
  • ID: Channel.Id
Property Type Doc
Id ChannelId
Guid str (optional)
Parent ChannelId 0 means root channel
Name str
Topic str (optional)
Codec Codec
CodecQuality u8 (optional)
MaxClients MaxClients (optional) The maximum number of clients in the channel.
MaxFamilyClients MaxClients (optional) Maximum number of clients in this and all child channels.
Order ChannelId The preceding channel id.
ChannelType ChannelType
IsDefault bool (optional) Whether it is the default channel
HasPassword bool (optional) Whether this channel has a password
CodecLatencyFactor i32 (optional)
IsUnencrypted bool (optional)
DeleteDelay Duration (optional)
NeededTalkPower i32 (optional)
ForcedSilence bool
PhoneticName str (optional)
Icon IconId (optional)
IsPrivate bool (optional)
StorageQuota u32 (optional)
Subscribed bool
PermissionHints ChannelPermissionHint (optional)
OptionalData OptionalChannelData (optional)

OptionalClientData

  • Doc: Get in notifyclientupdated by clientgetvariables
  • ID: Client.Id
  • Optional: Yes
Property Type
Version str
VersionSign str
Platform str
LoginName str
Created DateTime
LastConnected DateTime
ConnectionsTotal u32
BytesUploadedMonth u64
BytesDownloadedMonth u64
BytesUploadedTotal u64
BytesDownloadedTotal u64

ConnectionClientData

  • Doc: Get in notifyconnectioninfo by getconnectioninfo
  • ID: Client.Id
  • Optional: Yes
Property Type Doc
Ping Duration (optional)
PingDeviation Duration (optional)
ConnectedTime Duration (optional)
ClientAddress SocketAddr (optional) Only available if we have the permission to view it
PacketsSentSpeech u64 (optional)
PacketsSentKeepalive u64 (optional)
PacketsSentControl u64 (optional)
BytesSentSpeech u64 (optional)
BytesSentKeepalive u64 (optional)
BytesSentControl u64 (optional)
PacketsReceivedSpeech u64 (optional)
PacketsReceivedKeepalive u64 (optional)
PacketsReceivedControl u64 (optional)
BytesReceivedSpeech u64 (optional)
BytesReceivedKeepalive u64 (optional)
BytesReceivedControl u64 (optional)
ServerToClientPacketlossSpeech f32 (optional)
ServerToClientPacketlossKeepalive f32 (optional)
ServerToClientPacketlossControl f32 (optional)
ServerToClientPacketlossTotal f32 (optional)
ClientToServerPacketlossSpeech f32
ClientToServerPacketlossKeepalive f32
ClientToServerPacketlossControl f32
ClientToServerPacketlossTotal f32
BandwidthSentLastSecondSpeech u64 (optional)
BandwidthSentLastSecondKeepalive u64 (optional)
BandwidthSentLastSecondControl u64 (optional)
BandwidthSentLastMinuteSpeech u64 (optional)
BandwidthSentLastMinuteKeepalive u64 (optional)
BandwidthSentLastMinuteControl u64 (optional)
BandwidthReceivedLastSecondSpeech u64 (optional)
BandwidthReceivedLastSecondKeepalive u64 (optional)
BandwidthReceivedLastSecondControl u64 (optional)
BandwidthReceivedLastMinuteSpeech u64 (optional)
BandwidthReceivedLastMinuteKeepalive u64 (optional)
BandwidthReceivedLastMinuteControl u64 (optional)
FiletransferBandwidthSent u64 (optional)
FiletransferBandwidthReceived u64 (optional)
IdleTime Duration

Client

  • Doc: Get in notifycliententerview
  • ID: Client.Id
Property Type Doc
Id ClientId
Channel ChannelId
Uid Uid (optional) Unique Identifier
Name str
InputMuted bool true if muted, false otherwise
OutputMuted bool true if muted, false otherwise
OutputOnlyMuted bool true if muted, false otherwise
InputHardwareEnabled bool true if enabled, false if disabled
OutputHardwareEnabled bool true if enabled, false if disabled
TalkPowerGranted bool If the client is granted talk power
Metadata str Set by client
IsRecording bool Whether the client is recording
DatabaseId ClientDbId
ChannelGroup ChannelGroupId
ServerGroups ServerGroupId (set)
AwayMessage str (optional) Contains the away message if the client is away
ClientType ClientType If this client is a server query or not
AvatarHash str MD5 hash of the avatar, used to retrieve the avatar
TalkPower i32
TalkPowerRequest TalkPowerRequest (optional) Contains a message and timestamp from the client if he requests talk power
Description str
IsPrioritySpeaker bool
UnreadMessages u32
PhoneticName str
NeededServerqueryViewPower i32
Icon IconId
IsChannelCommander bool
CountryCode str Like US, DE
InheritedChannelGroupFromChannel ChannelId
Badges str
UserTag str (optional)
PermissionHints ClientPermissionHint (optional)
OptionalData OptionalClientData (optional)
ConnectionData ConnectionClientData (optional)

OptionalServerData

  • Doc: Get by notifyserverupdated after requested by servergetvariables
  • Optional: Yes
Property Type Doc
Uptime Duration
HasPassword bool
DefaultChannelAdminGroup ChannelGroupId The channel group which will be given to channel creators
MaxDownloadBandwidthTotal u64
MaxUploadBandwidthTotal u64
ComplainAutobanCount u32
ComplainAutobanTime Duration
ComplainRemoveTime Duration
MinClientsInChannelBeforeForcedSilence u32 How many clients can be in a server before silence is forced
AntifloodPointsTickReduce u32
AntifloodPointsToCommandBlock u32
AntifloodPointsToIpBlock u32
AntifloodPointsToPluginBlock u32
ConnectionCountTotal u64 The amount of connections on this server.
ChannelCount u64 The amount of channels on the server
ClientCount u16 The amount of clients which are online on the server
QueryCountTotal u64 Amount of server queries connected to the server
QueryCount u32 Amount of server queries connected and online/visible on the server
DownloadQuota u64
UploadQuota u64
BytesDownloadedMonth u64
BytesUploadedMonth u64
BytesDownloadedTotal u64
BytesUploadedTotal u64
Port u16
Autostart bool
MachineId str
NeededIdentitySecurityLevel u8
LogClient bool
LogQuery bool
LogChannel bool
LogPermissions bool
LogServer bool
LogFiletransfer bool
MinClientVersion DateTime
ReservedSlots u16
TotalPacketlossSpeech f32
TotalPacketlossKeepalive f32
TotalPacketlossControl f32
TotalPacketloss f32
TotalPing Duration
WeblistEnabled bool
MinAndroidVersion DateTime
MinIosVersion DateTime

ConnectionServerData

  • Doc: Get by notifyserverconnectioninfo after serverrequestconnectioninfo
  • Optional: Yes
Property Type
FiletransferBandwidthSent u64
FiletransferBandwidthReceived u64
FiletransferBytesSentTotal u64
FiletransferBytesReceivedTotal u64
PacketsSentTotal u64
BytesSentTotal u64
PacketsReceivedTotal u64
BytesReceivedTotal u64
BandwidthSentLastSecondTotal u64
BandwidthSentLastMinuteTotal u64
BandwidthReceivedLastSecondTotal u64
BandwidthReceivedLastMinuteTotal u64
ConnectedTimeTotal Duration
PacketlossTotal f32
Ping Duration

Server

  • Doc: Get in initserver
Property Type Doc
PublicKey EccKeyPubP256
Id u64 The virtual server id
Name str
Nickname str (optional)
WelcomeMessage str Welcome message when connecting to a server
Platform str
Version str
MaxClients u16 The maximum number of clients on the server
Created DateTime Seems to be always 0
CodecEncryptionMode CodecEncryptionMode
Hostmessage str
HostmessageMode HostMessageMode
DefaultServerGroup ServerGroupId
DefaultChannelGroup ChannelGroupId
HostbannerUrl str
HostbannerGfxUrl str
HostbannerGfxInterval Duration How often the hostbanner should be updated
PrioritySpeakerDimmModificator f32
HostbuttonTooltip str
HostbuttonUrl str
HostbuttonGfxUrl str
PhoneticName str
Icon IconId Should be an u32, sometimes the server sends an u64 or an i32 for reasons which has to be cut to 32 bit
Ips IpAddr (array) A list of listen ips, can be empty
AskForPrivilegekey bool
HostbannerMode HostBannerMode
TempChannelDefaultDeleteDelay Duration
ProtocolVersion u16
License LicenseType
AdministrativeDomain str (optional)
OptionalData OptionalServerData (optional)
ConnectionData ConnectionServerData (optional)

Connection

  • Doc: A connection from our client to a server
Property Type Doc
OwnClient ClientId The id of our own client on the server
Server Server The server of this connection
Clients Client (map, key=ClientId) All clients which are visible for us
Channels Channel (map, key=ChannelId) All channels on the server
ServerGroups ServerGroup (map, key=ServerGroupId) All server groups on the server
ChannelGroups ChannelGroup (map, key=ChannelGroupId) All channel groups on the server

8. Packet Definitions

Formal packet structure definitions from Packets.txt:

Header

Packet
    Header
        mac [u8; 8]          // EAX Message Authentication Code
        p_id u16             // Packet id
        ?c_id u16            // Client id (only from_client)
        flags -              // 0x80 Unencrypted, 0x40 Compressed, 0x20 Newprotocol, 0x10 Fragmented
        p_type u8            // Packet type (lower nibble) + flags (upper nibble)

Packet Types

  • 0x0 Voice
  • 0x1 Voice whisper
  • 0x2 Command
  • 0x3 Command low
  • 0x4 Ping
  • 0x5 Pong
  • 0x6 Ack
  • 0x7 Ack low
  • 0x8 Init

C2SInit

C2SInit
    Init0
        version u32          // Teamspeak version as timestamp
        - u8 0               // Init packet step number
        timestamp u32        // Current timestamp
        random0 [u8; 4]
        - [u8; 8] [0; 8]    // Reserved

    Init2
        version u32
        - u8 2
        random1 [u8; 16]
        random0_r [u8; 4]

    Init4
        version u32
        - u8 4
        x [u8; 64]
        n [u8; 64]
        level u32
        random2 [u8; 100]
        y [u8; 64]           // y = x ^ (2 ^ level) % n
        command Command      // Must be "clientinitiv" with alpha and omega args

S2CInit

S2CInit
    Init1
        - u8 1
        random1 [u8; 16]
        random0_r [u8; 4]    // Reversed random0

    Init3
        - u8 3
        x [u8; 64]
        n [u8; 64]
        level u32
        random2 [u8; 100]

    Init127
        - u8 127
        - u8 0

Voice Packets

VoiceC2S
    id u16
    codec_type u8
    voice_data Vec<u8>

VoiceS2C
    id u16
    from_id u16              // The id of the talking client
    codec_type u8
    voice_data Vec<u8>

VoiceWhisper Packets

VoiceWhisperC2S (legacy, !newprotocol)
    id u16
    codec_type u8
    channel_count u8
    client_count u8
    data Vec<u8>             // [u64; channel_count], [u16; client_count], voice_data

VoiceWhisperNewC2S (newprotocol)
    id u16
    codec_type u8
    whisper_type u8
    whisper_target u8
    target_id u64            // The targeted channel or group id (or 0 if not applicable)
    voice_data Vec<u8>

VoiceWhisperS2C
    id u16
    from_id u16              // The id of the talking client
    codec_type u8
    voice_data Vec<u8>

Command/Ack Packets

Command Command              // PacketType::Command
CommandLow Command           // PacketType::CommandLow
Ping                         // PacketType::Ping (empty)
Pong u16                     // PacketType::Pong (acknowledged packet id)
Ack u16                      // PacketType::Ack (acknowledged packet id)
AckLow u16                   // PacketType::AckLow (acknowledged packet id)

9. tsdeclarations README

This repository contains all kind of data which is related to TeamSpeak. This data is used for code generation in various projects, therefore all the data is machine readable.

Files:

  • Errors.csv: The error codes of TeamSpeak
  • Permissions.csv: The permissions in TeamSpeak
  • Messages.toml: Commands, sent over TeamSpeak connections
  • Book.toml: Declarations for keeping track of all things which happen on a server
  • Enums.toml: Various enums used in commands
  • MessagesToBook.toml: Mappings from commands to book structs that allow to automatically update the tracked state
  • BookToMessages.toml: Functions that can be called on book structs and generate commands
  • Versions.csv: A bunch of client versions where the versionHash is known
  • Badges.csv: List of known badges
  • ts3protocol.md: The low level TeamSpeak protocol description

License: Apache License, Version 2.0 OR MIT license


10. tsclientlib Architecture & API

TsClientlib is a library that enables you to write voip clients and bots using the TeamSpeak protocol.

Dependencies

  • Rust (preferred installation method is rustup)
  • OpenSSL 1.1 (linux only)

Getting Started

An example of a simple chat bot can be found at https://github.com/ReSpeak/SimpleBot

Clone

This repository embeds the declarations as submodule:

git clone https://github.com/ReSpeak/tsclientlib.git --recurse-submodules

Build and run examples

cd tsclientlib
cargo run --example simple
cd tsclientlib
cargo run --example audio

Projects

  • tsclientlib: The main product — a simple to use TeamSpeak library
  • tsproto: The low level library that does the network part

Utils

  • ts-bookkeeping: Keeps book of the currently connected clients and channels of a server
  • tsproto-packets: Parse packets and commands
  • tsproto-structs: Contains parsed versions of the tsdeclarations
  • tsproto-types: Contains basic types for TeamSpeak, e.g. versions and error codes

How this works

tsproto implements the basic TeamSpeak protocol stuff — creating a connection, making sure that UDP packets are delivered, encrypting and compressing the communication and giving access to all these low-level things.

The convenient client library on top is tsclientlib. It uses all the versions, messages, structures and errors which are written down in a machine readable format and provides a nice and safe API.

Performance

On an i7-5280K with 6 cores/12 threads @3.6 GHz (single thread):

  • 199 ms for creating one connection (6.5 connections/sec) — bottleneck is RSA puzzle solving
  • 189 µs for sending a message (5300 messages/sec)

License

Apache License, Version 2.0 OR MIT license


Compiled from ReSpeak repositories on 2026-06-11. Source: https://github.com/ReSpeak/tsdeclarations, https://github.com/ReSpeak/tsclientlib