Skip to content
This repository has been archived by the owner on Feb 12, 2021. It is now read-only.
Edward Smale edited this page Oct 25, 2020 · 12 revisions

Among Us protocol wiki

In this wiki, I will attempt to describe as easy to understand as possible, while retaining the details, the Among Us protocol, so you can make your own implementation, or just to understand what's happening behind the scenes. If this is your first time learning about the Among Us protocol, I suggest you read the pages carefully as it is full important details that can be easy to miss out.

I will attempt to keep the documentation as consistent and as simple as possible, although as the wiki gets rather large, this can be quite cumbersome and not always possible, if you have any issues with the wiki, please file an issue for this repository.

Among Us uses this fork of Hazel, so look there for more detailed descriptions and usage.

If you wish you try yourself at reverse-engineering the game, I suggest the following programs for packet capturing, disassembly or dumping game data.

Most of the information in this wiki I have compiled from other sources, and some is from my own reversing.


The protocol connects through the User Datagram Protocol to any of the game's Master servers.

For the most part, the protocol uses standard types and integers and floats are usually in Little Endian. Strings are prefixed by the length of the string, typically as a packed int. This applies to all packets unless noted otherwise.

Types and structures are detailed below.

Name Size Description
unknown N/A Unknown bytes of X length, usually for values that don't seem to have an effect on the game.
byte 1 byte A single byte, used for enums and bitfields.
uint8 1 byte An unsigned 8-bit integer, used for enums.
int8 1 byte A signed 8-bit integer.
uint16 2 bytes An unsigned 16-bit integer, used for buffer lengths.
int16 2 bytes A signed 16-bit integer.
uint32 4 bytes An unsigned 32-bit integer, used for IDs.
int32 4 bytes A signed 32-bit integer.
float16 4 bytes A half-precision floating point number, used for velocity and other low-precision values.
float 4 bytes A floating point number.
string N/A A string prefixed by it's length, usually as a packed int
packed int N/A A packed integer used for storing integers of variable size.
Game code 4 bytes A Game Codes used to identify games unique to each region.
Game options N/A Game options for hosting or syncing settings for games.

Every Hazel message follows a specific format, the most basic of which is the first byte, which represents the opcode of the message. Most messages will be sent either using the Unreliable or Reliable opcode, in the form of a Payload, however other messages are considered Special, and usually follow less strict structures and affect the connection rather than the client or game. The actual data for the packet is passed after the first byte.

Packet Opcode Description
Unreliable 0x00 Used to transfer client or game data in an unreliable way, e.g. movement packets which don't need to be acknowledged and the client is OK with missing out on one or two.
Reliable 0x01 Used to transfer client or game data in a reliable way, including a nonce that must be sent back to acknowledge that the packet has been received, else the packet is sent over again until acknowledged.
Hello 0x08 Used to identify the client's connection with a username, the first packet that a client wanting to connect might send.
Disconnect 0x09 Used by either the client or the server to signal a disconnect to stop receiving and sending packets.
Acknowledge 0x0a Used to acknowledge that reliable packets have been received.
Ping 0x0c Used for checking the connection is still active and alive. If pings are repeatedly missed, the server sends a disconnect opcode packet with no reason.
Clone this wiki locally