Server Browser
This page describes how to list all online ARK servers and query them for their current status, just as the in-game server browser does.
Getting server list
Official servers and unofficial servers are obtained separately. To get a list of official servers, you must use Ark's Web API. Ark uses Valve's Master Server Query Protocol to obtain a list of unofficial servers.
Querying server info
Server info is obtained by using Valve's Server Query Protocol. Descriptions of the protocol fields unmodified (Steam workshop 'plugins' don't count) Ark servers use follow below. Modified Ark servers can of course spoof or change the meaning of any of the fields and add in additional fields.
Info Requests
Field | Type | Description |
---|---|---|
Protocol Version | Byte | Ark server protocol version. Currently 17. |
Server Name | String | Name of the Ark server. With unmodified servers, this may include the version number (described below). |
Map | String | The name of the map. The default map is called "TheIsland". |
Folder | String | Always equal to "ark_survival_evolved" |
Game | String | Always equal to "ARK: Survival Evolved" |
AppID | Short | Unused - always equal to 0. |
Player Count | Byte | Number of players currently online. |
Max Players | Byte | Maximum number of players. |
Bot Count | Byte | Unused - always equal to 0. |
Server Type | Byte | 0x64 for a dedicated server, 0x6C for a non-dedicated server. |
Platform | Byte | 0x6C for Linux, 0x6F for Mac, or 0x77 for windows. |
Private? | Byte | 0 for public servers, 1 for private servers. Servers with 1 are not shown. |
VAC? | Byte | 1 unless the server is started with -insecure. |
Version | String | Unused - always equal to "1.0.0.0". |
Extra Data Flag (EDF) | Byte | Bit field describing which additional fields follow (see below). Usually equals 0xB1. |
Extra Data | Bytes | Variable length byte field. See below for format. |
So a response from an unmodified server will look something like this (fields are not shown to their correct size):
[A2S Header ] 49 11 [Server Name ] [Map Name ] 61 72 6B 5F 73 75 72 76 69 76 61 6C 5F 65 76 6F 6C 76 65 64 00 41 52 4B 3A 20 53 75 72 76 69 76 61 6C 20 45 76 6F 6C 76 65 64 00 00 00 [Player Count] [Max Players ] 00 [Server Type ] [Platform ] [Private? ] 01 31 2E 30 2E 30 2E 30 00 B1 [Port ] [SteamID ] [Keywords ] C3 BE 47 05 00 00 00 00 00
Server Name
Unmodified Ark servers limit their server name field to 63 characters. They also append the server version to their server name. The server name and server version are separated by space-dash-space-parens - (
and then the version number can be read until the next right parenthesis or until the end of the string.
Extra Data
EDF Mask | Field | Type | Description |
---|---|---|---|
0x80 | Game Port | Short | Port number the game server is running on. |
0x10 | SteamID | Long | Server owner's SteamID |
0x40 | SourceTV Port | Short | Unused |
0x40 | SourceTV Host | String | Unused |
0x20 | Server Variables | String | See below for format. |
0x01 | GameID | Long | Steam GameID. The lower 24 bits always equal 346110. |
Server Variables
The Variables field is a string that contains an unordered comma separated list of "Key:Value" server parameters. The list should always start with a comma but don't expect one as per the robustness principal. The table below describes the know keys and their observed value type and description, all of which may change at any time. Keys might be case sensitive?
Key | Type | Value |
---|---|---|
OWNINGID | Integer | Actual owner of the server, used in the Steam Socket API. |
OWNINGNAME | Integer | Displayed owner of the server, used in the Steam Socket API. |
NUMOPENPUBCONN | Integer | Number of public player slots available. |
P2PADDR | Integer | Address to connect to using the Steam Socket API. |
P2PPORT | Integer | Port number to connect to using the Steam Socket API. |
SESSIONFLAGS | Integer | Unknown?? |
ModId_l | Integer | Unknown? When given, always seems to be equal to zero, even if there are mods installed. |
Player Requests
Ark servers return some information on the players currently connected upon request.
Field | Type | Description |
---|---|---|
Player Count | Byte | Number of players currently connected. |
Player Info | Bytes | For each player, a player entry is included. See below for format. |
Player Entry
Field | Type | Description |
---|---|---|
Index | Byte | Unused - always zero. |
Name | String | Name of the player, encoded as UTF-8. |
Score | Long | Unused - always zero. |
Duration | Float | Number of seconds player has been logged in. |
Rule Requests
Field | Type | Description |
---|---|---|
Rule Count | Byte | Number of rule entries that follow. Bug: do not trust!! Try to parse until end of packet. |
Rules | Bytes | For each rule, a rule entry is included. See below for format. |
Rule Entry
Server rules are a list of Key:Value strings back to back. The key and value fields are both strings, terminated by a null byte. The rule list also includes the server variables from the server info request, which are not repeated in this table. Just like the server variables in the info request, do not expect any of these to be present, and they may change at any time.
Key | Type | Description |
---|---|---|
CUSTOMSERVERNAME_s | String | The server name (without server version), in all lower case. |
DAYTIME_s | String | The current time of day, normally formatted as ISO 8601 "hh:mm". For SoTF game-modes, starts with either "Lobby: " or "Match: " to indicate whether the server is currently in the lobby or in a match, respectively. Total conversion mods can change this however they like so handling exceptions is a must. |
GameMode_s | String | The UE4 game mode's classname that is currently being played on the server. The vanilla game mode class is named "TestGameMode_C". Since there can only be one active game mode running on a server at a time, this is controlled by the first mod in the server's mod order. |
MATCHTIMEOUT_f | Decimal | Unknown - always seems to be equal to 120.0. |
Networking_i | 0 / 1 | Unknown?? Always seems to be 0. |
OFFICIALSERVER_i | 0 / 1 | 1 for an official server, 0 for unofficial server. N.B. Even if the server is has this set to 1, it will not appear as an official server unless it's IP is found in the officialservers.ini file. |
SEARCHKEYWORDS_s | String | Unused - always equal to "Custom" |
ServerPassword_b | true / false | True if the server requires a password to join, otherwise false. |
BUILDID | Decimal | The current version of the server identified by the build id. |
SERVERUSESBATTLEYE_b | 0 / 1 | True if the server has BattlEye anticheat enabled. |
ClusterId_s | String | The name of the cluster if the server is clustered. |
LEGACY_i | 0 / 1 | True if the server is a legacy Official server. |
SESSIONISPVE_i | 0 / 1 | True if the server is PvE |
ALLOWDOWNLOADITEMS_i | 0 / 1 | True if the server allows downloading items from the cloud. |
ALLOWDOWNLOADCHARS_i | 0 / 1 | True if the server allows downloading characters from the cloud. |
Ping & Challenge Requests
Ark servers do not support either ping requests or challenge requests (they are both considered deprecated now). Challenge requests are handled through info or player list requests. Most other games get server latency by measuring the round trip time of other packets sent and divide by two (not sure how Ark does it)