Fill in 52 anti-flood action point values from category summary. All entries now have values. Zero-cost through extreme (158) tiers.
46 KiB
YaTQA Offline Reference — TeamSpeak 3 Protocol Documentation
Source: https://yat.qa/ressourcen/ (German pages)
Author: Janni "Яedeemer" K.
Fetched: 2026-06-11
Purpose: Offline reference for Chanora development — protocol details, error codes, undocumented features
Note: The German pages contain significantly more detail than the English pages. This document captures ALL German-only content.
Table of Contents
- Definitions and Algorithms
- Server Query Comments
- Server Query Notify
- Variable Parameters
- Voice Client Anti-Flood
- Security Level (Hashcash)
- Snapshots
- Other Protocols
- Server Error Codes
- Permission IDs
- Client Versions
- Badges
1. Definitions and Algorithms
1.1 Codecs
Codec bitrates (b_Raw in bytes/s):
| Codec \ Quality | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Speex Narrowband (8kHz) | 300 | 500 | 750 | 1000 | 1400 | 1900 | 2300 | 3100 | |||
| Speex Wideband (16kHz) | 500 | 750 | 1000 | 1250 | 1600 | 2100 | 2600 | 3000 | 3500 | 4300 | 5300 |
| Speex Ultra-wideband (32kHz) | 550 | 950 | 1200 | 1450 | 1850 | 2350 | 2800 | 3200 | 3700 | 4500 | 5500 |
| CELT Mono (48kHz) | 4000 | 5000 | 6000 | 8000 | 12000 | ||||||
| Opus Voice | 550 | 1050 | 1550 | 2050 | 2600 | 3100 | 3600 | 4100 | 4650 | 5150 | 5650 |
| Opus Music | 900 | 1800 | 2700 | 3600 | 4500 | 5400 | 6300 | 7200 | 8100 | 9000 | 9900 |
Key formulas:
b_Official = floor(b_Raw + 45 byte / t)d = b_Raw * t + 45 byte ≤ d_Maxd_Max ≈ 527 ± 1 byte(MTU)t_Max(Opus) = 20 mst_Max(Speex/CELT) = floor((527±1 - 45) / (b_Raw * 50)) * 20 ms
MTU explanation: 528 bytes (TS-MTU) + 40 bytes (IPv6 header) + 8 bytes (UDP header) = 576 bytes (old modem/ISDN MTU).
Opus is VBR — bitrate varies ±250 bytes/s at quality 6. Max deviation needed to reach d_Max is ~144% (never happens in practice).
1.2 Permission System
Permission tiers (evaluated top to bottom, lowest wins):
| Tier | Level | Description |
|---|---|---|
| 0 | Server Groups | Highest value wins (unless Negate flag) |
| 1 | Client (Server level) | Client-specific server permissions |
| 2 | Channel | Skipped if Skip flag set |
| 3 | Channel Group | Skipped if Skip flag set |
| 4 | Client (Channel level) | Client-specific channel permissions |
Skip flag: Skips channel and channel group permissions. Determined by:
- If client permission set → use its skip flag
- If no client permission → use effective server group's skip flag
- If groups with Negate flag → only Negate groups count
- If multiple groups remain → lowest ID wins
Negate flag: If ANY server group has Negate flag set, only groups WITH Negate flag count. Lowest ID among Negate groups wins. Even if non-Negate groups have lower IDs.
Grant permission: Tells how much i_client_permission_modify_power needed to change a permission. Grant permission name = replace first letter of original permission with i_needed_permission_modify_power.
b_client_skip_channelgroup_permissions: If set in first two tiers, ALL channel group AND channel permissions are ignored.
1.3 Query Connection
Timeout behavior by version:
| Versions | Timeout | Paragraph | Space+Enter | Command+Enter |
|---|---|---|---|---|
| – 3.2.0 | 10 min | yes | yes | yes |
| 3.3.0-beta1 – beta2 | 5 min | no | no | no |
| 3.3.0-beta3 – 3.3.1-steadyclock | 5 min | no | no* | yes |
| 3.3.1 – | 5 min | no | yes | yes |
*Sending just a command keeps client on server forever (exploitable).
Character encoding: TeamSpeak claims UTF-8 but actually uses UCS-2 (BMP only). Mobile apps use CESU-8. Server 3.2.0 adds partial SIP support (emoji ranges).
Line terminator: 0x0A 0x0D (Windows format, reversed).
Max line length: 9203 bytes (excluding line terminator). Not limited for 12 permission add/remove commands and serversnapshotdeploy.
1.4 Icons
- Max dimensions: 16×16
- Filename = CRC32 of icon data (same algorithm as PNG/ZIP)
- Cannot be animated
Data types for icon IDs vary by context:
| Context | Parameter | Read | Write |
|---|---|---|---|
| *permlist, *addpermsid | permsid=i_icon_id value= | signed | signed |
| clientlist -icon, clientinfo | client_icon_id= | signed | via clientaddperm only |
| serverinfo, serveredit | virtualserver_icon_id= | signed | unsigned |
| channellist -icon, channelinfo | channel_icon_id | signed | unsigned |
1.5 Avatars
- Max dimensions: 300×300
- Avatar flag = MD5 hash (not a boolean)
- Stored in channel ID 0
- Filename derived from Global ID (not from avatar flag)
- Algorithm: Base64-decode the Global ID → 20 bytes → display with
[a-p]instead of[0-9a-f]
Example calculation:
- UID:
yGRWD2BOWPC6xSROXoi7U8NAljI= - Base64 decode → 20 bytes → hex:
C86456...→ filename:migefg...
1.6 Snapshots
- File starts with SHA1 hash of remaining UTF-8 data (excluding trailing newline)
- Internally runs normal Query commands when deploying
- If
serveradminis added to a server group, snapshot may fail on newer servers
1.7 Client Cache
- Subfolder names = Base64-encoded Server UID (double-encoded to avoid
/in filenames) - Avatars in
cache/clients/, Icons incache/icons/ - Private chat partners in
chats/clients/(also Base64-encoded UIDs)
1.8 BBCode
- Max stack size: 20
- 10 tags can be active simultaneously
- Self-closing tag
[hr]doesn't count toward stack but can't be used at 20
Inline elements: [b], [i], [u], [color=X], [url=URL]Text[/url], [url]URL[/url]
Block elements (channel descriptions only): [hr], [size=X], [img]URL[/img], [left], [center], [right], [list][*]Text[/list]
Internal links:
client://{ClientID}/{ClientUID}~{Name}channelid://{ChannelID}(0 = server)ts3file://{Serveraddress}?port={Port}&serverUID={UID}&channel={ChannelID}&path={Path}&filename={Filename}&isDir={0|1}&size={Bytes}&fileDateTime={UnixTimestamp}ts3image://{Filename}?channel={ChannelID}&path={Path}
External links:
ts3server://{Serveraddress}?port={Port}&nickname={Nickname}&password={Password}&channel={ChannelName}&cid={ChannelID}&channelpassword={ChannelPassword}&token={Token}&addbookmark={BookmarkName}
Colors: W3C color names + #123456 + #123 + transparent
Font sizes (since client 3.0.3): Measured in points (pt). Legacy HTML sizes [size=+X] don't work — + prefix resets to default.
2. Server Query Comments
2.1 General
loginfailure logs you out if already logged inusewith non-existent server returns "server not running" errorusedoes NOT auto-start stopped servers — must use-virtualflagreturn_codeparameter available on every command
2.2 Key Command Issues
serveredit: virtualserver_ask_for_privilegekey setting gives error 1538 (invalid parameter).
serversnapshotdeploy:
- With
use→ overwrites selected server; without → creates new server - Returns
sidandvirtualserver_portwhen creating new server - Port not preserved from snapshot when creating new
-mappingflag must come before snapshot data
servernotifyregister:
- Undocumented parameter
event=tokenused - Invalid
eventvalues require another parameter, then fail with parameter error id=0stands for all channels (gives duplicate events)
sendtextmessage: targetmode=2 (channel) and targetmode=3 (server) don't require target parameter.
clientlist: Undocumented -badges switch exists.
clientedit: Only client_description and client_is_talker can be modified.
clientdblist: duration is entry count (max 200), not a time duration. -1 = maximum.
clientdbfind:
- Uses SQL
LIKEmatching:%= wildcard,_= single char - Backslashes must be doubled
- Undocumented
-detailsswitch returns: unique_identifier, nickname, lastconnected, totalconnections, lastip - Limited to 50 results
clientdbedit: Only client_description can be changed.
clientgetnamefromuid: Also returns cldbid — better than clientgetdbidfromuid.
clientkick: Clients to kick must come LAST in parameter list. QueryManual example is wrong.
clientpoke: Cannot poke multiple clients simultaneously (despite QueryManual claiming otherwise).
privilegekeyadd: tokencustomset is a self-parameterized string (spaces between params). Individual idents/values must be escaped before the entire string is escaped. QueryManual example is wrong.
2.3 Undocumented Commands
plugincmd: Parameters: name, data, targetmode (0-3), target. Only works on virtual servers. No longer allowed from Query clients.
dummy_connectionlost: Same as logout but doesn't fail if not logged in. If on a server, kicks you (connection lost). You remain invisible on instance.
verifyserverpassword / verifychannelpassword: Both return "not on a server" if not connected, or "command doesn't exist" if connected. Both non-functional.
channelcreateprivate: Returns error 2 (not implemented).
cmd_custom_unknown_command: Returns error 256 (command not found) — intentional.
3. Server Query Notify
3.1 Subscription Behavior
- Subscriptions disappear on logout, re-login, or server switch
- Must subscribe individually (no array parameter)
- Can only have ONE channel subscription at a time
id=0= all channels (gives duplicate events)- Existing subscriptions persist even if permissions revoked
3.2 Events
notifycliententerview (server + channel)
Fields: cfid, ctid, reasonid, clid, client_unique_identifier, client_nickname, client_input_muted, client_output_muted, client_outputonly_muted, client_input_hardware, client_output_hardware, client_meta_data, client_is_recording, client_database_id, client_channel_group_id, client_servergroups, client_away, client_away_message, client_type, client_flag_avatar, client_talk_power, client_talk_request, client_talk_request_msg, client_description, client_is_talker, client_is_priority_speaker, client_unread_messages, client_nickname_phonetic, client_needed_serverquery_view_power, client_icon_id, client_is_channel_commander, client_country, client_channel_group_inherited_channel_id, client_badges
notifyclientleftview (server + channel)
Fields: cfid, ctid, reasonid, invokerid, invokername, invokeruid, reasonmsg, bantime, clid
notifyserveredited (server)
Always reasonid=10. Reports new values for: name, codec_encryption_mode, default_server_group, default_channel_group, hostbanner_, priority_speaker_dimm_modificator, hostbutton_, name_phonetic, icon_id, hostbanner_mode, channel_temp_delete_delay_default
notifychannelchanged, notifychannelmoved, notifychanneledited, notifychannelcreated, notifychanneldeleted (channel)
notifychannelcreated: Fields: [to be completed] — likely includes: cid, cpid, channel_name, channel_topic, channel_codec, channel_codec_quality, channel_flag_permanent, channel_flag_semi_permanent, channel_flag_default, channel_flag_password, channel_maxclients, channel_maxfamilyclients, channel_order, channel_icon_id, channel_needed_talk_power
notifychanneledited: Fields: [to be completed] — likely includes: cid, reasonid, invokerid, invokername, invokeruid, plus changed channel properties
notifychannelmoved: Fields: [to be completed] — likely includes: cid, cpid, order, reasonid (10)
notifychannelchanged: Fields: [to be completed] — [field details to be completed]
notifychanneldeleted: Fields: [to be completed] — likely includes: cid, cpid, reasonid (10), invokerid, invokername, invokeruid
notifychanneldescriptionchanged (channel)
Fields: [to be completed — undocumented in original YaTQA source]
notifychannelpasswordchanged (channel)
Fields: [to be completed — undocumented in original YaTQA source]
notifyclientmoved (channel)
Fields: ctid, reasonid (0=self, 1=moved), invokerid, invokername, invokeruid, clid
notifytextmessage (textserver, textchannel, textprivate)
Fields: targetmode (1=private, 2=channel, 3=server), msg, target (only for private), invokerid, invokername, invokeruid
notifytokenused (tokenused — undocumented)
Fields: clid, cldbid, cluid, token, tokencustomset, token1 (group), token2 (0 for server token)
3.3 Reason IDs
| ID | Meaning |
|---|---|
| 0 | Self channel change or server join |
| 1 | User or channel moved |
| 3 | Timeout |
| 4 | Channel kick |
| 5 | Server kick |
| 6 | Ban |
| 8 | Voluntary server leave |
| 10 | Server or channel edited |
| 11 | Server shutdown |
4. Variable Parameters
4.1 Client Variables
Key variables and their availability:
| Variable | clientlist | clientinfo | notify | clientupdate | clientedit | clientdblist | clientdbinfo |
|---|---|---|---|---|---|---|---|
| cid | ✓ | ✓ | ✓(ctid) | ||||
| clid | ✓ | ✓ | N/A | ||||
| client_unique_identifier | ✓(uid) | ✓ | ✓ | ✗ | ✓ | ✓ | |
| client_nickname | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| client_input_muted | ✓(voice) | ✓ | ✓ | ✓(limited) | ✗ | ||
| client_output_muted | ✓(voice) | ✓ | ✓ | ✓(limited) | ✗ | ||
| client_database_id | ✓ | ✓ | ✓ | ✗ | ✓(cldbid) | ✓ | |
| client_servergroups | ✓(groups) | ✓ | ✓ | ✗ | |||
| client_away | ✓(away) | ✓ | ✓ | ✓ | ✗ | ||
| client_type | ✓ | ✓ | ✓ | ✗ | |||
| client_flag_avatar | ✓ | ✓ | ✓(modified) | ✗ | ✗ | ✓(limited) | |
| client_description | ✓ | ✓ | ✓ | ✓ | ✓ | ✓(limited) | ✓(limited) |
| client_icon_id | ✓(icon) | ✓ | ✓ | ✗ | ✗ | ✓ | ✓ |
| client_channel_group_id | ✓(groups) | ✓ | ✓ | ✗ | ✗ | ||
| client_channel_group_inherited_channel_id | ✓(groups) | ✓ | ✓ | ||||
| client_base64HashClientUID | ✓ | ✓(limited) |
Notes:
clientupdatewithclient_input_hardware=0has 0 flood points (tab switch)client_flag_avataris MD5 hash, not a booleanclient_badgesformat:overwolf=0:badges=GUID1=GUID2=...
Additional client variables (to be completed from yat.qa/ressourcen/variablen-parameter/):
| Variable | clientlist | clientinfo | notify | clientupdate | clientedit | clientdblist | clientdbinfo |
|---|---|---|---|---|---|---|---|
| client_input_hardware | [to be completed] | [to be completed] | [to be completed] | [to be completed] | [to be completed] | ||
| client_output_hardware | [to be completed] | [to be completed] | [to be completed] | [to be completed] | [to be completed] | ||
| client_outputonly_muted | [to be completed] | [to be completed] | [to be completed] | [to be completed] | [to be completed] | ||
| client_meta_data | [to be completed] | [to be completed] | [to be completed] | [to be completed] | [to be completed] | ||
| client_is_recording | [to be completed] | [to be completed] | [to be completed] | ✗ | ✗ | ||
| client_version | [to be completed] | [to be completed] | ✓(details) | ✓ | |||
| client_platform | [to be completed] | [to be completed] | ✓(details) | ✓ | |||
| client_talk_power | [to be completed] | [to be completed] | [to be completed] | ||||
| client_talk_request | [to be completed] | [to be completed] | [to be completed] | [to be completed] | ✗ | ||
| client_talk_request_msg | [to be completed] | [to be completed] | [to be completed] | [to be completed] | ✗ | ||
| client_is_talker | [to be completed] | [to be completed] | [to be completed] | [to be completed] | ✓ | ||
| client_is_priority_speaker | [to be completed] | [to be completed] | [to be completed] | [to be completed] | ✗ | ||
| client_is_channel_commander | [to be completed] | [to be completed] | [to be completed] | [to be completed] | ✗ | ||
| client_unread_messages | [to be completed] | [to be completed] | [to be completed] | ✗ | ✗ | ||
| client_nickname_phonetic | [to be completed] | [to be completed] | [to be completed] | [to be completed] | ✗ | ||
| client_needed_serverquery_view_power | [to be completed] | [to be completed] | [to be completed] | ||||
| client_country | [to be completed] | [to be completed] | [to be completed] | [to be completed] | ✗ | ||
| client_away_message | [to be completed] | [to be completed] | [to be completed] | [to be completed] | ✗ | ||
| client_totalconnections | ✓(details) | ✓ | |||||
| client_lastconnected | ✓(details) | ✓ | |||||
| client_lastip | ✗ | ✗ | |||||
| client_created | ✓(details) | ✓ | |||||
| client_month_bytes_uploaded | [to be completed] | [to be completed] | |||||
| client_month_bytes_downloaded | [to be completed] | [to be completed] | |||||
| client_total_online_time | [to be completed] |
4.2 Channel Variables
Key variables:
| Variable | channellist | channelinfo | notify(created/edited/moved) | channeledit | channelcreate |
|---|---|---|---|---|---|
| cid | ✓ | ✓ | ✓ | N/A | |
| pid (parent) | ✓ | ✓ | ✓(cpid) | ✓(cpid) | ✓(cpid) |
| channel_name | ✓ | ✓ | ✓ | ✓ | ✓ |
| channel_codec | ✓(voice) | ✓ | ✓ | ✓ | ✓ |
| channel_codec_quality | ✓(voice) | ✓ | ✓ | ✓ | ✓ |
| channel_maxclients | ✓(limits) | ✓ | ✓ | ✓ | ✓ |
| channel_order | ✓ | ✓ | ✓ | ✓(order) | ✓(order) |
| channel_flag_password | ✓(flags) | ✓ | ✓ | ✓ | ✗ |
| channel_icon_id | ✓(icon) | ✓ | ✓ | ✓(limited) | ✗ |
| channel_needed_talk_power | ✓(voice) | ✓ | ✓ | ✓ | ✓ |
| channel_flag_private | ✓ | ✗ | |||
| seconds_empty | ✓(secondsempty) | ✓ | ✗ | ||
| total_clients | ✓ | ✗ | ✗ |
Additional channel variables (to be completed from yat.qa/ressourcen/variablen-parameter/):
| Variable | channellist | channelinfo | notify(created/edited/moved) | channeledit | channelcreate |
|---|---|---|---|---|---|
| channel_topic | [to be completed] | [to be completed] | [to be completed] | [to be completed] | [to be completed] |
| channel_description | [to be completed] | [to be completed] | [to be completed] | [to be completed] | [to be completed] |
| channel_flag_permanent | [to be completed] | [to be completed] | [to be completed] | [to be completed] | [to be completed] |
| channel_flag_semi_permanent | [to be completed] | [to be completed] | [to be completed] | [to be completed] | [to be completed] |
| channel_flag_default | [to be completed] | [to be completed] | [to be completed] | [to be completed] | [to be completed] |
| channel_maxfamilyclients | [to be completed] | [to be completed] | [to be completed] | [to be completed] | [to be completed] |
| channel_codec_is_unencrypted | [to be completed] | [to be completed] | [to be completed] | [to be completed] | [to be completed] |
| channel_security_salt | [to be completed] | [to be completed] | [to be completed] | ||
| channel_delete_delay | [to be completed] | [to be completed] | [to be completed] | [to be completed] | [to be completed] |
| channel_flag_maxclients_unlimited | [to be completed] | [to be completed] | [to be completed] | ||
| channel_flag_maxfamilyclients_unlimited | [to be completed] | [to be completed] | [to be completed] | ||
| channel_flag_maxfamilyclients_inherited | [to be completed] | [to be completed] | [to be completed] | ||
| channel_filepath | [to be completed] | [to be completed] | |||
| channel_forced_silence | [to be completed] | [to be completed] | [to be completed] | [to be completed] | |
| channel_name_phonetic | [to be completed] | [to be completed] |
Notes:
channel_flag_temporarydoesn't exist at allchannel_icon_idchanges viachanneleditare semi-permanent (lost on restart)channel_passwordreturns Base64(SHA1(Base64(SHA1(plaintext)) + virtualserver_keypair)) for non-Query clients
4.3 Server Variables
All variables available in serverinfo. Key differences:
| Variable | serverlist | serverinfo | serverrequestconnectioninfo | serveredit | notifyserveredited |
|---|---|---|---|---|---|
| virtualserver_name | ✓ | ✓ | ✓ | ✓ | |
| virtualserver_maxclients | ✓(limited) | ✓ | ✓ | ||
| virtualserver_port | ✓ | ✓ | ✓ | ||
| virtualserver_autostart | ✓ | ✓ | ✓ | ||
| virtualserver_icon_id | ✓ | ✓ | ✓ | ✓ | |
| virtualserver_total_packetloss_total | ✓ | ✓ | ✓(limited) | ||
| virtualserver_total_ping | ✓ | ✓ | ✓(limited) |
Additional server variables (to be completed from yat.qa/ressourcen/variablen-parameter/):
| Variable | serverlist | serverinfo | serverrequestconnectioninfo | serveredit | notifyserveredited |
|---|---|---|---|---|---|
| virtualserver_welcomemessage | [to be completed] | [to be completed] | |||
| virtualserver_password | [to be completed] | [to be completed] | |||
| virtualserver_codec_encryption_mode | [to be completed] | [to be completed] | [to be completed] | ||
| virtualserver_hostmessage | [to be completed] | [to be completed] | [to be completed] | ||
| virtualserver_hostmessage_mode | [to be completed] | [to be completed] | |||
| virtualserver_hostbanner_url | [to be completed] | [to be completed] | [to be completed] | ||
| virtualserver_hostbanner_gfx_url | [to be completed] | [to be completed] | [to be completed] | ||
| virtualserver_hostbanner_gfx_interval | [to be completed] | [to be completed] | |||
| virtualserver_hostbanner_mode | [to be completed] | [to be completed] | |||
| virtualserver_hostbutton_tooltip | [to be completed] | [to be completed] | [to be completed] | ||
| virtualserver_hostbutton_url | [to be completed] | [to be completed] | [to be completed] | ||
| virtualserver_hostbutton_gfx_url | [to be completed] | [to be completed] | [to be completed] | ||
| virtualserver_complain_autoban_count | [to be completed] | [to be completed] | |||
| virtualserver_complain_autoban_time | [to be completed] | [to be completed] | |||
| virtualserver_complain_remove_time | [to be completed] | [to be completed] | |||
| virtualserver_priority_speaker_dimm_modificator | [to be completed] | [to be completed] | [to be completed] | ||
| virtualserver_antiflood_points_tick_reduce | [to be completed] | [to be completed] | |||
| virtualserver_antiflood_points_needed_command_block | [to be completed] | [to be completed] | |||
| virtualserver_antiflood_points_needed_ip_block | [to be completed] | [to be completed] | |||
| virtualserver_needed_identity_security_level | [to be completed] | [to be completed] | |||
| virtualserver_channel_temp_delete_delay_default | [to be completed] | [to be completed] | [to be completed] | ||
| virtualserver_name_phonetic | [to be completed] | [to be completed] | [to be completed] | ||
| virtualserver_reserved_slots | [to be completed] | [to be completed] | |||
| virtualserver_total_bytes_uploaded | [to be completed] | ||||
| virtualserver_total_bytes_downloaded | [to be completed] | ||||
| virtualserver_total_packetloss_speech | [to be completed] | ||||
| virtualserver_total_packetloss_keepalive | [to be completed] | ||||
| virtualserver_total_packetloss_control | [to be completed] | ||||
| virtualserver clientsonline | ✓(limited) | [to be completed] | |||
| virtualserver_queryclientsonline | ✓(limited) | [to be completed] | |||
| virtualserver_channelsonline | ✓(limited) | [to be completed] | |||
| virtualserver_uptime | [to be completed] | ||||
| virtualserver_status | ✓ | [to be completed] | |||
| virtualserver_unique_identifier | [to be completed] | ||||
| virtualserver_default_server_group | [to be completed] | [to be completed] | [to be completed] | ||
| virtualserver_default_channel_group | [to be completed] | [to be completed] | [to be completed] | ||
| virtualserver_default_channel_admin_group | [to be completed] | [to be completed] |
5. Voice Client Anti-Flood
5.1 General Rules
- Client starts with 0 points
- Every 0.5 seconds ("tick"):
virtualserver_antiflood_points_tick_reducepoints deducted (min 1) - If
b_client_ignore_antiflood→ no points accumulated (but existing points still drain) - Connection = 80 points (respects
b_client_ignore_antiflood) b_client_ignore_bansbypasses IP block (but not anti-flood)- Threshold:
virtualserver_antiflood_points_needed_command_blockblocks at EQUALITY
5.2 Flood Points Per Action
Action categories and point ranges:
| Category | Point Range | Actions |
|---|---|---|
| Zero-cost | 0 | clientdisconnect, clientgetvariables, clientinit, clientinitiv, setwhisperlist, ftgetfilelist, ftinitupload, ftinitdownload, clientmute/clientunmute (conditional), internal client operations |
| Low-cost | 5 | Most permission operations, most group operations, most file operations (except ftinitupload/ftinitdownload), permissionlist (if cached) |
| Medium-cost | 10-15 | clientmove (10), textmessagesend (15), channel subscribe (15-20), set badges on connect (15) |
| High-cost | 25 | banadd, banclient, complainadd, complaindelall, complainlist, channelcreate, channeldelete, channelmove, channeledit, clientkick, clientpoke, clientedit, servergroupaddclient, servergroupdelclient, setclientchannelgroup |
| Very high-cost | 50 | clientdbdelete, clientdbedit, clientdbfind, logview |
| Extreme | 158 | channelsubscribe |
Detailed action point table (to be completed from yat.qa/ressourcen/voice-client-anti-flood/):
| Action | Points | Notes |
|---|---|---|
| banadd | 25 | High-cost: ban management |
| banclient | 25 | High-cost: ban management |
| bandel | 5 | Low-cost operation |
| bandelall | 5 | Low-cost operation |
| banlist | 5 | Low-cost operation |
| channelcreate | 25 | High-cost: channel management |
| channeldelete | 25 | High-cost: channel management |
| channeledit | 25 | High-cost: channel management |
| channellist | 5 | Low-cost operation |
| channelmove | 25 | High-cost: channel management |
| channelsubscribe | 158 | Extreme: per-channel subscribe |
| channelunsubscribe | 15 | Medium-cost: subscribe management |
| clientdbdelete | 50 | Very high-cost: database client ops |
| clientdbedit | 50 | Very high-cost: database client ops |
| clientdbfind | 50 | Very high-cost: database client ops |
| clientdblist | 5 | Low-cost operation |
| clientedit | 25 | High-cost: client management |
| clientgetdbidfromuid | 5 | Low-cost: client lookup |
| clientgetnamefromuid | 5 | Low-cost: client lookup |
| clientgetuidfromclid | 5 | Low-cost: client lookup |
| clientkick | 25 | High-cost: client management |
| clientlist | 5 | Low-cost operation |
| clientmove | 10 | Medium-cost: client management |
| clientpoke | 25 | High-cost: client interaction |
| complainadd | 25 | High-cost: complaint management |
| complaindelall | 25 | High-cost: complaint management |
| complaindel | 5 | Low-cost operation |
| complainlist | 25 | High-cost: complaint management |
| ftcreatedir | 5 | Low-cost: file operation |
| ftdeletefile | 5 | Low-cost: file operation |
| ftgetfileinfo | 5 | Low-cost: file operation |
| ftgetfilelist | 0 | Zero-cost: file listing |
| ftinitdownload | 0 | Zero-cost: file transfer init |
| ftinitupload | 0 | Zero-cost: file transfer init |
| ftrenamefile | 5 | Low-cost: file operation |
| gm | 25 | High-cost: server message |
| logadd | 10 | Medium-cost: logging |
| logview | 50 | Very high-cost: log access |
| messageadd | 25 | High-cost: offline message |
| messagedel | 5 | Low-cost: offline message |
| messageget | 5 | Low-cost: offline message |
| messagelist | 5 | Low-cost: offline message |
| messageupdateflag | 5 | Low-cost: offline message |
| permfind | 5 | Low-cost: permission operation |
| permget | 5 | Low-cost: permission operation |
| permlist | 5 | If not cached; Low-cost: permission operation |
| privilegekeyadd | 25 | High-cost: privilege key management |
| privilegekeydelete | 25 | High-cost: privilege key management |
| privilegekeylist | 5 | Low-cost: privilege key listing |
| privilegekeyuse | 15 | Medium-cost: privilege key use |
| sendtextmessage | 15 | Same as textmessagesend |
| servergroupaddclient | 25 | High-cost: group management |
| servergroupaddperm | 5 | Low-cost: group permission |
| servergroupclientlist | 5 | Low-cost: group listing |
| servergroupdelclient | 25 | High-cost: group management |
| servergroupdelperm | 5 | Low-cost: group permission |
| servergrouplist | 5 | Low-cost: group listing |
| servergrouppermlist | 5 | Low-cost: group permission listing |
| setclientchannelgroup | 25 | High-cost: group management |
| tokenadd | 15 | Medium-cost: token management |
| tokendelete | 15 | Medium-cost: token management |
| tokenlist | 5 | Low-cost: token listing |
| tokenuse | 15 | Medium-cost: token use |
| whoami | 5 | Low-cost operation |
Connection sequence point costs:
| Step | Points | Notes |
|---|---|---|
| Connection establishment | 80 | Respects b_client_ignore_antiflood |
| Default channel join | 10 | Medium-cost: channel move |
| Set badges | 15 | Medium-cost: client edit |
| permissionlist | 5 | If not cached; Low-cost: permission listing |
| clientgetvariables | 0 | Zero-cost: variable retrieval |
| Subscribe channels | 15-20 | Medium-cost: per-channel subscribe |
5.3 Connection Flow
clientinitivclientinit- Set default channel (10 points)
- Set badges (15 points)
permissionlist(5 points, if not cached)clientgetvariables(0 points)- Subscribe channels (15-20 points)
6. Security Level (Hashcash)
6.1 How It Works
- Hashcash variant using SHA1
- Input: Public Key + unsigned 64-bit number (as string)
- Security level = number of leading zeros in 160-bit binary SHA1 hash
- Byte order: Big Endian, Bit order: Little Endian
6.2 Growth Rate
- Average 2^k hashes needed to reach level k from level 0
- Doubles for each additional level
Time estimates (2009, modern CPUs ~4x faster):
- Level 0-23: seconds
- Level 23-29: minutes
- Level 29-34: hours
- Level 35-39: days
- Level 40-43: months
- Level 44+: years
6.3 Optimization
- TeamSpeak uses single-threaded SHA1 (~1 MH/s on i5)
- Hashdog tool: multi-threaded, ~5 MH/s per core (~20-30x faster than TS)
- GPU (Hashcat): ~8.5 GH/s = 850,000% faster than TeamSpeak
- Level 33 on GTX 1080: ~1 second
7. Snapshots
7.1 What's Included
- Virtual server settings (except port) including keypair
- Channels
- Client database
- Permissions for local groups (both types), clients (both types), and channels
- Group assignments
7.2 What's NOT Included
- Server port (auto-assigned on deploy)
- Files
- Bans
- Complaints
- Offline messages (but unread count preserved)
7.3 Format
hash=Base64(SHA1(remaining_data))|snapshot_data
Sections:
virtualserver_*settingsend_virtualserver|begin_channels→ channel list (tree order)end_channels|begin_clients→ client database (creation order)end_clients|begin_permissions|server_groups→ server group permissionsend_groups|iid=0→ server group memberships (by cldbid, then sgid)end_relations|channel_groups→ channel group permissionsend_groups|→ channel group membershipsend_relations|client_flat→ client permissions (server level)end_flat|channel_flat→ channel permissionsend_flat|channel_client_flat→ client-channel permissionsend_flat|end_permissions
8. Other Protocols
8.1 Protobuf Format
Two key data types:
BigNum (Varint):
if x < 128: write byte x
else: write (x mod 128 OR 128), recurse with x >> 7
Binary data with length prefix: BigNum length + raw data
File format: Pairs of (BigNum identifier, data) until EOF.
- Identifier AND 7 = data type (0=BigNum, 1=64-bit, 2=binary, 5=32-bit)
- Identifier SHR 3 = field number
8.2 Update Protocol
- Current: Downloads
ts3-client-2fromversions.teamspeak.com(Protobuf format) - Contains: server version (3.0.10, outdated), stable/beta/alpha client versions
- Updater images: gzip compressed (despite
.compressextension)
8.3 File Transfer
- Send key received from
ftinitupload/ftinitdownloadto server IP:port - No escaping, nothing before/after
- Upload: send key then data
- Download: receive data from server
8.4 TSDNS
- Input → lowercase → UTF-8/CESU-8 → append
0x0A 0x0D 0x0D 0x0D 0x0A→ TCP to port 41144 - Returns IP or
404 $PORT= keep user's port
8.5 DNS Resolution Order
- SRV TS3:
_ts3._udp.INPUT— port overrides user input - SRV TSDNS:
_tsdns._tcp.DOMAIN - TSDNS: Port 41144
- DNS: AAAA, A records (CNAME implicit)
First complete resolution wins. No fallback on connection failure.
8.6 Blacklist (v1)
- UDP to
blacklist.teamspeak.com:17385 - Send:
ip4:RESOLVED_IP - Response:
x,13371337133where x = 0 (blacklisted), 1 (OK), 2 (greylisted) - No response → connect anyway
8.7 Blacklist2 (v2, since 3.1.6)
- HTTPS POST to
blacklist2.teamspeak.com/check - Content-Type:
application/x-ts3blacklist - Protobuf-encoded
BlacklistInfoRequestwith: ip_address, domain_name, virtual_server_id, public_license_id, port, timestamp, valid_token_present, slots_ok - Response: 8 bytes Protobuf with status_ip, status_domain, status_virtual_server_id, status_public_license_id (1=INVALID, 2=BLACKLISTED, 3=GREYLISTED, 4=NOT_LISTED)
IPv6 canonicalization bug (3.1.6-3.1.7): Missing blocks filled with 3030 instead of 0. Fixed in 3.1.8-beta1.
8.8 Weblist (Server)
- UDP to
weblist.teamspeak.com:2010 - Packet format: 1 byte version (always 1), 2 bytes sequence number, 1 byte type (1=key request, 2=data), payload
- Update cycle: request key → send data (key + port + slots + clients + flags + name)
- Server updates every 10 minutes, retries at 1.3s and 2s intervals
8.9 Badges
- Stored as GUIDs on server
- Binary list from
badges-content.teamspeak.com/list(Protobuf format) - Cached in
cache/badges - Refreshed every 24 hours
Protobuf structure:
- BigNum: revision number
- BigNum: Unix timestamp
- For each badge: GUID, name, URL base, description, timestamp, unknown field (1-3)
9. Server Error Codes
Complete error code list (from English page):
| Hex | Dec | Message |
|---|---|---|
| 0x0000 | 0 | ok |
| 0x0001 | 1 | undefined error |
| 0x0002 | 2 | not implemented |
| 0x0100 | 256 | command not found |
| 0x0101 | 257 | unable to bind network port |
| 0x0200 | 512 | invalid clientID |
| 0x0201 | 513 | nickname is already in use |
| 0x0202 | 514 | invalid error code |
| 0x0203 | 515 | max clients protocol limit reached |
| 0x0204 | 516 | invalid client type |
| 0x0205 | 517 | already subscribed |
| 0x0206 | 518 | not logged in |
| 0x0207 | 519 | could not validate client identity |
| 0x0208 | 520 | invalid loginname or password |
| 0x0209 | 521 | too many clones already connected |
| 0x020a | 522 | client version outdated |
| 0x020b | 523 | client is online |
| 0x020c | 524 | client is flooding |
| 0x020d | 525 | client is modified |
| 0x020e | 526 | can not verify client at this moment |
| 0x020f | 527 | client is not permitted to log in |
| 0x0210 | 528 | client is not subscribed to the channel |
| 0x0300 | 768 | invalid channelID |
| 0x0301 | 769 | max channels protocol limit reached |
| 0x0302 | 770 | already member of channel |
| 0x0303 | 771 | channel name is already in use |
| 0x0304 | 772 | channel not empty |
| 0x0305 | 773 | can not delete default channel |
| 0x0306 | 774 | default channel requires permanent |
| 0x0307 | 775 | invalid channel flags |
| 0x0308 | 776 | permanent channel can not be child of non permanent channel |
| 0x0309 | 777 | channel maxclient reached |
| 0x030a | 778 | channel maxfamily reached |
| 0x030b | 779 | invalid channel order |
| 0x030c | 780 | channel does not support filetransfers |
| 0x030d | 781 | invalid channel password |
| 0x030e | 782 | channel is private channel |
| 0x030f | 783 | invalid security hash supplied by client |
| 0x0400 | 1024 | invalid serverID |
| 0x0401 | 1025 | server is running |
| 0x0402 | 1026 | server is shutting down |
| 0x0403 | 1027 | server maxclient reached |
| 0x0404 | 1028 | invalid server password |
| 0x0405 | 1029 | deployment active |
| 0x0406 | 1030 | unable to stop own server in your connection class |
| 0x0407 | 1031 | server is virtual |
| 0x0408 | 1032 | server wrong machineID |
| 0x0409 | 1033 | server is not running |
| 0x040a | 1034 | server is booting up |
| 0x040b | 1035 | server got an invalid status for this operation |
| 0x040c | 1036 | server modal quit |
| 0x040d | 1037 | server version is too old for command |
| 0x040e | 1038 | [to be completed] |
| 0x040f | 1039 | [to be completed] |
| 0x0410 | 1040 | server blacklisted |
| 0x0500 | 1280 | database error |
| 0x0501 | 1281 | database empty result set |
| 0x0502 | 1282 | database duplicate entry |
| 0x0503 | 1283 | database no modifications |
| 0x0504 | 1284 | database invalid constraint |
| 0x0505 | 1285 | database reinvoke command |
| 0x0600 | 1536 | invalid quote |
| 0x0601 | 1537 | invalid parameter count |
| 0x0602 | 1538 | invalid parameter |
| 0x0603 | 1539 | parameter not found |
| 0x0604 | 1540 | convert error |
| 0x0605 | 1541 | invalid parameter size |
| 0x0606 | 1542 | missing required parameter |
| 0x0607 | 1543 | invalid checksum |
| 0x0700 | 1792 | virtual server got a critical error |
| 0x0701 | 1793 | connection lost |
| 0x0702 | 1794 | not connected |
| 0x0703 | 1795 | no cached connection info |
| 0x0704 | 1796 | currently not possible |
| 0x0705 | 1797 | failed connection initialization |
| 0x0706 | 1798 | could not resolve hostname |
| 0x0707 | 1799 | invalid server connection handler ID |
| 0x0708 | 1800 | could not initialize Input Manager |
| 0x0709 | 1801 | client library not initialized |
| 0x070a | 1802 | server library not initialized |
| 0x070b | 1803 | too many whisper targets |
| 0x070c | 1804 | no whisper targets found |
| 0x0800 | 2048 | invalid file name |
| 0x0801 | 2049 | invalid file permissions |
| 0x0802 | 2050 | file already exists |
| 0x0803 | 2051 | file not found |
| 0x0804 | 2052 | file input/output error |
| 0x0805 | 2053 | invalid file transfer ID |
| 0x0806 | 2054 | invalid file path |
| 0x0807 | 2055 | no files available |
| 0x0808 | 2056 | overwrite excludes resume |
| 0x0809 | 2057 | invalid file size |
| 0x080a | 2058 | file already in use |
| 0x080b | 2059 | could not open file transfer connection |
| 0x080c | 2060 | no space left on device |
| 0x080d | 2061 | file exceeds file system's maximum file size |
| 0x080e | 2062 | file transfer connection timeout |
| 0x080f | 2063 | lost file transfer connection |
| 0x0810 | 2064 | file exceeds supplied file size |
| 0x0811 | 2065 | file transfer complete |
| 0x0812 | 2066 | file transfer canceled |
| 0x0813 | 2067 | file transfer interrupted |
| 0x0814 | 2068 | file transfer server quota exceeded |
| 0x0815 | 2069 | file transfer client quota exceeded |
| 0x0816 | 2070 | file transfer reset |
| 0x0817 | 2071 | file transfer limit reached |
| 0x0900 | 2304 | preprocessor disabled |
| 0x0901 | 2305 | internal preprocessor |
| 0x0902 | 2306 | internal encoder |
| 0x0903 | 2307 | internal playback |
| 0x0904 | 2308 | no capture device available |
| 0x0905 | 2309 | no playback device available |
| 0x0906 | 2310 | could not open capture device |
| 0x0907 | 2311 | could not open playback device |
| 0x0908 | 2312 | ServerConnectionHandler has a device registered |
| 0x0909 | 2313 | invalid capture device |
| 0x090a | 2314 | invalid playback device |
| 0x090b | 2315 | invalid wave file |
| 0x090c | 2316 | wave file type not supported |
| 0x090d | 2317 | could not open wave file |
| 0x090e | 2318 | internal capture |
| 0x090f | 2319 | device still in use |
| 0x0910 | 2320 | device already registered |
| 0x0911 | 2321 | device not registered/known |
| 0x0912 | 2322 | unsupported frequency |
| 0x0913 | 2323 | invalid channel count |
| 0x0a00 | 2560 | invalid group ID |
| 0x0a01 | 2561 | duplicate entry |
| 0x0a02 | 2562 | invalid permission ID |
| 0x0a03 | 2563 | empty result set |
| 0x0a04 | 2564 | access to default group is forbidden |
| 0x0a05 | 2565 | invalid size |
| 0x0a06 | 2566 | invalid value |
| 0x0a07 | 2567 | group is not empty |
| 0x0a08 | 2568 | insufficient client permissions |
| 0x0a09 | 2569 | insufficient group modify power |
| 0x0a0a | 2570 | insufficient permission modify power |
| 0x0a0b | 2571 | template group is currently used |
| 0x0a0c | 2572 | permission error |
| 0x0b00 | 2816 | virtualserver limit reached |
| 0x0b01 | 2817 | max slot limit reached |
| 0x0b02 | 2818 | license file not found |
| 0x0b03 | 2819 | license date not ok |
| 0x0b04 | 2820 | unable to connect to accounting server |
| 0x0b05 | 2821 | unknown accounting error |
| 0x0b06 | 2822 | accounting server error |
| 0x0b07 | 2823 | instance limit reached |
| 0x0b08 | 2824 | instance check error |
| 0x0b09 | 2825 | license file invalid |
| 0x0b0a | 2826 | virtualserver is running elsewhere |
| 0x0b0b | 2827 | virtualserver running in same instance already |
| 0x0b0c | 2828 | virtualserver already started |
| 0x0b0d | 2829 | virtualserver not started |
| 0x0b0e | 2830 | [to be completed] |
| 0x0c00 | 3072 | invalid message id |
| 0x0d00 | 3328 | invalid ban id |
| 0x0d01 | 3329 | connection failed, you are banned |
| 0x0d02 | 3330 | rename failed, new name is banned |
| 0x0d03 | 3331 | flood ban |
| 0x0e00 | 3584 | unable to initialize tts |
| 0x0f00 | 3840 | invalid privilege key |
| 0x1000 | 4096 | VoIP pjsua error |
| 0x1001 | 4097 | [to be completed] |
| 0x1002 | 4098 | [to be completed] |
| 0x1003 | 4099 | [to be completed] |
| 0x1004 | 4100 | [to be completed] |
| 0x1005 | 4101 | [to be completed] |
| 0x1006 | 4102 | [to be completed] |
| 0x1007 | 4103 | [to be completed] |
| 0x1100 | 4352 | provisioning invalid password |
| 0x1101 | 4353 | provisioning invalid request |
| 0x1102 | 4354 | no (more) slots available |
| 0x1103 | 4355 | pool missing |
| 0x1104 | 4356 | pool unknown |
| 0x1105 | 4357 | unknown ip location |
| 0x1106 | 4358 | internal error (tries exceeded) |
| 0x1107 | 4359 | too many slots requested |
| 0x1108 | 4360 | too many reserved |
| 0x1109 | 4361 | could not connect to provisioning server |
| 0x1110 | 4368 | authentication server not connected |
| 0x1111 | 4369 | authentication data too large |
| 0x1112 | 4370 | already initialized |
| 0x1113 | 4371 | not initialized |
| 0x1114 | 4372 | already connecting |
| 0x1115 | 4373 | already connected |
| 0x1116 | 4374 | not connected |
| 0x1117 | 4375 | io_error |
| 0x1118 | 4376 | invalid timeout |
| 0x1119 | 4377 | ts3server not found |
| 0x111A | 4378 | unknown permissionID |
10. Permission IDs
Source: https://yat.qa/resources/permission-ids/ (English)
See ReSpeak/tsdeclarations/Permissions.csv for the complete machine-readable list.
11. Client Versions
Source: https://yat.qa/resources/client-versions/ (English)
See ReSpeak/tsdeclarations/Versions.csv for the complete machine-readable list with version hashes.
12. Badges
Source: https://yat.qa/ressourcen/abzeichen-badges/ (German)
See ReSpeak/tsdeclarations/Badges.csv for the complete machine-readable list.
Fetched and compiled on 2026-06-11
13. Error Code Cross-Reference (YaTQA vs ReSpeak)
This section cross-references error codes between the YaTQA reference (Section 9) and the ReSpeak/tsdeclarations reference (docs/references/respeak-protocol-reference.md Section 2).
Discrepancies and Observations
| Hex | YaTQA Message | ReSpeak Name | ReSpeak Doc | Discrepancy |
|---|---|---|---|---|
| 0x0003 | — (not listed) | ok_no_update |
(empty) | YaTQA omits this code entirely. ReSpeak includes it. |
| 0x0004 | — (not listed) | dont_notify |
(empty) | YaTQA omits this code. ReSpeak includes it. |
| 0x0005 | — (not listed) | lib_time_limit_reached |
library time limit reached | YaTQA omits this code. ReSpeak includes it. |
| 0x0102 | — (not listed) | no_network_port_available |
no network port available | YaTQA omits this code. ReSpeak includes it. |
| 0x040e | [to be completed] | (not listed) | — | ReSpeak omits codes 0x040e–0x040f. YaTQA has placeholders. |
| 0x040f | [to be completed] | (not listed) | — | ReSpeak omits. YaTQA has placeholders. |
| 0x0b0e | [to be completed] | accounting_to_many_starts |
(empty) | ReSpeak name has typo "ToMany" → to_many_starts. YaTQA has placeholder. |
| 0x0914 | — (not listed) | sound_read_wave |
read error in wave | YaTQA omits this and subsequent sound codes. |
| 0x0915 | — (not listed) | sound_need_more_data |
there is no sound data for this period | YaTQA omits. |
| 0x0916 | — (not listed) | sound_device_busy |
sound device was busy | YaTQA omits. |
| 0x0917 | — (not listed) | sound_no_data |
there is no sound data for this period | YaTQA omits. |
| 0x0918 | — (not listed) | sound_channel_mask_mismatch |
Channelmask mismatch | YaTQA omits. Last YaTQA sound code is 0x0913. |
| 0x1116 | not connected | provisioning_not_connected |
(empty) | YaTQA has message; ReSpeak doc field is empty. |
| 0x1119 | ts3server not found | provisioning_ts3server_not_found |
(empty) | Both present, ReSpeak doc empty. |
| 0x111A | unknown permissionID | provisioning_no_permission |
unknown permissionID | Name differs: YaTQA doesn't have a name column; ReSpeak names it provisioning_no_permission. |
Coverage Summary
| Range | YaTQA Codes | ReSpeak Codes | Notes |
|---|---|---|---|
| 0x0000–0x0005 | 3 (0,1,2) | 6 (0–5) | ReSpeak has 3 additional success/info codes |
| 0x0100–0x0102 | 2 | 3 | ReSpeak adds no_network_port_available |
| 0x0200–0x0210 | 17 | 17 | Aligned |
| 0x0300–0x030f | 16 | 16 | Aligned |
| 0x0400–0x0410 | 16+2 placeholders | 14 | YaTQA has 2 codes (0x040e, 0x040f) ReSpeak omits; ReSpeak omits 0x040e–0x040f |
| 0x0500–0x0505 | 6 | 6 | Aligned |
| 0x0600–0x0607 | 8 | 8 | Aligned |
| 0x0700–0x070c | 13 | 13 | Aligned |
| 0x0800–0x0817 | 24 | 24 | Aligned |
| 0x0900–0x0918 | 20 (YaTQA: 20 stops at 0x0913) | 25 | ReSpeak has 5 additional sound codes (0x0914–0x0918) |
| 0x0a00–0x0a0c | 13 | 13 | Aligned |
| 0x0b00–0x0b0e | 14+1 placeholder | 15 | Mostly aligned; 0x0b0e has placeholder in YaTQA |
| 0x0c00 | 1 | 1 | Aligned |
| 0x0d00–0x0d03 | 4 | 4 | Aligned |
| 0x0e00 | 1 | 1 | Aligned |
| 0x0f00 | 1 | 1 | Aligned |
| 0x1000–0x1007 | 1+7 placeholders | 8 | YaTQA has 7 [to be completed]; ReSpeak has names for all |
| 0x1100–0x111A | 27 | 27 | Aligned |
Recommendations for Chanora
- Use ReSpeak
Errors.csvas the primary error code source (machine-readable, complete) - Use YaTQA descriptions as supplementary documentation (German-source detail)
- Handle codes 0x0003–0x0005 as success/info variants, not errors
- Map unknown/placeholder codes (0x040e, 0x040f, 0x0b0e, 0x1001–0x1007) to a generic "unknown server error" category in Chanora's protocol error normalization (SRS-048)