Server queries
You can query information from a running game server using UDP/IP packets. This document describes the packet formats and protocol to access this data.
Data Types
All server queries consist of five basic types of data packed together into a data stream. All types are little endian, which is the default on most languages on x86 CPUs. Java users should use ByteBuffer to convert.
Name | Description |
---|---|
byte | 8 bit character or unsigned integer |
short | 16 bit signed integer |
long | 32 bit signed integer |
float | 32 bit floating point |
long long | 64 bit unsigned integer |
string | variable-length byte field, encoded in UTF-8, terminated by 0x00 |
Protocol
Steam uses a packet size of 1400 bytes + IP/UDP headers. If a request or response needs more packets for the data it starts the packets with an additional header.
Simple Response
Data | Type | Comment |
---|---|---|
Header | long | Always equal to -1 (0xFFFFFFFF). Means it isn't split. |
Payload |
Multi-packet Response
Goldsource Server
Data | Type | Comment |
---|---|---|
Header | long | Always equal to -2 (0xFFFFFFFE). Means the packet is split. |
ID | long | Unique number assigned by server per answer. |
Packet number | byte | Upper 4 bits represent the number of the current packet (starting at 0) and bottom 4 bits represent the total number of packets (2 to 15). |
Payload |
Source Server
Data | Type | Comment | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Header | long | Always equal to -2 (0xFFFFFFFE). Means the packet is split. | |||||||||
ID | long | Same as the Goldsource server meaning. However, if the ![]() | |||||||||
Total | byte | The total number of packets in the response. | |||||||||
Number | byte | The number of the packet. Starts at 0. | |||||||||
Size | short | (Orange Box Engine and above only) Maximum size of packet before packet switching occurs. The default value is 1248 bytes (0x04E0), but the server administrator can decrease this. For older engine versions: the maximum and minimum size of the packet was unchangeable. | |||||||||
This is only present in the first packet of the response and only if the response is being compressed.
| |||||||||||
Payload |
Because UDP packets can arrive in different order or delayed, every packet should be verified by its "ID" and "Number"! Every request or response with or without this header is continued with an integer -1 (0xFFFFFFFF) and the user data. So by reading the first 4 bytes you can decide whether the data is split (-2) or in one packet (-1).

Requests
The server responds to 5 queries:
A2A_PING
- Ping the server.
A2S_SERVERQUERY_GETCHALLENGE
- Returns a challenge number for use in the player and rules query.
A2S_INFO
- Basic information about the server.
A2S_PLAYER
- Details about each player on the server.
A2S_RULES
- The rules the server is using.
Queries should be sent in UDP packets to the listen port of the server.
A2A_PING
Ping the server to see if it exists, this can be used to calculate the latency to the server.
Request format
Data | Type | Value |
---|---|---|
Heading | byte | 'i' (0x69) |
Reply format
Goldsource servers
Data | Type | Value |
---|---|---|
Heading | byte | 'j' (0x6A) |
Content | string | Null |
Source servers
Data | Type | Value |
---|---|---|
Heading | byte | 'j' (0x6A) |
Content | string | '00000000000000' |

A2S_SERVERQUERY_GETCHALLENGE
Request format
Challenge values are required for A2S_PLAYER
and A2S_RULES
requests, you can use this request to get one.

