User
August 30, 2026 ยท View on GitHub
Info
Fetch user info from the server.
- Endpoint Type: Request -> Response
- Source: User
- Target: Server
- Required Scopes:
tachyon.lobby
Request
JSONSchema
{
"title": "UserInfoRequest",
"tachyon": {
"source": "user",
"target": "server",
"scopes": ["tachyon.lobby"]
},
"type": "object",
"properties": {
"type": { "const": "request" },
"messageId": { "type": "string" },
"commandId": { "const": "user/info" },
"data": {
"title": "UserInfoRequestData",
"type": "object",
"properties": { "userId": { "$ref": "#/definitions/userId" } },
"required": ["userId"]
}
},
"required": ["type", "messageId", "commandId", "data"]
}
Example
{
"type": "request",
"messageId": "Lorem nulla sed aute",
"commandId": "user/info",
"data": {
"userId": "351"
}
}
TypeScript Definition
export type UserId = string;
export interface UserInfoRequest {
type: "request";
messageId: string;
commandId: "user/info";
data: UserInfoRequestData;
}
export interface UserInfoRequestData {
userId: UserId;
}
Response
JSONSchema
{
"title": "UserInfoResponse",
"tachyon": {
"source": "server",
"target": "user",
"scopes": ["tachyon.lobby"]
},
"anyOf": [
{
"title": "UserInfoOkResponse",
"type": "object",
"properties": {
"type": { "const": "response" },
"messageId": { "type": "string" },
"commandId": { "const": "user/info" },
"status": { "const": "success" },
"data": {
"$ref": "#/definitions/user",
"title": "UserInfoOkResponseData"
}
},
"required": ["type", "messageId", "commandId", "status", "data"]
},
{
"title": "UserInfoFailResponse",
"type": "object",
"properties": {
"type": { "const": "response" },
"messageId": { "type": "string" },
"commandId": { "const": "user/info" },
"status": { "const": "failed" },
"reason": {
"enum": [
"unknown_user",
"internal_error",
"unauthorized",
"invalid_request",
"command_unimplemented"
]
},
"details": { "type": "string" }
},
"required": ["type", "messageId", "commandId", "status", "reason"]
}
]
}
Example
{
"type": "response",
"messageId": "ex pariatur deserunt mollit ad",
"commandId": "user/info",
"status": "success",
"data": {
"userId": "351",
"username": "enim ad in minim est",
"displayName": "culpa exercitation Lorem cillum fugiat",
"clanBaseData": null,
"countryCode": "incididunt dolore est enim",
"status": "offline",
"rating": {
"value": -90001225.47149658
},
"roles": [
"contributor",
"tournament_winner",
"admin",
"tournament_caster",
"moderator"
]
}
}
TypeScript Definition
export type UserId = string;
export type ClanId = string;
export interface UserInfoOkResponse {
type: "response";
messageId: string;
commandId: "user/info";
status: "success";
data: UserInfoOkResponseData;
}
export interface UserInfoOkResponseData {
userId: UserId;
username: string;
displayName: string;
clanBaseData:
| ({
clanId: ClanId;
} & ClanUpdateableBaseData)
| null;
countryCode?: string;
status: "offline" | "menu" | "playing" | "lobby";
rating?: {
value: number;
};
roles?: ("contributor" | "admin" | "moderator" | "tournament_winner" | "tournament_caster")[];
}
export interface ClanUpdateableBaseData {
name: string;
tag: string;
language: string;
}
Possible Failed Reasons: unknown_user, internal_error, unauthorized, invalid_request, command_unimplemented
Report
Issue a single moderation report on one or more users.
- Endpoint Type: Request -> Response
- Source: User
- Target: Server
- Required Scopes:
tachyon.lobby
Request
JSONSchema
{
"title": "UserReportRequest",
"tachyon": {
"source": "user",
"target": "server",
"scopes": ["tachyon.lobby"]
},
"type": "object",
"properties": {
"type": { "const": "request" },
"messageId": { "type": "string" },
"commandId": { "const": "user/report" },
"data": {
"title": "UserReportRequestData",
"type": "object",
"properties": {
"userIds": {
"type": "array",
"items": { "$ref": "#/definitions/userId" }
},
"reason": {
"type": "object",
"properties": { "type": { "type": "string" } },
"required": ["type"]
},
"message": { "type": "string" }
},
"required": ["userIds", "reason"]
}
},
"required": ["type", "messageId", "commandId", "data"]
}
Example
{
"type": "request",
"messageId": "consequat",
"commandId": "user/report",
"data": {
"userIds": [],
"reason": {
"type": "incididunt dolor nisi sunt"
}
}
}
TypeScript Definition
export type UserId = string;
export interface UserReportRequest {
type: "request";
messageId: string;
commandId: "user/report";
data: UserReportRequestData;
}
export interface UserReportRequestData {
userIds: UserId[];
reason: {
type: string;
};
message?: string;
}
Response
JSONSchema
{
"title": "UserReportResponse",
"tachyon": {
"source": "server",
"target": "user",
"scopes": ["tachyon.lobby"]
},
"anyOf": [
{
"title": "UserReportOkResponse",
"type": "object",
"properties": {
"type": { "const": "response" },
"messageId": { "type": "string" },
"commandId": { "const": "user/report" },
"status": { "const": "success" }
},
"required": ["type", "messageId", "commandId", "status"]
},
{
"title": "UserReportFailResponse",
"type": "object",
"properties": {
"type": { "const": "response" },
"messageId": { "type": "string" },
"commandId": { "const": "user/report" },
"status": { "const": "failed" },
"reason": {
"enum": [
"unknown_user",
"internal_error",
"unauthorized",
"invalid_request",
"command_unimplemented"
]
},
"details": { "type": "string" }
},
"required": ["type", "messageId", "commandId", "status", "reason"]
}
]
}
Example
{
"type": "response",
"messageId": "ea ut anim occaecat",
"commandId": "user/report",
"status": "success"
}
TypeScript Definition
export interface UserReportOkResponse {
type: "response";
messageId: string;
commandId: "user/report";
status: "success";
}
Possible Failed Reasons: unknown_user, internal_error, unauthorized, invalid_request, command_unimplemented
Self
Sent by the server to inform the client of its own user state. This event should be sent to a user when they login.
- Endpoint Type: Event
- Source: Server
- Target: User
- Required Scopes:
tachyon.lobby
Event
JSONSchema
{
"title": "UserSelfEvent",
"tachyon": {
"source": "server",
"target": "user",
"scopes": ["tachyon.lobby"]
},
"type": "object",
"properties": {
"type": { "const": "event" },
"messageId": { "type": "string" },
"commandId": { "const": "user/self" },
"data": {
"title": "UserSelfEventData",
"type": "object",
"properties": { "user": { "$ref": "#/definitions/privateUser" } },
"required": ["user"]
}
},
"required": ["type", "messageId", "commandId", "data"]
}
Example
{
"type": "event",
"messageId": "veniam ut ad cillum quis",
"commandId": "user/self",
"data": {
"user": {
"userId": "351",
"username": "amet qui cillum occaecat",
"displayName": "Lorem pariatur anim minim in",
"clanBaseData": {
"clanId": "12345",
"name": "in ut d",
"tag": "enim",
"language": "consequat eu culpa voluptate Lorem"
},
"countryCode": "adipisicing dolor sint eiusmod cillum",
"status": "offline",
"party": {
"id": "1882f6b2e3a4d14f24acb7aa",
"members": [
{
"userId": "351",
"joinedAt": 1705432698000000
},
{
"userId": "351",
"joinedAt": 1705432698000000
},
{
"userId": "351",
"joinedAt": 1705432698000000
},
{
"userId": "351",
"joinedAt": 1705432698000000
}
],
"maxMembers": 35542220,
"invited": [
{
"userId": "351",
"invitedAt": 1705432698000000
},
{
"userId": "351",
"invitedAt": 1705432698000000
},
{
"userId": "351",
"invitedAt": 1705432698000000
}
]
},
"invitedToParties": [],
"friendIds": [],
"outgoingFriendRequest": [
{
"to": {},
"sentAt": {}
},
{
"to": {},
"sentAt": {}
},
{
"to": {},
"sentAt": {}
},
{
"to": {},
"sentAt": {}
},
{
"to": {},
"sentAt": {}
}
],
"incomingFriendRequest": [
{
"from": {},
"sentAt": {}
},
{
"from": {},
"sentAt": {}
},
{
"from": {},
"sentAt": {}
},
{
"from": {},
"sentAt": {}
},
{
"from": {},
"sentAt": {}
}
],
"ignoreIds": [],
"currentBattle": {
"battleId": "75bfc493-2b9d-495d-a453-06722fdca2ea",
"username": "amet nulla",
"password": "quis eiusmod in ut veniam",
"ips": [
"38c9:73c9:bfd1:63bc:f84a:6005:cd0c:8549",
"15.28.128.124",
"44.32.74.70"
],
"port": 19974,
"engine": {
"version": "deserunt esse"
},
"game": {
"springName": "labore in"
},
"map": {
"springName": "quis in veniam sed"
}
},
"currentLobby": null,
"clanInvites": [
"12345",
"12345",
"12345",
"12345"
],
"matchmaking": {
"state": "no_matchmaking"
}
}
}
}
TypeScript Definition
export type PrivateUser = User & {
party: PartyState | null;
invitedToParties: PartyState[];
friendIds: UserId[];
outgoingFriendRequest: {
to: UserId;
sentAt: UnixTime;
}[];
incomingFriendRequest: {
from: UserId;
sentAt: UnixTime;
}[];
ignoreIds: UserId[];
currentBattle?: PrivateBattle;
currentLobby: LobbyId | null;
clanInvites: ClanId[];
matchmaking:
| {
state: "no_matchmaking";
}
| {
state: "queuing";
queues: [
{
id: string;
version: string;
},
...{
id: string;
version: string;
}[]
];
}
| {
state: "found";
queue: {
id: string;
version: string;
timeoutAt: UnixTime;
hasAlreadyReadied: boolean;
};
otherQueues: {
id: string;
version: string;
}[];
};
};
export type UserId = string;
export type ClanId = string;
export type PartyId = string;
export type UnixTime = number;
export type BattleId = string;
export type LobbyId = string;
export interface UserSelfEvent {
type: "event";
messageId: string;
commandId: "user/self";
data: UserSelfEventData;
}
export interface UserSelfEventData {
user: PrivateUser;
}
export interface User {
userId: UserId;
username: string;
displayName: string;
clanBaseData:
| ({
clanId: ClanId;
} & ClanUpdateableBaseData)
| null;
countryCode?: string;
status: "offline" | "menu" | "playing" | "lobby";
rating?: {
value: number;
};
roles?: ("contributor" | "admin" | "moderator" | "tournament_winner" | "tournament_caster")[];
}
export interface ClanUpdateableBaseData {
name: string;
tag: string;
language: string;
}
export interface PartyState {
id: PartyId;
members: {
userId: UserId;
joinedAt: UnixTime;
}[];
maxMembers: number;
invited: {
userId: UserId;
invitedAt: UnixTime;
}[];
}
export interface PrivateBattle {
battleId: BattleId;
username: string;
password: string;
ips: string[];
port: number;
engine: {
version: string;
};
game: {
springName: string;
};
map: {
springName: string;
};
}
SubscribeUpdates
Ask the server to send updates about theses users. A maximum of 100 userIds can be subscribed to at any given time.
- Endpoint Type: Request -> Response
- Source: User
- Target: Server
- Required Scopes:
tachyon.lobby
Request
JSONSchema
{
"title": "UserSubscribeUpdatesRequest",
"tachyon": {
"source": "user",
"target": "server",
"scopes": ["tachyon.lobby"]
},
"type": "object",
"properties": {
"type": { "const": "request" },
"messageId": { "type": "string" },
"commandId": { "const": "user/subscribeUpdates" },
"data": {
"title": "UserSubscribeUpdatesRequestData",
"type": "object",
"properties": {
"userIds": {
"type": "array",
"items": { "$ref": "#/definitions/userId" },
"minItems": 1,
"maxItems": 100
}
},
"required": ["userIds"]
}
},
"required": ["type", "messageId", "commandId", "data"]
}
Example
{
"type": "request",
"messageId": "aute mollit proident sunt dolore",
"commandId": "user/subscribeUpdates",
"data": {
"userIds": [
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351"
]
}
}
TypeScript Definition
export type UserId = string;
export interface UserSubscribeUpdatesRequest {
type: "request";
messageId: string;
commandId: "user/subscribeUpdates";
data: UserSubscribeUpdatesRequestData;
}
export interface UserSubscribeUpdatesRequestData {
userIds: [UserId, ...UserId[]];
}
Response
JSONSchema
{
"title": "UserSubscribeUpdatesResponse",
"tachyon": {
"source": "server",
"target": "user",
"scopes": ["tachyon.lobby"]
},
"anyOf": [
{
"title": "UserSubscribeUpdatesOkResponse",
"type": "object",
"properties": {
"type": { "const": "response" },
"messageId": { "type": "string" },
"commandId": { "const": "user/subscribeUpdates" },
"status": { "const": "success" }
},
"required": ["type", "messageId", "commandId", "status"]
},
{
"title": "UserSubscribeUpdatesFailResponse",
"type": "object",
"properties": {
"type": { "const": "response" },
"messageId": { "type": "string" },
"commandId": { "const": "user/subscribeUpdates" },
"status": { "const": "failed" },
"reason": {
"enum": [
"subscription_limit_reached",
"internal_error",
"unauthorized",
"invalid_request",
"command_unimplemented"
]
},
"details": { "type": "string" }
},
"required": ["type", "messageId", "commandId", "status", "reason"]
}
]
}
Example
{
"type": "response",
"messageId": "ullamco eiusmod cillum Excepteur",
"commandId": "user/subscribeUpdates",
"status": "success"
}
TypeScript Definition
export interface UserSubscribeUpdatesOkResponse {
type: "response";
messageId: string;
commandId: "user/subscribeUpdates";
status: "success";
}
Possible Failed Reasons: subscription_limit_reached, internal_error, unauthorized, invalid_request, command_unimplemented
UnsubscribeUpdates
Ask the server to stop sending user updates for the given set of userId. This should always succeed.
- Endpoint Type: Request -> Response
- Source: User
- Target: Server
- Required Scopes:
tachyon.lobby
Request
JSONSchema
{
"title": "UserUnsubscribeUpdatesRequest",
"tachyon": {
"source": "user",
"target": "server",
"scopes": ["tachyon.lobby"]
},
"type": "object",
"properties": {
"type": { "const": "request" },
"messageId": { "type": "string" },
"commandId": { "const": "user/unsubscribeUpdates" },
"data": {
"title": "UserUnsubscribeUpdatesRequestData",
"type": "object",
"properties": {
"userIds": {
"type": "array",
"items": { "$ref": "#/definitions/userId" },
"minItems": 1,
"maxItems": 100
}
},
"required": ["userIds"]
}
},
"required": ["type", "messageId", "commandId", "data"]
}
Example
{
"type": "request",
"messageId": "commodo aute eiusmod adipisicing anim",
"commandId": "user/unsubscribeUpdates",
"data": {
"userIds": [
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351",
"351"
]
}
}
TypeScript Definition
export type UserId = string;
export interface UserUnsubscribeUpdatesRequest {
type: "request";
messageId: string;
commandId: "user/unsubscribeUpdates";
data: UserUnsubscribeUpdatesRequestData;
}
export interface UserUnsubscribeUpdatesRequestData {
userIds: [UserId, ...UserId[]];
}
Response
JSONSchema
{
"title": "UserUnsubscribeUpdatesResponse",
"tachyon": {
"source": "server",
"target": "user",
"scopes": ["tachyon.lobby"]
},
"anyOf": [
{
"title": "UserUnsubscribeUpdatesOkResponse",
"type": "object",
"properties": {
"type": { "const": "response" },
"messageId": { "type": "string" },
"commandId": { "const": "user/unsubscribeUpdates" },
"status": { "const": "success" }
},
"required": ["type", "messageId", "commandId", "status"]
},
{
"title": "UserUnsubscribeUpdatesFailResponse",
"type": "object",
"properties": {
"type": { "const": "response" },
"messageId": { "type": "string" },
"commandId": { "const": "user/unsubscribeUpdates" },
"status": { "const": "failed" },
"reason": {
"enum": [
"internal_error",
"unauthorized",
"invalid_request",
"command_unimplemented"
]
},
"details": { "type": "string" }
},
"required": ["type", "messageId", "commandId", "status", "reason"]
}
]
}
Example
{
"type": "response",
"messageId": "minim adipisicing",
"commandId": "user/unsubscribeUpdates",
"status": "success"
}
TypeScript Definition
export interface UserUnsubscribeUpdatesOkResponse {
type: "response";
messageId: string;
commandId: "user/unsubscribeUpdates";
status: "success";
}
Possible Failed Reasons: internal_error, unauthorized, invalid_request, command_unimplemented
Updated
Sent by the server to inform the client of user state changes. User objects should be full when first sent, then only updates gets sent.
- Endpoint Type: Event
- Source: Server
- Target: User
- Required Scopes:
tachyon.lobby
Event
JSONSchema
{
"title": "UserUpdatedEvent",
"tachyon": {
"source": "server",
"target": "user",
"scopes": ["tachyon.lobby"]
},
"type": "object",
"properties": {
"type": { "const": "event" },
"messageId": { "type": "string" },
"commandId": { "const": "user/updated" },
"data": {
"title": "UserUpdatedEventData",
"type": "object",
"properties": {
"users": {
"type": "array",
"items": {
"type": "object",
"properties": {
"userId": { "$ref": "#/definitions/userId" },
"username": { "type": "string" },
"displayName": { "type": "string" },
"clanBaseData": {
"anyOf": [
{
"allOf": [
{
"type": "object",
"properties": {
"clanId": {
"$ref": "#/definitions/clanId"
}
},
"required": ["clanId"]
},
{
"$ref": "#/definitions/clanUpdateableBaseData"
}
]
},
{ "type": "null" }
]
},
"countryCode": { "type": "string" },
"status": {
"enum": ["offline", "menu", "playing", "lobby"]
},
"rating": {
"type": "object",
"properties": {
"value": {
"description": "Key is omitted when the player isn't rated yet.",
"type": "number"
}
},
"required": ["value"]
},
"roles": {
"type": "array",
"items": {
"enum": [
"contributor",
"admin",
"moderator",
"tournament_winner",
"tournament_caster"
]
},
"uniqueItems": true
}
}
}
}
},
"required": ["users"]
}
},
"required": ["type", "messageId", "commandId", "data"]
}
Example
{
"type": "event",
"messageId": "ad",
"commandId": "user/updated",
"data": {
"users": [
{
"reprehenderit_1": -69989050,
"eiusmod_9_1": 27231049.53765869,
"exd": true,
"Excepteurc1": true,
"mollit_b": false,
"voluptate8a3": 84426176.54800415,
"userId": "351",
"status": "lobby",
"rating": {
"value": -7566881.17980957
}
},
{
"displayName": "dolore laboris non pariatur"
},
{
"do_afe": 77962529,
"cupidatat__6": 47290003.299713135,
"countryCode": "id",
"rating": {
"value": 40300142.765045166
}
},
{
"adipisicing_8e1": 97860765,
"labore_3f7": -1436126.2321472168,
"nisie79": "nostrud Lorem laborum tempor magna",
"ipsum_286": "nulla quis anim esse",
"userId": "351",
"roles": [
"moderator"
]
}
]
}
}
TypeScript Definition
export type UserId = string;
export type ClanId = string;
export interface UserUpdatedEvent {
type: "event";
messageId: string;
commandId: "user/updated";
data: UserUpdatedEventData;
}
export interface UserUpdatedEventData {
users: {
userId?: UserId;
username?: string;
displayName?: string;
clanBaseData?:
| ({
clanId: ClanId;
} & ClanUpdateableBaseData)
| null;
countryCode?: string;
status?: "offline" | "menu" | "playing" | "lobby";
rating?: {
value: number;
};
roles?: ("contributor" | "admin" | "moderator" | "tournament_winner" | "tournament_caster")[];
}[];
}
export interface ClanUpdateableBaseData {
name: string;
tag: string;
language: string;
}