# 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 1. [Definitions and Algorithms](#1-definitions-and-algorithms) 2. [Server Query Comments](#2-server-query-comments) 3. [Server Query Notify](#3-server-query-notify) 4. [Variable Parameters](#4-variable-parameters) 5. [Voice Client Anti-Flood](#5-voice-client-anti-flood) 6. [Security Level (Hashcash)](#6-security-level-hashcash) 7. [Snapshots](#7-snapshots) 8. [Other Protocols](#8-other-protocols) 9. [Server Error Codes](#9-server-error-codes) 10. [Permission IDs](#10-permission-ids) 11. [Client Versions](#11-client-versions) 12. [Badges](#12-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_Max` - `d_Max ≈ 527 ± 1 byte` (MTU) - `t_Max(Opus) = 20 ms` - `t_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: 1. If client permission set → use its skip flag 2. If no client permission → use effective server group's skip flag 3. If groups with Negate flag → only Negate groups count 4. 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 `serveradmin` is 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 in `cache/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 - `login` failure logs you out if already logged in - `use` with non-existent server returns "server not running" error - `use` does NOT auto-start stopped servers — must use `-virtual` flag - `return_code` parameter 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 `sid` and `virtualserver_port` when creating new server - Port not preserved from snapshot when creating new - `-mapping` flag must come before snapshot data **servernotifyregister:** - Undocumented parameter `event=tokenused` - Invalid `event` values require another parameter, then fail with parameter error - `id=0` stands 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 `LIKE` matching: `%` = wildcard, `_` = single char - Backslashes must be doubled - Undocumented `-details` switch 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:** - `clientupdate` with `client_input_hardware=0` has 0 flood points (tab switch) - `client_flag_avatar` is MD5 hash, not a boolean - `client_badges` format: `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_temporary` doesn't exist at all - `channel_icon_id` changes via `channeledit` are semi-permanent (lost on restart) - `channel_password` returns 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_reduce` points 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_bans` bypasses IP block (but not anti-flood) - Threshold: `virtualserver_antiflood_points_needed_command_block` blocks 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 1. `clientinitiv` 2. `clientinit` 3. Set default channel (10 points) 4. Set badges (15 points) 5. `permissionlist` (5 points, if not cached) 6. `clientgetvariables` (0 points) 7. 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:** 1. `virtualserver_*` settings 2. `end_virtualserver|begin_channels` → channel list (tree order) 3. `end_channels|begin_clients` → client database (creation order) 4. `end_clients|begin_permissions|server_groups` → server group permissions 5. `end_groups|iid=0` → server group memberships (by cldbid, then sgid) 6. `end_relations|channel_groups` → channel group permissions 7. `end_groups|` → channel group memberships 8. `end_relations|client_flat` → client permissions (server level) 9. `end_flat|channel_flat` → channel permissions 10. `end_flat|channel_client_flat` → client-channel permissions 11. `end_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-2` from `versions.teamspeak.com` (Protobuf format) - Contains: server version (3.0.10, outdated), stable/beta/alpha client versions - Updater images: gzip compressed (despite `.compress` extension) ### 8.3 File Transfer - Send key received from `ftinitupload`/`ftinitdownload` to 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 1. **SRV TS3:** `_ts3._udp.INPUT` — port overrides user input 2. **SRV TSDNS:** `_tsdns._tcp.DOMAIN` 3. **TSDNS:** Port 41144 4. **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,13371337133` where 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 `BlacklistInfoRequest` with: 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:** 1. BigNum: revision number 2. BigNum: Unix timestamp 3. 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.csv` as 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)