Files
openfsd/docs/protocol.md
2025-05-12 17:21:16 -07:00

98 KiB

Protocol

Name Identifier Purpose
Server Identification $DI Server identification
Client Identification $ID Client identification
Add Pilot #AP Login as pilot
Add ATC #AA Login as ATC
Pilot Position @ Pilot geographical position/velocity update
Fast Pilot Position ^ Pilot geographical position/velocity update, sent at a higher frequency
Fast Pilot Position (Slow) #SL Pilot geographical position/velocity update, sent at a lower frequency
Fast Pilot Position (Stopped) #ST Pilot geographical position/velocity update, sent when the airplane is stopped (zero velocity).
ATC Position % ATC geographical position update
Ping $PI Ping a recipient
Pong $PO Respond to a ping
Client Query $CQ Query information about a recipient
Client Query Response $CR Respond to a client query
METAR Request $AX Request a METAR
METAR Response $AR Respond to a METAR request
Wind Data #WD Wind data
Cloud Data #CD Cloud data
Temperature Data #TD Temperature data
Initiate Handoff $HO Initiate an ATC handoff request
Accept Handoff $HA Accept an ATC handoff request
Weather Profile Request #WX Request the server's weather profile
Flight Plan $FP Send a flightplan
Flight Plan Amendment $AM Amend a flightplan
Delete Pilot #DP Notify server before disconnecting (pilot connections)
Delete ATC #DA Notify server before disconnecting (ATC connections)
Kill Request $!! Kick a user from the server (admin/supervisor only)
Auth Challenge $ZC Challenge other side of the connection using an obfuscation technique
Auth Response $ZR Respond to an auth challenge
ATC Shared State #PC ATC-specific data exchange
Plane Information #SB Pilot-specific data exchange
Text Message #TM Send a text message

Server Identification ($DI)

Field Name Type Description Notes
From string Source callsign always SERVER
To string Destination callsign always CLIENT
Version string Server software version
Initial Challenge Key hexadecimal-encoded byte array Initial server challenge key for "VATSIM Auth" obfuscation scheme
  • First packet sent by the server upon TCP connection establishment.
  • The client must wait for this packet before continuing initialization.
  • TODO: see Connection Flow

Example:

$DISERVER:CLIENT:VATSIM FSD V3.50:76617473696d

Client Identification ($ID)

Field Name Type Description Notes
From string Source callsign
To string Destination callsign always SERVER
Client Software ID hexadecimal-encoded uint16 VATSIM-assigned client software ID
Client Software Name string Human-readable client software name
Client Software Major Version integer Client software major version number
Client Software Minor Version integer Client software minor version number
CID integer VATSIM-assigned user certificate ID
System UID integer System hardware-specific identifier
Initial Challenge Key hexadecimal-encoded byte array Initial client challenge key for "VATSIM Auth" obfuscation scheme
  • First packet sent by the client in the connection lifecycle.
  • Sent in response to a Server Identification
  • The Client Software ID is a static VATSIM-assigned value given to each approved software client. It is used as an input for the VATSIM Auth obfuscation scheme.
  • The Client Software Major and Minor versions describe the release version of the client software. e.g. given v1.0: major version = 1, minor version = 0
  • CID or "cert ID" is the VATSIM-equivalent of a username.
  • The System UID is a hardware-specific identifier. Some clients derive it from the MAC address of their network card. Other clients such as vatSys generate it using hardware information from the Win32 GetVolumeInformation() call.

Example:

$IDN172SP:SERVER:88e4:vPilot:3:8:123456:-582057156:6d6973746176

