valorant-api-types
Version:
A collection of documented endpoints and return types for the unofficial Valorant API
333 lines • 15.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.loadoutsSchema = exports.chatMessagesSchema = exports.conversationsSchema = exports.contractsResponse = exports.pregameMatchSchema = exports.offerSchema = exports.partyPlayerSchema = exports.partySchema = exports.platformSchema = exports.currencyIDSchema = exports.armorIDSchema = exports.itemTypeIDSchema = exports.itemIDSchema = exports.xpModificationIDSchema = exports.preferredLevelBorderIDSchema = exports.titleIDSchema = exports.cardIDSchema = exports.characterIDSchema = exports.mapIDSchema = exports.queueIDSchema = exports.seasonIDSchema = exports.millisSchema = exports.dateSchema = exports.gameModeSchema = exports.partyIDSchema = exports.currentGameIDSchema = exports.pregameIDSchema = exports.matchIDSchema = exports.playerUUIDSchema = exports.stringBooleanSchema = exports.weakUUIDSchema = void 0;
const zod_1 = require("zod");
// Zod's UUID type is too strict, so we use a weaker regex
exports.weakUUIDSchema = zod_1.z.string().regex(/^([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})$/i).describe('UUID');
exports.stringBooleanSchema = zod_1.z.string().transform(val => val === 'true');
exports.playerUUIDSchema = exports.weakUUIDSchema.describe('Player UUID');
exports.matchIDSchema = exports.weakUUIDSchema.describe('Match ID');
exports.pregameIDSchema = exports.weakUUIDSchema.describe('Pre-Game Match ID');
exports.currentGameIDSchema = exports.weakUUIDSchema.describe('Current Game Match ID');
exports.partyIDSchema = exports.weakUUIDSchema.describe('Party ID');
exports.gameModeSchema = zod_1.z.string().describe('Game Mode');
exports.dateSchema = zod_1.z.string().datetime().transform(val => new Date(val)).describe('Date in ISO 8601 format');
exports.millisSchema = zod_1.z.number().transform(val => new Date(val)).describe('Milliseconds since epoch');
// IDs that can be derived from game files
exports.seasonIDSchema = exports.weakUUIDSchema.describe('Season ID');
exports.queueIDSchema = zod_1.z.string().describe('Queue ID');
exports.mapIDSchema = zod_1.z.string().describe('Map ID');
exports.characterIDSchema = exports.weakUUIDSchema.describe('Character ID');
exports.cardIDSchema = exports.weakUUIDSchema.describe('Card ID');
exports.titleIDSchema = exports.weakUUIDSchema.describe('Title ID');
exports.preferredLevelBorderIDSchema = exports.weakUUIDSchema.or(zod_1.z.literal("")).describe('Preferred Level Border ID');
exports.xpModificationIDSchema = zod_1.z.string().describe('XP Modification ID');
exports.itemIDSchema = exports.weakUUIDSchema.describe('Item ID');
exports.itemTypeIDSchema = exports.weakUUIDSchema.describe('Item Type ID');
exports.armorIDSchema = exports.weakUUIDSchema.describe('Armor ID');
exports.currencyIDSchema = exports.weakUUIDSchema.describe('Currency ID');
exports.platformSchema = zod_1.z.object({
platformType: zod_1.z.literal('PC'),
platformOS: zod_1.z.literal('Windows'),
platformOSVersion: zod_1.z.string(),
platformChipset: zod_1.z.literal('Unknown')
});
const partyMembershipSchema = zod_1.z.array(zod_1.z.object({ Subject: exports.playerUUIDSchema })).nullable();
exports.partySchema = zod_1.z.object({
ID: exports.partyIDSchema,
MUCName: zod_1.z.string(),
VoiceRoomID: zod_1.z.string(),
Version: zod_1.z.number(),
ClientVersion: zod_1.z.string(),
Members: zod_1.z.array(zod_1.z.object({
Subject: exports.playerUUIDSchema,
CompetitiveTier: zod_1.z.number(),
PlayerIdentity: zod_1.z.object({
Subject: exports.playerUUIDSchema,
PlayerCardID: exports.cardIDSchema,
PlayerTitleID: exports.titleIDSchema,
AccountLevel: zod_1.z.number(),
PreferredLevelBorderID: exports.preferredLevelBorderIDSchema,
Incognito: zod_1.z.boolean(),
HideAccountLevel: zod_1.z.boolean()
}),
SeasonalBadgeInfo: zod_1.z.null(),
IsOwner: zod_1.z.boolean().optional(),
QueueEligibleRemainingAccountLevels: zod_1.z.number(),
Pings: zod_1.z.array(zod_1.z.object({
Ping: zod_1.z.number(),
GamePodID: zod_1.z.string()
})),
IsReady: zod_1.z.boolean(),
IsModerator: zod_1.z.boolean(),
UseBroadcastHUD: zod_1.z.boolean(),
PlatformType: exports.platformSchema.shape.platformType
})),
State: zod_1.z.string(),
PreviousState: zod_1.z.string(),
StateTransitionReason: zod_1.z.string(),
Accessibility: zod_1.z.union([zod_1.z.literal('OPEN'), zod_1.z.literal('CLOSED')]),
CustomGameData: zod_1.z.object({
Settings: zod_1.z.object({
Map: exports.mapIDSchema,
Mode: exports.gameModeSchema,
UseBots: zod_1.z.boolean(),
GamePod: zod_1.z.string(),
GameRules: zod_1.z.object({
AllowGameModifiers: exports.stringBooleanSchema.optional(),
IsOvertimeWinByTwo: exports.stringBooleanSchema.optional(),
PlayOutAllRounds: exports.stringBooleanSchema.optional(),
SkipMatchHistory: exports.stringBooleanSchema.optional(),
TournamentMode: exports.stringBooleanSchema.optional()
}).nullable()
}),
Membership: zod_1.z.object({
teamOne: partyMembershipSchema,
teamTwo: partyMembershipSchema,
teamSpectate: partyMembershipSchema,
teamOneCoaches: partyMembershipSchema,
teamTwoCoaches: partyMembershipSchema
}),
MaxPartySize: zod_1.z.number(),
AutobalanceEnabled: zod_1.z.boolean(),
AutobalanceMinPlayers: zod_1.z.number(),
HasRecoveryData: zod_1.z.boolean()
}),
MatchmakingData: zod_1.z.object({
QueueID: exports.queueIDSchema,
PreferredGamePods: zod_1.z.array(zod_1.z.string()),
SkillDisparityRRPenalty: zod_1.z.number()
}),
Invites: zod_1.z.null(),
Requests: zod_1.z.array(zod_1.z.unknown()),
QueueEntryTime: exports.dateSchema,
ErrorNotification: zod_1.z.object({
ErrorType: zod_1.z.string(),
ErroredPlayers: partyMembershipSchema
}),
RestrictedSeconds: zod_1.z.number(),
EligibleQueues: zod_1.z.array(zod_1.z.string()),
QueueIneligibilities: zod_1.z.array(zod_1.z.string()),
CheatData: zod_1.z.object({
GamePodOverride: zod_1.z.string(),
ForcePostGameProcessing: zod_1.z.boolean()
}),
XPBonuses: zod_1.z.array(zod_1.z.unknown()),
InviteCode: zod_1.z.string().describe('Empty string when there is no invite code')
});
exports.partyPlayerSchema = zod_1.z.object({
Subject: exports.playerUUIDSchema,
Version: zod_1.z.number(),
CurrentPartyID: exports.partyIDSchema,
Invites: zod_1.z.null(),
Requests: zod_1.z.array(zod_1.z.object({
ID: zod_1.z.string(),
PartyID: exports.partyIDSchema,
RequestedBySubject: exports.playerUUIDSchema,
Subjects: zod_1.z.array(exports.playerUUIDSchema),
CreatedAt: exports.dateSchema,
RefreshedAt: exports.dateSchema,
ExpiresIn: zod_1.z.number()
})),
PlatformInfo: exports.platformSchema
});
exports.offerSchema = zod_1.z.object({
OfferID: zod_1.z.string(),
IsDirectPurchase: zod_1.z.boolean(),
StartDate: exports.dateSchema,
Cost: zod_1.z.record(exports.currencyIDSchema, zod_1.z.number()),
Rewards: zod_1.z.array(zod_1.z.object({
ItemTypeID: exports.itemTypeIDSchema,
ItemID: exports.itemIDSchema,
Quantity: zod_1.z.number()
}))
});
const pregameTeamSchema = zod_1.z.object({
TeamID: zod_1.z.enum(['Blue', 'Red']).or(exports.playerUUIDSchema),
Players: zod_1.z.array(zod_1.z.object({
Subject: exports.playerUUIDSchema,
CharacterID: exports.characterIDSchema,
CharacterSelectionState: zod_1.z.enum(['', 'selected', 'locked']),
PregamePlayerState: zod_1.z.enum(['joined']),
CompetitiveTier: zod_1.z.number(),
PlayerIdentity: zod_1.z.object({
Subject: exports.playerUUIDSchema,
PlayerCardID: exports.cardIDSchema,
PlayerTitleID: exports.titleIDSchema,
AccountLevel: zod_1.z.number(),
PreferredLevelBorderID: exports.preferredLevelBorderIDSchema,
Incognito: zod_1.z.boolean(),
HideAccountLevel: zod_1.z.boolean()
}),
SeasonalBadgeInfo: zod_1.z.object({
SeasonID: exports.seasonIDSchema.or(zod_1.z.literal('')),
NumberOfWins: zod_1.z.number(),
WinsByTier: zod_1.z.null(),
Rank: zod_1.z.number(),
LeaderboardRank: zod_1.z.number()
}),
IsCaptain: zod_1.z.boolean()
}))
});
exports.pregameMatchSchema = zod_1.z.object({
ID: exports.pregameIDSchema,
Version: zod_1.z.number(),
Teams: zod_1.z.array(pregameTeamSchema),
AllyTeam: pregameTeamSchema.nullable(),
EnemyTeam: pregameTeamSchema.nullable(),
ObserverSubjects: zod_1.z.array(zod_1.z.unknown()),
MatchCoaches: zod_1.z.array(zod_1.z.unknown()),
EnemyTeamSize: zod_1.z.number(),
EnemyTeamLockCount: zod_1.z.number(),
PregameState: zod_1.z.enum(['character_select_active', 'provisioned']),
LastUpdated: exports.dateSchema,
MapID: exports.mapIDSchema,
MapSelectPool: zod_1.z.array(zod_1.z.unknown()),
BannedMapIDs: zod_1.z.array(zod_1.z.unknown()),
CastedVotes: zod_1.z.unknown(),
MapSelectSteps: zod_1.z.array(zod_1.z.unknown()),
MapSelectStep: zod_1.z.number(),
Team1: zod_1.z.enum(['Blue', 'Red']).or(exports.playerUUIDSchema),
GamePodID: zod_1.z.string(),
Mode: exports.gameModeSchema,
VoiceSessionID: zod_1.z.string(),
MUCName: zod_1.z.string(),
TeamMatchToken: zod_1.z.string().describe('JWT containing match ID and player IDs'),
QueueID: exports.queueIDSchema.or(zod_1.z.literal('')),
ProvisioningFlowID: zod_1.z.enum(['Matchmaking', 'CustomGame']),
IsRanked: zod_1.z.boolean(),
PhaseTimeRemainingNS: zod_1.z.number(),
StepTimeRemainingNS: zod_1.z.number(),
altModesFlagADA: zod_1.z.boolean(),
TournamentMetadata: zod_1.z.null(),
RosterMetadata: zod_1.z.null()
});
exports.contractsResponse = zod_1.z.object({
Version: zod_1.z.number(),
Subject: exports.playerUUIDSchema,
Contracts: zod_1.z.array(zod_1.z.object({
ContractDefinitionID: exports.weakUUIDSchema,
ContractProgression: zod_1.z.object({
TotalProgressionEarned: zod_1.z.number(),
TotalProgressionEarnedVersion: zod_1.z.number(),
HighestRewardedLevel: zod_1.z.record(zod_1.z.object({
Amount: zod_1.z.number(),
Version: zod_1.z.number()
}))
}),
ProgressionLevelReached: zod_1.z.number(),
ProgressionTowardsNextLevel: zod_1.z.number()
})),
ProcessedMatches: zod_1.z.array(zod_1.z.object({
ID: exports.matchIDSchema,
StartTime: exports.millisSchema,
XPGrants: zod_1.z.object({
GamePlayed: zod_1.z.number(),
GameWon: zod_1.z.number(),
RoundPlayed: zod_1.z.number(),
RoundWon: zod_1.z.number(),
Missions: zod_1.z.object({}),
Modifier: zod_1.z.object({
Value: zod_1.z.number(),
BaseMultiplierValue: zod_1.z.number(),
Modifiers: zod_1.z.array(zod_1.z.object({
Value: zod_1.z.number(),
Name: zod_1.z.enum(['RESTRICTIONS_XP', 'PREMIUM_CONTRACT_XP']),
BaseOnly: zod_1.z.boolean()
}))
}),
NumAFKRounds: zod_1.z.number()
}).nullable(),
RewardGrants: zod_1.z.object({}).nullable(),
MissionDeltas: zod_1.z.record(exports.weakUUIDSchema, zod_1.z.object({
ID: exports.weakUUIDSchema,
Objectives: zod_1.z.record(exports.weakUUIDSchema, zod_1.z.number()),
ObjectiveDeltas: zod_1.z.record(exports.weakUUIDSchema, zod_1.z.object({
ID: exports.weakUUIDSchema,
ProgressBefore: zod_1.z.number(),
ProgressAfter: zod_1.z.number()
}))
})).nullable(),
ContractDeltas: zod_1.z.record(exports.weakUUIDSchema, zod_1.z.object({
ID: exports.weakUUIDSchema,
TotalXPBefore: zod_1.z.number(),
TotalXPAfter: zod_1.z.number(),
})).nullable(),
CouldProgressMissions: zod_1.z.boolean()
})),
ActiveSpecialContract: exports.weakUUIDSchema,
Missions: zod_1.z.array(zod_1.z.object({
ID: exports.weakUUIDSchema,
Objectives: zod_1.z.record(exports.weakUUIDSchema, zod_1.z.number()),
Complete: zod_1.z.boolean(),
ExpirationTime: exports.dateSchema
})),
MissionMetadata: zod_1.z.object({
NPECompleted: zod_1.z.boolean(),
WeeklyCheckpoint: exports.dateSchema,
WeeklyRefillTime: exports.dateSchema
})
});
exports.conversationsSchema = zod_1.z.object({
conversations: zod_1.z.array(zod_1.z.object({
cid: zod_1.z.string(),
direct_messages: zod_1.z.boolean(),
global_readership: zod_1.z.boolean(),
message_history: zod_1.z.boolean(),
mid: zod_1.z.string(),
muted: zod_1.z.boolean(),
mutedRestriction: zod_1.z.boolean(),
type: zod_1.z.enum(['groupchat', 'chat']),
uiState: zod_1.z.object({
changedSinceHidden: zod_1.z.boolean(),
hidden: zod_1.z.boolean()
}),
unread_count: zod_1.z.number()
}))
});
exports.chatMessagesSchema = zod_1.z.object({
messages: zod_1.z.array(zod_1.z.object({
body: zod_1.z.string(),
cid: zod_1.z.string(),
game_name: zod_1.z.string(),
game_tag: zod_1.z.string(),
id: zod_1.z.string(),
mid: zod_1.z.string(),
name: zod_1.z.string(),
pid: zod_1.z.string(),
puuid: exports.playerUUIDSchema,
read: zod_1.z.boolean(),
region: zod_1.z.string(),
time: zod_1.z.string().transform(s => new Date(Number(s))).describe('Time in milliseconds since epoch'),
type: zod_1.z.enum(['chat', 'groupchat'])
}))
});
exports.loadoutsSchema = zod_1.z.object({
Subject: exports.playerUUIDSchema,
Sprays: zod_1.z.object({
SpraySelections: zod_1.z.array(zod_1.z.object({
SocketID: exports.weakUUIDSchema,
SprayID: exports.weakUUIDSchema,
LevelID: exports.weakUUIDSchema
}))
}),
Expressions: zod_1.z.object({
AESSelections: zod_1.z.array(zod_1.z.object({
SocketID: exports.weakUUIDSchema,
AssetID: exports.weakUUIDSchema,
TypeID: exports.weakUUIDSchema
}))
}),
Items: zod_1.z.record(zod_1.z.object({
ID: exports.itemIDSchema,
TypeID: exports.itemTypeIDSchema,
Sockets: zod_1.z.record(zod_1.z.object({
ID: exports.weakUUIDSchema,
Item: zod_1.z.object({
ID: exports.itemIDSchema,
TypeID: exports.itemTypeIDSchema
})
}))
}))
});
//# sourceMappingURL=commonTypes.js.map