A2S_PLAYER
and A2S_RULES
queries with a challenge value of -1 (0xFF FF FF FF)
and they will respond with a challenge value to use (using the reply format below).
FF FF FF FF 57
Reply format
Data | Type | Comment |
---|---|---|
Type | byte | Should be equal to 'A' (0x41) |
Challenge | long | The challenge number to use |
Example reply:
FF FF FF FF 41 32 42 59 45
A2S_INFO
Request format
Server info can be requested by sending the following byte values in a UDP packet to the server.
FF FF FF FF 54 53 6F 75 72 63 65 20 45 6E 67 69 ÿÿÿÿTSource Engi 6E 65 20 51 75 65 72 79 00 ne Query |
i.e. -1 (int), 'T' (byte), "Source Engine Query" (string)
Reply format
Source servers
Data | Type | Comment |
---|---|---|
Type | byte | Should be equal to 'I' (0x49) |
Version | byte | Network version. 0x07 is the current Steam version. Goldsource games will return 48 (0x30), also refered to as protocol version. |
Server Name | string | The Source server's name, eg: "Recoil NZ CS Server #1" |
Map | string | The current map being played, eg: "de_dust" |
Game Directory | string | The name of the folder containing the game files, eg: "cstrike" |
Game Description | string | A friendly string name for the game type, eg: "Counter Strike: Source" |
AppID | short | Steam Application ID |
Number of players | byte | The number of players currently on the server |
Maximum players | byte | Maximum allowed players for the server |
Number of bots | byte | Number of bot players currently on the server |
Dedicated | byte | 'l' for listen, 'd' for dedicated, 'p' for SourceTV |
OS | byte | Host operating system. 'l' for Linux, 'w' for Windows |
Password | byte | If set to 0x01, a password is required to join this server |
Secure | byte | if set to 0x01, this server is VAC secured |
Game Version | string | The version of the game, eg: "1.0.0.22" |
Extra Data Flag (EDF) | byte | if present this specifies which additional data fields will be included |
if ( EDF & 0x80 ) | short | The server's game port # is included |
if ( EDF & 0x10 ) | long long | The server's SteamID is included |
if ( EDF & 0x40 ) | short string | The spectator port # and then the spectator server name are included |
if ( EDF & 0x20 ) | string | The game tag data string for the server is included [future use] |
if ( EDF & 0x01 ) | long long | The server's 64-bit GameID is included |
Example reply:
FF FF FF FF 49 02 67 61 6D 65 32 78 73 2E 63 6F ÿÿÿÿI.game2xs.co 6D 20 43 6F 75 6E 74 65 72 2D 53 74 72 69 6B 65 m Counter-Strike 20 53 6F 75 72 63 65 20 23 31 00 64 65 5F 64 75 Source #1.de_du 73 74 00 63 73 74 72 69 6B 65 00 43 6F 75 6E 74 st.cstrike.Count 65 72 2D 53 74 72 69 6B 65 3A 20 53 6F 75 72 63 er-Strike: Sourc 65 00 F0 00 05 10 04 64 6C 00 00 31 2E 30 2E 30 e......dl..1.0.0 2E 32 32 00 .22. |
The Ship servers
Data | Type | Comment |
---|---|---|
Type | byte | Should be equal to 'I' (0x49) |
Version | byte | Network version. 0x07 is the current Steam version. |
Server Name | string | The Source server's name, eg: "Xtra The Ship #1 [Hunt]" |
Map | string | The current map being played, eg: "batavier" |
Game Directory | string | The name of the folder containing the game files, eg: "ship" |
Game Description | string | A friendly string name for the game type, eg: "The Ship" |
AppID | short | Steam Application ID |
Number of players | byte | The number of players currently on the server |
Maximum players | byte | Maximum allowed players for the server |
Number of bots | byte | Number of bot players currently on the server |
Dedicated | byte | 'l' for listen, 'd' for dedicated, 'p' for SourceTV |
OS | byte | Host operating system. 'l' for Linux, 'w' for Windows |
Password | byte | If set to 0x01, a password is required to join this server |
Secure | byte | if set to 0x01, this server is VAC secured |
Game Mode | byte | 0x00 for Hunt, 0x01 for Elimination, 0x02 for Duel, 0x03 for Deathmatch, 0x04 for Team VIP, 0x05 for Team Elimination |
Witness Count | byte | The minimum number of witnesses for a player to be arrested. |
Witness Time | byte | Time in seconds before player is arrested while being witnessed. |
Game Version | string | The version of the game, eg: "1.0.0.14" |
Example reply:
FF FF FF FF 49 07 53 68 69 70 20 53 65 72 76 65 ÿÿÿÿI.Ship Serve 72 00 62 61 74 61 76 69 65 72 00 73 68 69 70 00 r.batavier.ship. 54 68 65 20 53 68 69 70 00 60 09 01 05 00 6C 77 The Ship.`....lw 00 00 01 03 03 31 2E 30 2E 30 2E 34 00 .....1.0.0.4. |
Goldsource servers
WARNING: This is obsolete. GoldSource servers (except for HLTV ones?) now report using the same protocol as Source servers. To differentiate between (for example) Counter-Strike and Counter-Strike: Source, or other games with the same gamedir, use the Steam AppId.
Data | Type | Comment |
---|---|---|
Type | byte | Should be equal to 'm' (0x6D) |
Game IP | string | Game Server IP address and port |
Server Name | string | The server's name, eg: "Recoil NZ CS Server #1" |
Map | string | The current map being played, eg: "de_dust" |
Game Directory | string | The name of the folder containing the game files, eg: "cstrike" |
Game Description | string | A friendly string name for the game type, eg: "Counter-Strike" |
Number of players | byte | The number of players currently on the server |
Maximum players | byte | Maximum allowed players for the server |
Version | byte | Network version. 0x07 is the current Steam version. |
Dedicated | byte | 'l' for listen, 'd' for dedicated, 'p' for HLTV |
OS | byte | Host operating system. 'l' for Linux, 'w' for Windows |
Password | byte | If set to 0x01, a password is required to join this server |
IsMod | byte | If set to 0x01, this byte is followed by ModInfo |
Secure | byte | if set to 0x01, this server is VAC secured |
Number of bots | byte | Number of bot players currently on the server |
ModInfo
Data | Type | Comment |
---|---|---|
URLInfo | string | URL containing information about this mod |
URLDL | string | URL to download this mod |
Nul | byte | 0x00 |
ModVersion | long | Version of the installed mod |
ModSize | long | The download size of this mod |
SvOnly | byte | If 1 this is a server side only mod |
ClDLL | byte | If 1 this mod has a custom client dll |
SiN 1 Multiplayer servers
SiN 1 Multiplayer servers respond to the "Source Engine Query" request. Their reply is in the same format as Source's.
Example reply:
FF FF FF FF 49 2F 53 65 6E 73 65 6D 61 6E 6E 20 ÿÿÿÿI/Sensemann 53 69 4E 20 44 4D 00 70 61 72 61 64 6F 78 00 53 SiN DM.paradox.S 69 4E 20 31 00 53 69 4E 20 31 00 1D 05 00 10 00 iN 1.SiN 1...... 6C 77 00 00 31 2E 30 2E 30 2E 30 00 lw..1.0.0.0. |
Rag Doll Kung Fu servers
Rag Doll Kung Fu servers respond to the "Source Engine Query" request. Their reply is in the same format as Source's. Example reply:
FF FF FF FF 49 FC 54 68 65 20 44 75 64 65 27 73 ÿÿÿÿIüThe Dude's 20 64 6F 6A 6F 00 53 6F 63 63 65 72 00 52 44 4B dojo.Soccer.RDK 46 53 6F 63 63 65 72 00 52 61 67 44 6F 6C 6C 4B FSoccer.RagDollK 75 6E 67 46 75 3A 20 53 6F 63 63 65 72 00 EA 03 ungFu: Soccer.ê. 01 04 00 00 77 00 00 32 2E 33 2E 30 2E 30 00 ....w..2.3.0.0. |
A2S_PLAYER
Request format
FF FF FF FF 55 <4 byte challenge number>
The challenge number can either be set to -1 (0xFF FF FF FF)
to have the server reply with S2C_CHALLENGE
, or use the value from a previous A2S_SERVERQUERY_GETCHALLENGE
request.
Reply format
The players response has two sections, the initial header:
Data | Type | Comment |
---|---|---|
Type | byte | Should be equal to 'D' (0x44) |
Num Players | byte | The number of players reported in this response |
Then for each player the following fields are sent:
Data | Type | Comment |
---|---|---|
Index | byte | The index into [0.. Num Players] for this entry |
Player Name | string | Player's name |
Kills | long | Number of kills this player has |
Time connected | float | The time in seconds this player has been connected |


A2S_RULES
Request format
FF FF FF FF 56 <4 byte challenge number>
The challenge number can either be set to -1 (0xFF FF FF FF)
to have the server reply with S2C_CHALLENGE
, or use the value from a previous A2S_SERVERQUERY_GETCHALLENGE
request.
Reply format
The rules response has two sections, the initial header:
Data | Type | Comment |
---|---|---|
Type | byte | Should be equal to 'E' (0x45) |
Num Rules | short | The number of rules reported in this response |
Then for each rule the following fields are sent:
Data | Type | Comment |
---|---|---|
Rule Name | string | The name of the rule |
Rule Value | string | The rule's value |
Implementations
- Source Server Query Library C library
- GameServer Java library
- QueryEd Java library
- Steam Condenser Java, PHP, and Ruby library
- Net-SRCDS-Queries Perl module
- SRCDSpy Python library
- SourceLib Python library
- aQuery VB.NET library
- SourceStats Source Server Statistics
- PHP Source Query PHP library