Add Pilot (#AP)

Field Name Type Description Notes
From string Source callsign
To string Destination callsign always SERVER
CID integer VATSIM-assigned user certificate ID
Token string Authentication JWT
Network Rating integer VATSIM Network Rating ATC Rating
Protocol Revision integer FSD protocol revision
Simulator Type integer Flight Simulator Type
Real Name string User's real name
  • The second packet required by the login initialization process.
  • Indicates that a client wishes to connect as a pilot.
  • Sent immediately after the Client Identification packet.
  • Upon successful login, retransmitted by the server to all other clients with the Token field omitted.

Example:

#APN7938C:SERVER:100000:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkdW1teSI6InRydWUifQ.WC-jYTEoENgaWQ9WUj9A9_-olUELBHmNOwv7UrCVn9w:1:101:2:John Doe

Add ATC (#AA)

Field Name Type Description Notes
From string Source callsign
To string Destination callsign always SERVER
Real Name string User's real name
CID integer VATSIM-assigned user certificate ID
Token string Authentication JWT
Network Rating integer VATSIM Network Rating ATC Rating
Protocol Revision integer
  • The second packet required by the login initialization process.
  • Indicates that a client wishes to connect as an Air Traffic Controller.
  • Sent immediately after the Client Identification packet.
  • Upon successful login, retransmitted by the server to all other clients with the Token field omitted.

Example:

#AARN_OBS:SERVER:John Doe:100000:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkdW1teSI6InRydWUifQ.WC-jYTEoENgaWQ9WUj9A9_-olUELBHmNOwv7UrCVn9w:2:100

Pilot Position (@)

Field Name Type Description Notes
Transponder Mode char Ident = Y, Mode C = N, Mode A = S
From string Source callsign
Transponder Code string Squawk code Must be 4 characters each between 0 and 7
Network Rating integer VATSIM Network Rating
Latitude floating-point number Geographical latitude Formatted in decimal degrees
Longitude floating-point number Geographical longitude Formatted in decimal degrees
True Altitude integer Aircraft true altitude Unit is feet
Groundspeed integer Aircraft ground speed Unit is knots
Pitch/Bank/Heading unsigned 32-bit integer Encoded pitch, bank, and heading information
Altitude Correction integer Difference between pressure altitude and true altitude. Correction = PressureAltitude - TrueAltitude
  • Sent by pilot clients at 0.2Hz intervals.
  • Retransmitted by the server to all other clients within visibility range.

Example:

@S:GTI8197:2000:1:40.65906:-73.79891:26:0:4290776072:359

Fast Pilot Position (^)

Field Name Type Description Notes
From string Source callsign
Latitude floating-point number Geographical latitude Formatted in decimal degrees
Longitude floating-point number Geographical longitude Formatted in decimal degrees
True Altitude floating-point number Aircraft true altitude Unit is feet
Altitude AGL floating-point number Aircraft altitude AGL Unit is feet
Pitch/Bank/Heading unsigned 32-bit integer Encoded pitch, bank, and heading information
Positional Velocity Vector (X-axis) floating-point number Aircraft positional velocity (X-axis) Unit is radians/second
Positional Velocity Vector (Y-axis) floating-point number Aircraft positional velocity (Y-axis) Unit is radians/second
Positional Velocity Vector (Z-axis) floating-point number Aircraft positional velocity (Z-axis) Unit is radians/second
Rotational Velocity Vector (X-axis) floating-point number Aircraft rotational velocity (X-axis) Unit is radians/second
Rotational Velocity Vector (Y-axis) floating-point number Aircraft rotational velocity (Y-axis) Unit is radians/second
Rotational Velocity Vector (Z-axis) floating-point number Aircraft rotational velocity (Z-axis) Unit is radians/second
Nose Gear Angle floating-point number Aircraft nose gear tiller angle Unit is degrees
  • Sent by pilot clients supporting protocol revision 101 at 5Hz intervals when:
    1. A Send Fast packet flagged as true is received.
  • Retransmitted by the server to all other clients within visibility range supporting protocol revision 101.
  • See Notes on Fast Pilot Positions

Example:

^DAL1151:40.6354992:-73.7795597:16.81:8.10:12582828:0.0015:0.0001:0.0005:0.0001:0.0000:-0.0029:-0.40

Fast Pilot Position (Slow Variant) (#SL)

| Fields are identical to Fast Pilot Position

  • Sent by pilot clients supporting protocol revision 101 at 0.2Hz intervals when:
    1. A Send Fast packet flagged as false is received, and
    2. The aircraft velocity is greater than zero.
  • Retransmitted by the server to all other clients within visibility range supporting protocol revision 101.
  • See Notes on Fast Pilot Positions

Example:

#SLPRM4211:41.0844150:-73.1060790:26684.57:26961.66:4269806144:196.8918:-1.4936:174.1947:-0.0000:-0.0000:-0.0001:-2.11

Fast Pilot Position (Stopped Variant) (#ST)

| Fields are identical to Fast Pilot Position, with all Rotational and Positional velocity vectors omitted.

  • Sent by pilot clients supporting protocol revision 101 at 0.2Hz intervals when:
    1. The aircraft velocity is zero.
  • Retransmitted by the server to all other clients within visibility range supporting protocol revision 101.
  • See Notes on Fast Pilot Positions

Example:

#STDAL2119:40.6453400:-73.7743400:13.56:-0.03:29360076:0.00

ATC Position (%)

Field Name Type Description Notes
From string Source callsign
Radio Frequencies &-delimited array of integers An array of 5-digit integer representations of the ATC's tuned aviation VHF radio frequencies each with the initial 1 and the decimal omitted e.g., 122.800 = 22800 Example with multiple frequencies: 19600&20950&20150
Facility Type integer VATSIM Facility Type
Visibility Range integer Station visibility range Unit is nautical miles
Network Rating integer VATSIM Network Rating
Latitude floating-point number Geographical latitude Formatted in decimal degrees
Longitude floating-point number Geographical longitude Formatted in decimal degrees
Unknown 0 Value integer A static field with the value 0 appended to each ATC position packet. Its purpose is unknown.
  • Sent by air traffic controller clients at 15-second intervals.
  • Retransmitted by the server to all other clients within visibility range.

Example:

%EWR_P_APP:28550:5:150:4:40.67317:-74.18533:0

Ping ($PI)

Field Name Type Description Notes
From string Source callsign
To string Recipient callsign
Timestamp string Timestamp to be echoed in a corresponding Pong packet.
  • Used to ping another client.
  • Responses follow the Pong format.

Example:

$PIN172SP:N7938C:1736029820

Pong ($PO)

Field Name Type Description Notes
From string Source callsign
To string Recipient callsign
Timestamp string Echoed timestamp from a corresponding Ping packet.
  • Used to respond to Ping packets from another client.

Example:

$PON7938C:N172SP:1736029820

Client Query ($CQ)

Field Name Type Description Notes
From string Source callsign
To string Recipient callsign
Query Type string see Client Query Types
Payload varies (see below) Optional
  • Used to query another client or the server for information.
  • Responses follow the Client Query Response format.
  • Not all queries require a response. Some simply broadcast information or a state change.
  • Payload can consist of an arbitrary amount of separate contiguous FSD fields. It is optional depending on the type.

Client Query Response ($CR)

Field Name Type Description Notes
From string Source callsign
To string Recipient callsign
Query Type string see Client Query Types
Payload varies (see below) Optional
  • Used to respond to a Client Query
  • Not all client queries have an associated response using this packet format.
  • Payload can consist of an arbitrary amount of separate contiguous FSD fields. It is optional depending on the type.

Client Query Types

ATC (Active ATC)

  • Query whether a client is an active air traffic controller (with permission to mutate flightplans/scratchpads/etc.) or just an observer.
  • Only allowed to be sent directly to or from SERVER.
  • The queried callsign may be for another client or the sender's callsign itself.

Request Payload Fields:

Request Field Description
Callsign Callsign of the client in question

Response Payload Fields:

Response Field Description
Boolean Flag Whether the client in question is an active ATC.
Formatted as Y or N, indicating true or false respectively.
Callsign Callsign of the client in question

Request Example:

$CQSAN_GND:SERVER:ATC:SAN_GND

"This is SAN_GND. Does SAN_GND have active ATC privileges?"

Response Example:

$CRSERVER:SAN_GND:ATC:Y:SAN_GND

"Yes, SAN_GND has active ATC privileges."


CAPS (Capabilities)

  • Query the capabilities of another client or the server.

Request Payload Fields:

N/A

Response Payload Fields:

Response Field Description
Capabilities List (several FSD fields) List of Capabilities

Request Example:

$CQJBU325:JBU1005:CAPS

"This is JBU325. I would like to know JBU1005's client capabilities."

Response Example:

$CRJBU1005:JBU325:CAPS:VERSION=1:ATCINFO=1:MODELDESC=1:ACCONFIG=1:VISUPDATE=1:ATCMULTI=1

"This is JBU1005. I would like to share my client's capabilities with JBU325."


C? (COM 1 Frequency)

  • Query another client for their COM 1 frequency.
  • Only for pilot clients, as ATC clients preemptively broadcast their COM 1 frequency in position reports.

Request Payload Fields:

N/A

Response Payload Fields:

Response Field Description
COM 1 Frequency Floating-point number with 3 digits of decimal precision representing an aviation VHF frequency e.g., 122.800

Request Example:

$CQJBU617:JBU325:C?

"This is JBU617. I would like to know JBU325's COM 1 frequency."

Response Example:

$CRJBU325:JBU617:C?:122.800

"This is JBU325. I would like to tell JBU617 that my COM 1 radio is tuned to 122.800."


RN (Real Name)

  • Query another client for their real name.

Request Payload Fields:

N/A

Response Payload Fields:

Response Field Description
Real Name Client's real name conventionally formatted as <FirstName> <LastName> <HomeAirport>
Sector File Sector file in use (blank if pilot)
Pilot Rating Pilot Rating if pilot, ATC/Network Rating if ATC.

Request Example:

$CQJBU617:JBU325:RN

"This is JBU617. I would like to know JBU325's real name."

Response Example:

$CRJBU325:JBU617:RN:John Doe::1

"This is JBU325. I would like to share my real name with JBU617."


SV (Server)

  • Query a client for the address of the server they're connected to.
  • It is plausible that this packet is only forwarded to its recipient when sent by a supervisor or above.
  • Some clients do not respond to this packet.

Request Payload Fields:

N/A

Response Payload Fields:

Response Field Description
Server Address Address of the server that the sender client is connected to

Request Example:

$CQABC_SUP:JBU325:SV

"This is ABC_SUP, a supervisor, who would like to know the address of the server that JBU325 is connected to."

Response Example:

$CRJBU325:ABC_SUP:SV:127.0.0.1

"This is JBU325. I am connected to server 127.0.0.1."


ATIS (ATIS)

  • Query a client for their ATIS info.
  • Answered by ATC clients only.
  • Responses can be multiple FSD packets long. Each response has an ATIS type specifier. Once complete, a final response packet is sent indicating how many packets, including itself, were sent overall for the entire ATIS response.
  • Some clients respond to these queries by instead sending Text Message packets with the ATIS messages in human-readable format.

Request Payload Fields:

N/A

Request Example:

$CQJBU325:KSAN_ATIS:ATIS

"This is JBU325. I would like the ATIS from KSAN_ATIS."

Letter Variant

  • Indicates the current ATIS letter.
Response Field Description
ATIS Type A
Letter A single letter (A thru Z) specifying the current ATIS letter.

ATIS Letter Response Example:

$CRKSAN_ATIS:JBU325:ATIS:A:D

"This is KSAN_ATIS. Information Delta is current."

Text Variant

  • A single line or section of the controller's ATIS info message.
  • Several of these packets may be sent in order.
Response Field Description
ATIS Type T
Text ATIS info text section

ATIS Letter Response Example:

$CRKSAN_ATIS:JBU325:ATIS:T:(THREE ZERO ZERO NINER). LOC, RNAV, AND VIS APPS IN USE. LDG AND

Logoff Time Variant

  • The planned logoff time of the controller.
Response Field Description
ATIS Type Z
Logoff Time Logoff time of the controller, formatted as HHMMz in zulu time

ATIS Logoff Time Response Example:

$CRKSAN_ATIS:JBU325:ATIS:Z:0900z

"This is KSAN_ATIS. I plan to log off the network at 0900 zulu time."

Voice Server Variant

  • The controller's voice server.
Response Field Description
ATIS Type V
Voice Server Voice Server Address

ATIS Logoff Time Response Example:

$CRKSAN_ATIS:JBU325:ATIS:V:123.123.123.123

"This is KSAN_ATIS. My voice server address can be reached at 123.123.123.123."

End Marker Variant

  • Indicates that the sender is done sending ATIS messages
Response Field Description
ATIS Type E
Number of packets sent Total number of packets sent for the entire ATIS response. Total count includes this packet.

ATIS End Marker Response Example:

$CRKSAN_ATIS:JBU325:ATIS:E:5

"This is KSAN_ATIS. Including this final packet, I have sent 5 ATIS messages in response to your request."

Text Message Alternative

Some clients alternatively format the above ATIS response variants as Text Message packets:

Examples:

$CRKSAN_ATIS:JBU325:ATIS:A:D

becomes...

#TMKSAN_ATIS:JBU325:ATIS A D
$CRKSAN_ATIS:JBU325:ATIS:T:(THREE ZERO ZERO NINER). LOC, RNAV, AND VIS APPS IN USE

becomes...

#TMKSAN_ATIS:JBU325:ATIS T (THREE ZERO ZERO NINER). LOC, RNAV, AND VIS APPS IN USE

IP (Public IP)

  • Ask the server for your public IP address.
  • All Public IP requests must be sent to SERVER. All Public IP responses must be from SERVER.

Request Payload Fields:

N/A

Response Payload Fields:

Response Field Description
IP Address Client's IP address as observed by the server.

Request Example:

$CQJBU325:SERVER:IP

"Hello server, this is JBU325. I would like to know my IP address as observed by your end of the connection."

Response Example:

$CRSERVER:JBU325:IP:127.0.0.1

"This is the server. I observe your IP address to be 127.0.0.1."


INF (Information)

  • Supervisor/admin/server only request for a client-generated key/value list.
  • Includes information like the client's name, public IP address, system UID, geographical coordinates, etc.

Request Payload Fields:

N/A

Response Payload Fields:

Response Field Description
INF String String of key/value pairs describing the client

Request Example:

$CQSERVER:JBU325:INF

"Hello JBU325, this is the server. Send me your INF string."

Response Example:

$CRJBU325:SERVER:INF:vPilot 3.8.1 PID=100000 (John Doe) IP=127.0.0.1 SYS_UID=99999 FSVER=Msfs LT=41.34555 LO=-84.79253 AL=13

"Hello server, this is JBU325. Here is my INF string."


FP (Flight Plan)

  • ATC only
  • Request a flight plan from the server.
  • The recipient must be SERVER.

Request Payload Fields:

Request Field Description
Callsign Callsign of the requested flight plan

Response Payload Fields:

N/A

Request Example:

$CQSAN_GND:SERVER:FP:JBU325

"Hello server, this is SAN_GND. Give me the flight plan for JBU325 if one is filed."

Response Example:


IPC (Force Squawk Code Change)

  • ATC command to force a client to change their squawk code.
  • Some clients ignore this packet.
  • This packet may be deprecated.

Request Payload Fields:

Request Field Description
Callsign Callsign of estimate.
Static Field 2 This field is always 852. It's meaning is unknown.
Squawk Code Squawk code to change to

Request Example:

$CQTOR_CTR:ACA365:IPC:W:852:4378

"Hello ACA365, this is TOR_CTR. I'm forcing you to change your squawk code to 4378."


BY (Request Relief)

  • ATC only
  • Broadcasted from an air traffic controller to all other in-range air traffic controllers signalling that they are requesting to be relieved by another air traffic controller.
  • Sent to special recipient @94835.
  • There are no payload fields for this client query type.

Request Example:

$CQTOR_CTR:@94835:BY

"To all nearby ATCs, this is TOR_CTR. I'm logging off soon, and I'm requesting to be relieved of my position."

Response Example:

N/A

  • There are no associated responses for this client query type.

HI (Cancel Request Relief)

Request Example:

$CQTOR_CTR:@94835:HI

"To all nearby ATCs, this is TOR_CTR. Never mind, I won't be logging off for a while."

Response Example:

N/A

  • There are no associated responses for this client query type.

HLP (Request Help)

  • ATC only.
  • Request help from other controllers.
  • Sent to special recipient @94835.
  • This packet is ignored by the vatSys client.

Request Payload Fields:

Request Field Description
Message (optional) Message to send along with the help request. If omitted, the entire FSD field must be omitted.

Request Example:

$CQTOR_CTR:@94835:HLP:Heeeelp meeee!!!

"To all nearby ATCs, this is TOR_CTR. I'm going down the tubes!"


NOHLP (Cancel Request Help)

Request Payload Fields:

Request Field Description
Message (optional) Message to send along with the help request cancellation. If omitted, the entire FSD field must be omitted.

Request Example:

$CQTOR_CTR:@94835:NOHLP:Never mind, I'm good.

"To all nearby ATCs, this is TOR_CTR. I'm good actually."


WH (Who Has)

  • ATC only
  • Broadcast a query to in-range air traffic controllers asking who is tracking a given target.
  • Sent to special recipient @94835.

Request Payload Fields:

Request Field Description
Target Callsign Callsign of the target in question

Response Payload Fields:

N/A

Request Example:

$CQSCT_S_APP:@94835:WH:N7938C

"To all nearby ATCs, this is SCT_S_APP. Who is currently tracking N7938C?"

Response Example:

N/A

  • A Pro Controller packet is used to reply to this query.
  • TODO: list pro controller packet types

IT (Initiate Track)

  • ATC-only
  • Sent as a broadcast message to all in-range ATC clients signalling that they are taking control over a target's track.
  • Sent to special recipient @94835.

Request Payload Fields:

Request Field Description
Target Callsign Callsign of the target in question

Response Payload Fields:

N/A

  • There is no associated response for this client query type.

Request Example:

$CQSCT_S_APP:@94835:IT:ROU1887

"To all nearby ATCs, this is SCT_S_APP. I have acquired the track for ROU1887."


DR (Drop Track)

  • ATC-only
  • Sent as a broadcast message to all in-range ATC clients signalling that they are dropping a target's track (not handing off the target to another controller.)
  • Sent to special recipient @94835.

Request Payload Fields:

Request Field Description
Target Callsign Callsign of the target in question

Response Payload Fields:

N/A

  • There is no associated response for this client query type.

Request Example:

$CQSCT_S_APP:@94835:DR:ROU1887

"To all nearby ATCs, this is SCT_S_APP. I have dropped my track for ROU1887."


HT (Accept Handoff)

  • ATC-only
  • Accept an ATC Handoff Request.
  • This packet seems to be sent in sequence after two ATC clients directly negotiate a handoff via Initiate Handoff & Accept Handoff packets. This broadcasts the change of track to all other in-range ATC clients that would otherwise only be known to the two interacting parties. This helps to maintain global state.
  • Sent to special recipient @94835.

Request Payload Fields:

Request Field Description
Target Callsign Callsign of the target in question

Response Payload Fields:

N/A

  • There is no associated response for this client query type.

Request Example:

$CQSCT_S_APP:@94835:HT:ROU1887

"To all nearby ATCs, this is SCT_S_APP. I have acquired ROU1887's track from another controller."


TA (Set Temporary Altitude)

  • ATC-only
  • Set the assigned temporary altitude for a target.
  • Sent to special recipient @94835.

Request Payload Fields:

Request Field Description
Target Callsign Callsign of the target in question
Temporary Altitude Temporary altitude value

Response Payload Fields:

N/A

  • There is no associated response for this client query type.

Request Example:

$CQSCT_S_APP:@94835:TA:ROU1887:23000

"To all nearby ATCs, this is SCT_S_APP. I assigned temporary altitude 23000ft to ROU1887."


FA (Set Final Altitude)

  • ATC-only
  • Set the final altitude on a target's scratchpad.
  • Sent to special recipient @94835.

Request Payload Fields:

Request Field Description
Target Callsign Callsign of the target in question
Final Altitude Final altitude value

Response Payload Fields:

N/A

  • There is no associated response for this client query type.

Request Example:

$CQSCT_S_APP:@94835:FA:ROU1887:35000

"To all nearby ATCs, this is SCT_S_APP. I assigned final altitude 23000ft to ROU1887."


BC (Set Beacon Code)

  • ATC-only
  • Set the assigned SSR beacon code for a target.
  • Sent to special recipient @94835.

Request Payload Fields:

Request Field Description
Target Callsign Callsign of the target in question
Assigned Beacon Code Beacon code value

Response Payload Fields:

N/A

  • There is no associated response for this client query type.

Request Example:

$CQSCT_S_APP:@94835:BC:ROU1887:7032

"To all nearby ATCs, this is SCT_S_APP. I assigned beacon code 7032 to ROU1887."


SC (Set Scratchpad)

  • ATC-only
  • Set the scratchpad operations data (abbreviated scratchpad text) for a target.
  • Sent to special recipient @94835.

Request Payload Fields:

Request Field Description
Target Callsign Callsign of the target in question
Data Scratchpad data

Response Payload Fields:

N/A

  • There is no associated response for this client query type.

Request Example:

$CQSCT_S_APP:@94835:SC:N7938C:SFR

"To all nearby ATCs, this is SCT_S_APP. I assigned scratchpad code 'SFR' to N7938C."


VT (Set Voice Type)

  • ATC-only
  • Set the voice type for a target.
  • Sent to special recipient @94835.
  • The vatSys client ignores this packet.
Request Field Description
Target Callsign Callsign of the target in question
Voice Type Code Send & Receive = v, Receive-only = r, Text-only = t

Example Request:

$CQSCT_S_APP:@94835:VT:ROU1887:v

"To all nearby ATCs, this is SCT_S_APP. I assigned ROU1887's the voice type to 'Send and Receive'."


ACC (Aircraft Configuration)

  • Aircraft configuration state (lights, engines, flaps, etc.)

Request Payload Fields:

Request Field Description
JSON Payload Aircraft configuration JSON payload (see below)
  • All client query packets of this type utilize the $CQ variant.
  • Aircraft Configuration data is formatted as JSON.
  • Updates to aircraft configuration state may be broadcast unsolicited to other clients.
  • Unsolicited aircraft configuration updates are sent to the special recipient @94836.
  • Any "config": {} field may be omitted if "is_full_data" is set to false. This is common for unsolicited broadcast packets, in the case where say only one variable changes e.g. the pilot turns their landing lights on.

A client may request the configuration of another client:

{
    "request": "full"
}

The actual aircraft configuration state is nested in the "config" object:

{
  "config": {
    "is_full_data": boolean,

    "lights": {
      "strobe_on":  boolean,
      "landing_on": boolean,
      "taxi_on":    boolean,
      "beacon_on":  boolean,
      "nav_on":     boolean,
      "logo_on":    boolean
    },

    "engines": {
      "1": {
        "on":           boolean,
        "is_reversing": boolean
      },
      "2": {
        "on":           boolean,
        "is_reversing": boolean
      },
      "3": {
        "on":           boolean,
        "is_reversing": boolean
      },
      "4": {
        "on":           boolean,
        "is_reversing": boolean
      }
    },

    "gear_down":        boolean,
    "flaps_pct":        integer,
    "spoilers_out":     boolean,
    "on_ground":        boolean,
    "static_cg_height": float64
  }
}

Request Example:

$CQPRM4211:JBU325:ACC:{"request":"full"}

"This is PRM4211. Give me JBU325's full aircraft configuration state."

Associated Response:

$CQJBU325:PRM4211:ACC:{"config":{"is_full_data":true,"lights":{"strobe_on":false,"landing_on":false,"taxi_on":false,"beacon_on":false,"nav_on":false,"logo_on":false},"engines":{"1":{"on":false,"is_reversing":false},"2":{"on":false,"is_reversing":false}},"gear_down":true,"flaps_pct":0,"spoilers_out":false,"on_ground":true,"static_cg_height":10.4399995803833}}

"Hello PRM4211, this is JBU325. Here is my full aircraft configuration state."

Unsolicited Broadcast Example:

$CQSKW3272:@94836:ACC:{"config":{"flaps_pct":10}}

"To all nearby pilots, this is SKW3272. My flaps are now 10 percent deployed."


NEWINFO (New Information)

  • ATC-only
  • Broadcast when a new ATIS/information is current.
  • Assumed to be sent to special recipient @94835.
  • The vatSys client ignores this packet.
  • This packet may be deprecated.
Request Field Description
New ATIS Letter New letter for current ATIS information

Example Request:

$CQKSAN_ATIS:@94835:NEWINFO:B

"To all nearby ATCs, this is KSAN_ATIS. Information Bravo is now current."


NEWATIS (New ATIS)

  • ATC-only
  • Broadcast when a new ATIS is current.
  • Assumed to be sent to special recipient @94835.
  • The vatSys client ignores this packet.
  • This packet may be deprecated.
Request Field Description
New ATIS Letter String New letter for current ATIS information, formatted as ATIS {letter} e.g. ATIS B
Surface Wind and Pressure Surface wind and pressure string, formatted as DEG at VELOCITY - PRESSURE e.g. 220 at 12 - 29.92

Example Request:

$CQKSAN_ATIS:@94835:NEWATIS:ATIS B:220 at 12 - 29.92

"To all nearby ATCs, this is KSAN_ATIS. Information Bravo is now current. Wind 220 at 12, altimeter 29.92."


EST (Estimate)

  • ATC-only
  • Broadcast an estimate for a target.
  • Sent to special recipient @94835.
Request Field Description
Callsign Callsign in question for estimate
Segment Segment/intersection name
Filtered Index In the case a given segment identifier/intersection appears more than once, this value indicates the index of such. e.g. If the intersection XYZ appears twice in the target's flight plan, and the estimate is referring to the second one, this value should be set to 1.
Estimate Type ETO = 0, PETO = 1, ATO = 2, FINISH = 3
Time Datetime formatted as yyyy-MM-ddTHH:mm:ss (UTC)

Example Request:

$CQSCT_S_APP:@94835:EST:ROU1887:ZZOOO:0:2025-01-08T14:12:42

"To all nearby ATCs, this is SCT_S_APP. I estimate ROU1887 to be over ZZOOO intersection at 2025-01-08T14:12:42 zulu time."


GD (Set Global Data)

  • ATC-only
  • Set the global data for a target.
  • Sent to special recipient @94835.
Request Field Description
Target Callsign Target callsign
Contents Global data contents

Example Request:

$CQSCT_S_APP:@94835:GD:ROU1887:abcdefg

"To all nearby ATCs, this is SCT_S_APP. I assigned ROU1887's global data to 'abcdefg'"


METAR Request ($AX)

  • Request a METAR from the server.
  • The recipient must always be SERVER.
Field Name Type Description Notes
From string Source callsign
To string Recipient callsign
Static Field string The value of this field is always METAR
Station string The station code to query ICAO airport code

Example:

$AXSAN_GND:SERVER:METAR:KSAN

"Hello server, this is SAN_GND. Give me the latest METAR report for Lindbergh Field KSAN."


METAR Response ($AR)

  • Respond to a METAR Request.
  • Always sent from the server to the requester client.
Field Name Type Description Notes
From string Source callsign
To string Recipient callsign
METAR string METAR value

Example:

$ARSERVER:SAN_GND:KSAN 092351Z 30003KT 10SM CLR 18/05 A3008 RMK AO2 SLP185 T01830050 10211 20172 55001 $

"Hello SAN_GND, this is the server. Here is the latest METAR report I have for Lindbergh Field KSAN."


Weather Profile Request (#WX)

  • Request a weather profile from the server.
  • The server responds to this request with Wind Data, Cloud Data, and Temperature Data packets.
  • No modern client is known to use this packet. It is possible this is how legacy clients obtained real-time weather information.
  • The vatSys client ignores this packet.
Field Name Type Description Notes
From string Source callsign
To string Recipient callsign
Station string Station to query weather information for ICAO airport code

Example:

#WXAAL365:SERVER:KDFW

Wind Data (#WD)

  • Send data on wind layers.
  • Only sent by SERVER.
  • Response for a Weather Profile Request.
  • No known client has been observed to implement use of this packet.
  • This packet may be deprecated.
  • Boolean values are serialized as 1 or 0, indicating 'true' or 'false' respectively.
Field Name Type Description
From string Source callsign
To string Recipient callsign
Layer 1 Ceiling integer Ceiling of wind layer 1 in feet
Layer 1 Floor integer Floor of wind layer 1 in feet
Layer 1 Direction integer Direction of wind layer 1 (degrees)
Layer 1 Speed integer Speed of wind layer 1 (knots)
Layer 1 Gusting boolean Indicates gusting in layer 1
Layer 1 Turbulence integer Turbulence level in layer 1
Layer 2 Ceiling integer Ceiling of wind layer 2 in feet
Layer 2 Floor integer Floor of wind layer 2 in feet
Layer 2 Direction integer Direction of wind layer 2 (degrees)
Layer 2 Speed integer Speed of wind layer 2 (knots)
Layer 2 Gusting boolean Indicates gusting in layer 2
Layer 2 Turbulence integer Turbulence level in layer 2
Layer 3 Ceiling integer Ceiling of wind layer 3 in feet
Layer 3 Floor integer Floor of wind layer 3 in feet
Layer 3 Direction integer Direction of wind layer 3 (degrees)
Layer 3 Speed integer Speed of wind layer 3 (knots)
Layer 3 Gusting boolean Indicates gusting in layer 3
Layer 3 Turbulence integer Turbulence level in layer 3
Layer 4 Ceiling integer Ceiling of wind layer 4 in feet
Layer 4 Floor integer Floor of wind layer 4 in feet
Layer 4 Direction integer Direction of wind layer 4 (degrees)
Layer 4 Speed integer Speed of wind layer 4 (knots)
Layer 4 Gusting boolean Indicates gusting in layer 4
Layer 4 Turbulence integer Turbulence level in layer 4

Example:

#WDSERVER:DFW_GND:-1:-1:0:0:0:0:10400:2500:19:0:0:0:22600:10400:359:0:0:0:90000:22700:15:0:0:0

Cloud Data (#CD)

  • Send data on cloud layers.
  • Only sent by SERVER.
  • Response for a Weather Profile Request.
  • No known client has been observed to implement use of this packet.
  • This packet may be deprecated.
  • Boolean values are serialized as 1 or 0, indicating 'true' or 'false' respectively.
Field Name Type Description
From string Source callsign
To string Recipient callsign
Layer 1 Ceiling integer Ceiling of cloud layer 1 in feet
Layer 1 Floor integer Floor of cloud layer 1 in feet
Layer 1 Coverage integer Cloud coverage of layer 1
Layer 1 Icing boolean Indicates the presence of icing in layer 1
Layer 1 Turbulence integer Turbulence level in cloud layer 1
Layer 2 Ceiling integer Ceiling of cloud layer 2 in feet
Layer 2 Floor integer Floor of cloud layer 2 in feet
Layer 2 Coverage integer Cloud coverage of layer 2
Layer 2 Icing boolean Indicates the presence of icing in layer 2
Layer 2 Turbulence integer Turbulence level in cloud layer 2
Storm Layer Ceiling integer Ceiling of storm layer in feet
Storm Layer Floor integer Floor of storm layer in feet
Storm Layer Deviation integer Direction deviation in the storm layer
Storm Layer Coverage integer Storm coverage
Storm Layer Turbulence integer Turbulence level in the storm layer

Example:

#CDSERVER:DFW_GND:-1:-1:0:0:0:-1:-1:0:0:0:-1:-1:0:0:0:10.00

Temperature Data (#TD)

  • Send data on temperature layers and atmospheric pressure.
  • Only sent by SERVER.
  • Response for a Weather Profile Request.
  • No known client has been observed to implement use of this packet.
  • This packet may be deprecated.
  • Boolean values are serialized as 1 or 0, indicating 'true' or 'false' respectively.
Field Name Type Description
From string Source callsign
To string Recipient callsign
Layer 1 Ceiling integer Ceiling of temperature layer 1 in feet
Layer 1 Temperature integer Temperature of layer 1 in Celsius
Layer 2 Ceiling integer Ceiling of temperature layer 2 in feet
Layer 2 Temperature integer Temperature of layer 2 in Celsius
Layer 3 Ceiling integer Ceiling of temperature layer 3 in feet
Layer 3 Temperature integer Temperature of layer 3 in Celsius
Layer 4 Ceiling integer Ceiling of temperature layer 4 in feet
Layer 4 Temperature integer Temperature of layer 4 in Celsius
Pressure integer Atmospheric pressure in (inHg) e.g., 2992

Example:

#TDSERVER:DFW_GND:100:0:10000:-9:18000:-28:35000:-61:2992

Handoff Request ($HO)

  • ATC only
  • Initiate a handoff of a target
  • TODO: determine recipients
Field Name Type Description Notes
From string Source callsign
To string Recipient callsign
Target string Callsign of the target to handoff

Example:

$HOSAN_APP:LAX_35_CTR:ROU1887

"Hello LAX_35_CTR, this is SAN_APP. Handing off ROU1887 to you."


Handoff Accept ($HA)

Field Name Type Description Notes
From string Source callsign
To string Recipient callsign
Target string Callsign of the target to handoff

Example:

$HOLAX_35_CTR:SAN_APP:ROU1887

"Hello SAN_APP, this is LAX_35_CTR. I accept your handoff request. I will now track ROU1887."


Flight Plan ($FP)

  • Send a flight plan
  • Clients may file a flight plan by setting the recipient to SERVER.
  • Used to respond to FP Client Query requests.
  • Is broadcasted to all ATC when someone files a flight plan. In this case, the recipient is set to *A.
  • Sometimes, ATC clients send a text message to the recipient FP acknowledging when they receive a flight plan.
Field Name Type Description Notes
From string Source callsign
To string Recipient callsign
Flight Rules char I = IFR ,V = VFR, D = DVFR, S = SVFR
Equipment Code string Equipment code or suffix
True Airspeed integer Filed true airspeed Unit is knots
Departure Airport string ICAO departure airport identifier
Estimated Departure Time integer Filed ETD Zulu time
Actual Departure Time integer Filed actual departure time Zulu time
Cruise Altitude integer Filed cruise altitude Unit is feet
Destination Airport string ICAO arrival airport identifier
Hours Enroute integer Filed hours enroute
Minutes Enroute integer Filed minutes enroute, in addition to Hours Enroute
Hours of Fuel Available integer Number of hours of fuel available
Minutes of Fuel Available integer Number of minutes of fuel available, in addition to Hours of Fuel Available.
Alternate Airport string ICAO alternate airport identifier
Remarks string Flightplan remarks section
Route string Flight planned route

Example:

$FPAAL152:SAN_TWR:I:H/B772/L:487:KLAX:250:250:35000:KDFW:2:40:4:5:KOKC:PBN/A1B1D1S2T1 DOF/250111 REG/N755SB EET/KZAB0032 KZFW0138 OPR/AAL PER/D RMK/TCAS SIMBRIEF /V/:DOTSS2 CNERY BLH J169 TFD J50 SSO J4 INK GEEKY BOOVE7

Flight Plan Amendment ($AM)

  • Used to amend a previously filed flight plan.
  • ATC clients may amend a flight plan by sending the amendment with the recipient set to SERVER.
  • Broadcasted to all ATC in-range when an amendment is filed.
  • Sent to the special recipient @94835.
Field Name Type Description Notes
From string Source callsign
To string Recipient callsign
Callsign string The flight callsign for the aircraft
Flight Rules char I = IFR, V = VFR, D = DVFR, S = SVFR
Equipment Code string Equipment code or suffix
True Airspeed string Filed true airspeed Unit is knots
Departure Airport string ICAO departure airport identifier
Estimated Departure Time string Filed estimated departure time Zulu time
Actual Departure Time string Filed actual departure time Zulu time
Cruise Altitude string Filed cruise altitude Unit is feet
Destination Airport string ICAO arrival airport identifier
Hours Enroute string Filed hours enroute
Minutes Enroute string Filed minutes enroute, in addition to Hours Enroute
Hours of Fuel Available string Number of hours of fuel available
Minutes of Fuel Available string Number of minutes of fuel available, in addition to Hours of Fuel Available.
Alternate Airport string ICAO alternate airport identifier
Remarks string Flightplan remarks section
Route string Flight planned route

Example:

$AMAAL123:SAN_TWR:AAL123:I:H/B737/L:420:KLAX:230:240:35000:KORD:3:15:3:30:KDEN:2:50:4:10:KMEM:RMK/TCAS SIMBRIEF /V/:DOTSS2 CNERY J169 TFD J50 SSO INK GEEKY BOOVE7

ATC Shared State (#PC)

Field Name Type Description Notes
From string Source callsign
To string Recipient callsign
Static Field string The value of this field is always CCP. This may stand for 'Controller to Controller Packet'. This field is present on all Shared State packets. Other variants of this packet without CCP are undocumented. They may be deprecated.
Type string Shared state type identifier (see below)
Payload Fields varies Potentially many separate contiguous FSD fields, depending on the type.
  • Multipurpose ATC data exchange packet
  • #PC stands for 'Pro Controller', the first ATC client with widespread use on the VATSIM network.
  • Facilitates ATC clients synchronizing with one another in order to maintain a shared global state.
  • Some variants of this packet have similar logic to and are interchangeable with some Client Query variants.
  • ATC Shared packets have many types

Shared State Types

VER (Version)

  • Description TODO

Example:

#PCSCT_APP:SAN_APP:CCP:VER

"Example TODO"

Example:

TODO

ID (Modern Client Check)

  • Description TODO

Example:

#PCSCT_APP:SAN_APP:CCP:ID

"Example TODO"

Example:

TODO

DI (Reverse Modern Client Check?)

  • Description TODO

Example:

#PCSCT_APP:SAN_APP:CCP:DI

"Example TODO"

Example:

TODO

IH (I Have)

  • Broadcast that a client has the track of a target.
  • TODO: Confirm that this packet is actually broadcasted.
  • Used to reply to Client Query Who Has packets.

Request Fields:

Field Description
Callsign Target callsign

Example:

#PCSCT_APP:@94835:CCP:IH:ROU1887

"To all nearby controllers, this is SCT_APP. I am tracking the target ROU1887."


SC (Scratchpad)

  • Broadcast a change to a target's scratchpad.
  • Used to convey specific information about a target (e.g., headings, speeds, states).
  • Scratchpad fields have various types, described below.

Request Fields:

Field Description
Callsign Target callsign
Contents Scratchpad contents (see below)

Example:

#PCSCT_APP:@94835:CCP:SC:ROU1887:ABC

"To all nearby controllers, this is SCT_APP. I set the scratchpad data for ROU1887 to 'ABC'."


Scratchpad Types (Commonly used in Euroscope)

Plaintext or Direct to Fix

  • Description: Represents plain text or direct information assigned to a target's scratchpad.
  • Syntax: Any unrecognized text is treated as plain text or direct data.

Example:

#PCSCT_APP:@94835:CCP:SC:ROU1887:ABC123

"To all nearby controllers, this is SCT_APP. I set the scratchpad data for ROU1887 to 'ABC123'."


Rate of Climb

  • Description: Indicates a target's rate of climb or descent in feet per minute.
  • Syntax: Prefixed with R.

Example:

#PCSCT_APP:@94835:CCP:SC:ROU1887:R1500

"To all nearby controllers, this is SCT_APP. I set the rate of climb/descent for ROU1887 to 1500 feet per minute."


Heading

  • Description: Indicates a target's assigned heading in degrees.
  • Syntax: Prefixed with H.

Example:

#PCSCT_APP:@94835:CCP:SC:ROU1887:H270

"To all nearby controllers, this is SCT_APP. I set the heading for ROU1887 to 270 degrees."


Speed

  • Description: Indicates a target's assigned speed in knots.
  • Syntax: Prefixed with S.

Example:

#PCSCT_APP:@94835:CCP:SC:ROU1887:S250

"To all nearby controllers, this is SCT_APP. I set the speed for ROU1887 to 250 knots."


Mach

  • Description: Indicates a target's assigned Mach number.
  • Syntax: No prefix; only numeric Mach values.

Example:

#PCSCT_APP:@94835:CCP:SC:ROU1887:0.84

"To all nearby controllers, this is SCT_APP. I set the Mach number for ROU1887 to 0.84."


Speed Operator

  • Description: Represents a speed operator, such as "exactly," "or less," or "or greater."
  • Syntax: Uses /ASP=/, /ASP-/, or /ASP+/.

Example:

#PCSCT_APP:@94835:CCP:SC:ROU1887:/ASP=/

"To all nearby controllers, this is SCT_APP. I set the speed operator for ROU1887 to 'exactly'."


Rate of Climb Operator

  • Description: Represents a climb/descent rate operator.
  • Syntax: Uses /ARC=/, /ARC-/, or /ARC+/.

Example:

#PCSCT_APP:@94835:CCP:SC:ROU1887:/ARC+/

"To all nearby controllers, this is SCT_APP. I set the climb/descent rate operator for ROU1887 to 'or greater'."


Stand

  • Description: Indicates an assigned stand for a target.
  • Syntax: Prefixed with GRP/S/.

Example:

#PCSCT_APP:@94835:CCP:SC:ROU1887:GRP/S/GATE12

"To all nearby controllers, this is SCT_APP. I set the stand for ROU1887 to 'GATE12'."


Cancel Stand

  • Description: Indicates the cancellation of a previously assigned stand.
  • Syntax: GRP/S/

Example:

#PCSCT_APP:@94835:CCP:SC:ROU1887:GRP/S/

"To all nearby controllers, this is SCT_APP. I cancelled the stand assignment for ROU1887."


Manual Stand

  • Description: Indicates a manually assigned stand.
  • Syntax: Prefixed with GRP/M/.

Example:

#PCSCT_APP:@94835:CCP:SC:ROU1887:GRP/M/GATE12/BAY2

"To all nearby controllers, this is SCT_APP. I manually set the stand for ROU1887 to 'GATE12/BAY2'."


Cancel Manual Stand

  • Description: Indicates the cancellation of a previously manually assigned stand.
  • Syntax: GRP/M/

Example:

#PCSCT_APP:@94835:CCP:SC:ROU1887:GRP/M/

"To all nearby controllers, this is SCT_APP. I cancelled the manual stand assignment for ROU1887."


Clearance Received

  • Description: Indicates that a clearance has been given to a target.
  • Syntax: CLEA

Example:

#PCSCT_APP:@94835:CCP:SC:ROU1887:CLEA

"To all nearby controllers, this is SCT_APP. I gave clearance to ROU1887."


Clearance Cancelled

  • Description: Indicates that a clearance has been cancelled for a target.
  • Syntax: NOTC

Example:

#PCSCT_APP:@94835:CCP:SC:ROU1887:NOTC

"To all nearby controllers, this is SCT_APP. I cancelled clearance for ROU1887."


Ground State

  • Description: Represents the ground state of a target, such as startup, taxi, or takeoff.
  • Syntax: Uses specific keywords (e.g., STUP, TAXI, DEPA).

Ground State Examples:

Code Description
NSTS No state
ONFREQ On frequency
DE-ICE De-icing
STUP Startup
PUSH Pushback
TAXI Taxi
LINEUP Line up
TXIN Taxi in
DEPA Departure
PARK Park

Example:

#PCSCT_APP:@94835:CCP:SC:ROU1887:TAXI

"To all nearby controllers, this is SCT_APP. I set the ground state for ROU1887 to 'Taxi'."


GD (Global Data)

  • Broadcast a change to a target's global data.
  • TODO: Confirm that this packet is actually broadcasted.

Request Fields:

Field Description
Callsign Target callsign
Contents Global data contents

Example:

#PCSCT_APP:@94835:CCP:GD:ROU1887:XYZ

"To all nearby controllers, this is SCT_APP. I set the global data for ROU1887 to 'XYZ'."


TA (Temporary Altitude)

  • Broadcast a change to a target's assigned temporary altitude.
  • TODO: Confirm that this packet is actually broadcasted.

Request Fields:

Field Description
Callsign Target callsign
Altitude Assigned temporary altitude

Example:

#PCSCT_APP:@94835:CCP:TA:ROU1887:23000

"To all nearby controllers, this is SCT_APP. I assigned ROU1887's temporary altitude to 23000 feet."


FA (Final Altitude)

  • Broadcast a change to a target's assigned final altitude.
  • TODO: Confirm that this packet is actually broadcasted.

Request Fields:

Field Description
Callsign Target callsign
Altitude Assigned final altitude

Example:

#PCSCT_APP:@94835:CCP:FA:ROU1887:35000

"To all nearby controllers, this is SCT_APP. I assigned ROU1887's final altitude to 35000 feet."


VT (Voice Type)

  • Broadcast a change to a target's voice type.
  • TODO: Confirm that this packet is actually broadcasted.

Request Fields:

Field Description
Callsign Target callsign
Voice Capability Send & Receive = v, Receive-only = r, Text-only = t

Example:

#PCSCT_APP:@94835:CCP:VT:ROU1887:v

"To all nearby controllers, this is SCT_APP. I assigned ROU1887's voice type to 'Send and Receive Voice'."


BC (Beacon Code)

  • Broadcast a change to a target's assigned beacon (transponder) code.
  • TODO: Confirm that this packet is actually broadcasted.

Request Fields:

Field Description
Callsign Target callsign
Beacon Code Assigned beacon or transponder code

Example:

#PCSCT_APP:@94835:CCP:BC:ROU1887:6342

"To all nearby controllers, this is SCT_APP. I assigned ROU1887's beacon code to 6342."


HC (Cancel Handoff)

Request Fields:

Field Description
Callsign Target callsign

Example:

#PCSAN_APP:LAX_35_CTR:CCP:HC:ROU1887

"LAX_35_CTR, this is SAN_APP. Disregard my handoff request for ROU1887."


PT (Pointout)

  • Point out a target to another controller

Request Fields:

Field Description
Callsign Target callsign

Example:

#PCSAN_APP:LAX_35_CTR:CCP:PT:ROU1887

"LAX_35_CTR, this is SAN_APP. You will see a pointout for ROU1887 on your scope."


DP (Push to Departure List)

  • Push a target to a departure list.
  • TODO: determine recipient logic for this packet

Request Fields:

Field Description
Callsign Target callsign

Example:

#PCSAN_TWR:SAN_APP:CCP:DP:ROU1887

TODO: verify "SAN_APP, this is SAN_TWR. Push ROU1887 to your departure list."


ST (Flight Strip)

  • Broadcast a change to a target's flight strip
  • TODO: determine recipient logic for this packet

Request Fields:

Field Description
Callsign Target callsign
Format (optional) Flight strip format identifier
Contents (may consist of several separate contiguous FSD fields) Flight strip contents

TODO: find flight strip format identifier and finish the example. Example:

#PCSAN_TWR:SAN_APP:CCP:ST:

TODO: verify "SAN_APP, this is SAN_TWR. TODO."


IC, IK, IB, IO, OC, OK, OB, OO, MC, MK, MB, MO (Landline)

  • Landline coordination logic
  • A landline command is identified by a 2-character code, as seen above. The first character determines the landline type, the second the landline command.
Identifer Landline Type
I Intercom
O Override
M Monitor
Identifer Landline Command
C Request
K Approve
B Reject
O End

All landline packets with the 'Request' or 'Approve' commands contain two additional fields:

  • IP Address
  • Port

Example:

#PCSAN_TWR:SAN_APP:CCP:IK:127.0.0.1:6789

"SAN_APP, this is SAN_TWR. I accept your intercom landline call. Dial me at 127.0.0.1:6789."


SquawkBox Data (#SB)

  • Exchange data between pilot clients
Field Name Type Description Notes
From string Source callsign
To string Recipient/victim callsign
SquawkBox Data Type string Identifier specifying the SquawkBox Data type
Payload varies Potentially several separate contiguous FSD fields depending on the type.

SquawkBox Data Types

Plane Info Request (PIR)

  • Request model-matching information from another client

Example:

#SBN7938C:DAL625:PIR

Plane Info (PI:GEN)

  • Send model-matching information to another client
Payload Field Type Description
Key/Value Pair KEY=VALUE Potentially several contiguous FSD fields containing key/value pairs describing model matching information. See below for possible keys.

Possible Keys (non-exhaustive):

  • EQUIPMENT: Aircraft equipment identifier
  • AIRLINE: Airline identifier
  • LIVERY: Livery identifier
  • CSL: CSL identifier

Notes:

  • Key/value pair ordering is not guaranteed.
  • Presence of each key/value type is not guaranteed.

Example:

#SBDAL625:N7938C:PI:GEN:EQUIPMENT=B738:AIRLINE=DAL

Plane Info (Legacy) (PI:X)

  • Send model-matching information to another client
  • Still implemented by some libraries, but is marked as legacy.
Payload Field Type Description
Unknown Field 0 This field is always set to 0. Its purpose is unknown.
Engine Type integer Piston = 0, Jet = 1, None = 2, Helicopter = 3
CSL CSL={identifier} CSL model identifier. Some older clients omit the CSL= prefix and instead use ~ e.g., ~PA24

Example:

#SBDAL625:N7938C:PI:X:0:1:CSL=A320_DAL

Plane Info Request (FSInn) (FSIPIR)

  • Request and send model-matching information to another client.
  • Even though this packet is explicitly requesting plane info from another client, it is convention to include the requester's own plane info as well.
  • This packet is specific to the FSInn pilot client (last updated in 2012)
Payload Field Type Description
Unknown Field 0 This field is always set to 0. Its purpose is unknown.
Airline ICAO Code string Airline ICAO identifier
Aircraft ICAO Code string Aircraft ICAO identifier
Empty Field 0 N/A Modern libraries leave this field empty. Its purpose is unknown. Older clients utilized this field for an unknown floating-point number.
Empty Field 1 N/A Modern libraries leave this field empty. Its purpose is unknown. Older clients utilized this field for an unknown floating-point number.
Empty Field 2 N/A Modern libraries leave this field empty. Its purpose is unknown. Older clients utilized this field for an unknown floating-point number.
Empty Field 3 N/A Modern libraries leave this field empty. Its purpose is unknown. Older clients utilized this field for an unknown possibly-hexadecimal formatted string e.g., 3.3028DC0.98CF9A41
Aircraft ICAO Type string ICAO type identifier e.g., L1P
Combined Model Matching Identifier string Model-matching string

Example:

#SBDLH478:GBOZI:FSIPI:0:DLH:A320:::::L2J:FLIGHTFACTOR A320 LUFTHANSA D-AIPC

Plane Info (FSInn) (FSIPI)

Example:

#SBDLH478:GBOZI:FSIPIR:0:DLH:A320:::::L2J:FLIGHTFACTOR A320 LUFTHANSA D-AIPC

Interim Position (I)

  • Used by the SquawkBox client to send faster position updates.

  • This packet type is deprecated.

  • Suffered from severe precision errors.

  • The payload fields for this packet are unknown.


Swift Interim Position (VI)

  • Repurposed interim position update utilized by the swift pilot client.
Payload Field Type Description
Latitude floating-point number Geographical latitude in decimal degrees
Longitude floating-point number Geographical longitude in decimal degrees
True Altitude integer True altitude in feet
Groundspeed integer Groundspeed in knots
Pitch/Bank/Heading unsigned 32-bit integer Encoded pitch, bank, and heading

Example:

#SBDLH478:GBOZI:VI:43.12578:-72.15841:12008:400:25132146

Text Message (#TM)

  • Send a text message to a specific recipient, a group of recipients, or a VHF frequency.
Field Name Type Description Notes
From string Source callsign
To string Recipient identifier
Message string Text Message

Text Message Recipient Types

@XXXXX VHF Frequency

  • Send a text message to a VHF frequency.
  • Frequency is formatted as @HHTTT for a given VHF frequency 1HH.TTT e.g., 122.800 = @22800.
  • Multiple frequencies may be listed, delimited with & characters e.g., @21950&@19600
  • Broadcasted to all in-range clients.

Example:

#TMN7938C:@22800:Gillespie Traffic, N7989C, taking off runway 27R, right downwind departure.

@49999 ATC Chat

  • Send a text message to the ATC chat room.
  • Sent to the special recipient @49999.
  • Broadcasted to all in-range ATC clients.

Example:

#TMSAN_GND:@49999:Yo SAN_TWR, you got any coffee up there?

*S Wallop

  • Send a "Wallop" message.
  • Sent to the special recipient *S, indicating 'All Supervisors'.
  • Broadcasted to all supervisors and administrators on the network.

Example:

#TMSAN_TWR:*S:N7938C just crashed on the runway and he isn't disconnecting.

Kill Request ($!!)

  • When sent by a client with Supervisor privilege or above, it is forwarded to the target client, then the target client is disconnected.
Field Name Type Description Notes
From string Source callsign
To string Recipient/victim callsign
Reason string Reason explaining the kick

Example:

$!!ABC_SUP:N505GS:Refusing to follow ATC instructions

Server Error ($ER)

  • Represents an FSD network error sent by the SERVER.
Field Name Type Description Notes
From string Source callsign Always SERVER
To string Recipient callsign May be CLIENT or unknown
Error Code integer Server Error Code
Causing Parameter string Repeated FSD field causing the error May be empty if not relevant
Description string Human-readable description of the error
  • The error code always fills 3 digits e.g., 006 (%3d)

Example:

$ERSERVER:unknown:006::Invalid CID/password.

Delete Pilot (#DP)

  • Sent by pilot clients before terminating the connection.
  • Broadcasted to all other clients on the server.
Field Name Type Description Notes
From string Source callsign
CID integer User's assigned VATSIM Certificate ID

Example:

#DPAAL325:1400000

Delete ATC (#DA)

  • Sent by ATC clients before terminating the connection.
  • Broadcasted to all other clients on the server.
Field Name Type Description Notes
From string Source callsign
CID integer User's assigned VATSIM Certificate ID
Challenge hexadecimal-encoded string Auth challenge

Example:

#DASAN_TWR:1555555

Auth Challenge ($ZC)

  • Interrogate the other side of the connection using the VATSIM Auth obfuscation scheme.
Field Name Type Description Notes
From string Source callsign
To string Recipient callsign
Challenge hexadecimal-encoded string Challenge data

Example:

$ZCN7938C:SERVER:0123456789abcdef

Auth Response ($ZR)

Field Name Type Description Notes
From string Source callsign
To string Recipient callsign
Challenge Response hexadecimal-encoded MD5 hash Challenge response data

Example:

$ZRSERVER:N7938C:4d87482917dc9c2395bd2df151835734

Notes

Fast Pilot Positions

There are three variants of the Fast Pilot Position packet:

Identifier Type Interval Enabled by Default
^ "Fast" 5 Hz false
#SL "Slow" 0.2 Hz true
#ST "Stopped" 0.2 Hz true

Fast pilot position packets were added to the protocol in 2022 to accomodate the VATSIM Velocity release, increasing the pilot position update frequency from 0.2Hz to 5Hz. The format and operation of "slow" pilot position updates (@) was left unchanged. Fast positions (also known as "visual" updates) also include velocity information, measured in meters/second on all 3 axes, as well as radians/second on all rotational axes. Fast positions repeat the groundspeed, altitude, and pitch/bank/heading information found in standard @ position updates.

(^) packets are not sent at 5Hz by default. The server instructs the client whether to send these fast position updates using a "Send Fast Positions" ($SF) packet, which contains a boolean flag. (^) packets are sent at 5Hz intervals by the client when enabled by the server. (#ST) or (#SL) variants are always sent alongside standard slow (@) packets at 0.2Hz intervals, regardless of the Send Fast Position ($SF) state. If the pilot client determines that the aircraft is exhibiting zero velocity, "stopped" (#ST) packets are used. Otherwise, "slow" (#SL) packets are used.

Pitch/Bank/Heading Encoding

An aircraft's pitch, bank, and heading are encoded into a single unsigned 32-bit integer for use in position update packets.

  • Each angle is mapped into a 10-bit number (0..1023).
  • Angles are in degrees. 0 degrees = 0. 360 degrees = 1023.
  • Pitch is shifted left by 22 bits.
  • Bank is shifted left by 12 bits.
  • Heading is shifted left by 2 bits.
  • The lowest 2 bits are always zero.
   Bit index:   31            22 21           12 11            2 1   0
                |<-- 10 bits -->|<-- 10 bits -->|<-- 10 bits -->|<-2->
                +---------------+---------------+---------------+-----+
                |     PITCH     |     BANK      |    HEADING    |  0  |
                +---------------+---------------+---------------+-----+
      Shifts:    << 22           << 12           << 2

Special Recipients

SERVER

  • Callsign reserved for the FSD server.

FP

  • Callsign reserved for some flightplan transactions.

@94835

  • Special frequency telling the server to broadcast to all in-range ATC clients.

@94836

  • Special frequency telling the server to broadcast to all in-range pilot clients.

@49999

  • Special frequency for ATC-only #TM chat messages.
  • Sent to all in-range ATC clients.

*S

  • Special frequency for wallop #TM chat messages.
  • Sent to all supervisors and administrators connected to the network.