@yaelouuu/fortnite-api 9.0.0 → 9.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -3
- package/dist/resources/tournaments.d.ts +36 -6
- package/dist/resources/tournaments.js +37 -5
- package/dist/types/index.d.ts +27 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -115,7 +115,9 @@ const tracker = await client.tournaments.getTracker(
|
|
|
115
115
|
"accountId",
|
|
116
116
|
"fortniteToken"
|
|
117
117
|
);
|
|
118
|
-
// Returns:
|
|
118
|
+
// Returns: tournaments the player took part in over the last 180 days.
|
|
119
|
+
// The first call for an account queues a backfill of a few minutes: while
|
|
120
|
+
// tracker.history.complete is false the count is a lower bound — re-poll.
|
|
119
121
|
```
|
|
120
122
|
|
|
121
123
|
#### Player Result in One Tournament — **no user token**
|
|
@@ -135,8 +137,8 @@ console.log(result.teamAccountIds.length); // 2 -> team size
|
|
|
135
137
|
console.log(result.matches[0].trackedStats.PLACEMENT_STAT_INDEX);
|
|
136
138
|
```
|
|
137
139
|
|
|
138
|
-
####
|
|
139
|
-
|
|
140
|
+
#### Recent Tournament Sessions — **token required**
|
|
141
|
+
A player's recent tournament sessions, grouped by event window. Epic keeps roughly the last **36 hours** of this data, so it is not a full history (use the tracker for 180 days), and private custom-key matches never appear. Epic only serves it to the player it belongs to, so a token-less call returns `403`:
|
|
140
142
|
|
|
141
143
|
```typescript
|
|
142
144
|
const matches = await client.tournaments.getPlayerMatches(
|
|
@@ -146,6 +148,18 @@ const matches = await client.tournaments.getPlayerMatches(
|
|
|
146
148
|
);
|
|
147
149
|
```
|
|
148
150
|
|
|
151
|
+
#### Current Match of a Consenting Player — **token required, Custom plan**
|
|
152
|
+
The match a player is in right now, any mode — Battle Royale, Reload, Ranked or a custom-key scrim hosted by anyone. The only route to non-tournament matches: Epic has no match-history listing. `sessionId` is the replay match ID; `playlist` lets you filter for scrims before parsing.
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
const session = await client.tournaments.getPlayerSession("accountId", "fortniteToken");
|
|
156
|
+
if (session.inMatch && session.playlist === "playlist_showdown_cts_solo") {
|
|
157
|
+
console.log(session.sessionId); // parse it with the replay endpoints once the match has ended
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
Read before building on it: the token flow authenticates as the Fortnite client, not as your application — Epic warns the player accordingly, and if you ship an Epic Account Services application its developer terms do not allow routing your users through it (suited to tools a player runs for themselves, not third-party apps asking other players to log in); the token must be that player's **own** (verified — any other account's token is `403`); Fortnite kills every other session of an account when the game launches, so mint it from stored device auth (`/oauth/link`, then `/oauth/refresh-device` on `401`); the response is cached 10 s per account and Epic's party state lags the real match by about 1–2 minutes; the custom key is never returned (`hasCustomKey` only) and teammates appear as account ids only.
|
|
162
|
+
|
|
149
163
|
#### Check Tournament Eligibility
|
|
150
164
|
Verify if a player meets requirements for major tournaments (e.g., 14 tournaments in 180 days):
|
|
151
165
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { FortniteAPI } from "../client";
|
|
2
|
-
import { Leaderboard, TournamentTrackerResponse, TournamentEligibilityResponse, EventTokenEligibilityResponse, CashPrizesResponse, PayoutTable } from "../types";
|
|
2
|
+
import { Leaderboard, TournamentTrackerResponse, TournamentEligibilityResponse, EventTokenEligibilityResponse, CashPrizesResponse, PayoutTable, PlayerSession } from "../types";
|
|
3
3
|
export declare class TournamentsResource {
|
|
4
4
|
private client;
|
|
5
5
|
constructor(client: FortniteAPI);
|
|
@@ -91,18 +91,21 @@ export declare class TournamentsResource {
|
|
|
91
91
|
maxPages?: number;
|
|
92
92
|
}): Promise<any>;
|
|
93
93
|
/**
|
|
94
|
-
*
|
|
94
|
+
* A player's RECENT tournament sessions, grouped by event window. Epic keeps roughly
|
|
95
|
+
* the last 36 hours of this data — it is not a full history. Tournament sessions
|
|
96
|
+
* only: private custom-key matches never appear here.
|
|
95
97
|
*
|
|
96
98
|
* Sourced from Epic's player-scoped download data, which Epic only serves to the
|
|
97
|
-
* player it belongs to — so `fortniteToken` is
|
|
98
|
-
*
|
|
99
|
-
* {@link getPlayerWindowMatches}
|
|
99
|
+
* player it belongs to — so `fortniteToken` is required (without it Epic returns
|
|
100
|
+
* **403**). For a 180-day participation history use {@link getTracker}; for a
|
|
101
|
+
* token-free lookup scoped to one tournament use {@link getPlayerWindowMatches};
|
|
102
|
+
* for the match a player is in right now use {@link getPlayerSession}.
|
|
100
103
|
*
|
|
101
104
|
* @param accountId - Epic Games Account ID
|
|
102
105
|
* @param fortniteToken - Fortnite access token of that same player (from OAuth flow)
|
|
103
106
|
* @param options.after - Only matches ending at or after this UTC timestamp
|
|
104
107
|
* @param options.before - Only matches ending before this UTC timestamp
|
|
105
|
-
* @param options.region - Region for the events catalogue (default: EU).
|
|
108
|
+
* @param options.region - Region for the events catalogue (default: EU). The sessions themselves are global.
|
|
106
109
|
* @param options.platform - Platform (default: Windows)
|
|
107
110
|
*/
|
|
108
111
|
getPlayerMatches(accountId: string, fortniteToken: string, options?: {
|
|
@@ -266,4 +269,31 @@ export declare class TournamentsResource {
|
|
|
266
269
|
eventWindowId: string;
|
|
267
270
|
leaderboardDef?: string;
|
|
268
271
|
}, teams: string[][], fortniteToken?: string): Promise<Leaderboard>;
|
|
272
|
+
/**
|
|
273
|
+
* The match a consenting player is in right now — any mode: Battle Royale, Reload,
|
|
274
|
+
* Ranked, or a custom-key scrim hosted by anyone. This is the only route to a player's
|
|
275
|
+
* non-tournament matches: Epic exposes no match-history listing. **Custom plan.**
|
|
276
|
+
*
|
|
277
|
+
* The token flow authenticates as the Fortnite client, not as your application: Epic warns
|
|
278
|
+
* the player, and Epic Account Services developer terms do not allow routing your users
|
|
279
|
+
* through it — suited to tools a player runs for themselves, not third-party apps asking
|
|
280
|
+
* other players to log in.
|
|
281
|
+
*
|
|
282
|
+
* Requires that player's OWN Fortnite token: it is verified against `accountId` before
|
|
283
|
+
* anything is forwarded (any other account's token returns **403**). Fortnite kills every
|
|
284
|
+
* other session of an account when the game launches, so a token obtained before the
|
|
285
|
+
* player started playing is dead by the time they play — obtain it from stored device
|
|
286
|
+
* auth (`/oauth/link` once, then `/oauth/refresh-device` on 401), not a one-off login.
|
|
287
|
+
*
|
|
288
|
+
* While the player is in a game, `sessionId` is the replay match ID: pass it to the
|
|
289
|
+
* replay endpoints once the match has ended. `playlist` lets you filter (e.g. scrims)
|
|
290
|
+
* before parsing. Cached 10 s per account (polling faster gains nothing); Epic's own
|
|
291
|
+
* party state lags the real match by about 1-2 minutes; a session ID does not change
|
|
292
|
+
* during a match. Never returns the custom match key (`hasCustomKey` only) nor
|
|
293
|
+
* teammates' state (account ids only). `inParty` is false when the client is offline.
|
|
294
|
+
*
|
|
295
|
+
* @param accountId - Epic Games Account ID
|
|
296
|
+
* @param fortniteToken - That same player's Fortnite access token
|
|
297
|
+
*/
|
|
298
|
+
getPlayerSession(accountId: string, fortniteToken: string): Promise<PlayerSession>;
|
|
269
299
|
}
|
|
@@ -127,18 +127,21 @@ class TournamentsResource {
|
|
|
127
127
|
return this.client.request(`/events/${encodeURIComponent(eventId)}/${encodeURIComponent(eventWindowId)}/player/${encodeURIComponent(accountId)}/matches${qs ? `?${qs}` : ""}`);
|
|
128
128
|
}
|
|
129
129
|
/**
|
|
130
|
-
*
|
|
130
|
+
* A player's RECENT tournament sessions, grouped by event window. Epic keeps roughly
|
|
131
|
+
* the last 36 hours of this data — it is not a full history. Tournament sessions
|
|
132
|
+
* only: private custom-key matches never appear here.
|
|
131
133
|
*
|
|
132
134
|
* Sourced from Epic's player-scoped download data, which Epic only serves to the
|
|
133
|
-
* player it belongs to — so `fortniteToken` is
|
|
134
|
-
*
|
|
135
|
-
* {@link getPlayerWindowMatches}
|
|
135
|
+
* player it belongs to — so `fortniteToken` is required (without it Epic returns
|
|
136
|
+
* **403**). For a 180-day participation history use {@link getTracker}; for a
|
|
137
|
+
* token-free lookup scoped to one tournament use {@link getPlayerWindowMatches};
|
|
138
|
+
* for the match a player is in right now use {@link getPlayerSession}.
|
|
136
139
|
*
|
|
137
140
|
* @param accountId - Epic Games Account ID
|
|
138
141
|
* @param fortniteToken - Fortnite access token of that same player (from OAuth flow)
|
|
139
142
|
* @param options.after - Only matches ending at or after this UTC timestamp
|
|
140
143
|
* @param options.before - Only matches ending before this UTC timestamp
|
|
141
|
-
* @param options.region - Region for the events catalogue (default: EU).
|
|
144
|
+
* @param options.region - Region for the events catalogue (default: EU). The sessions themselves are global.
|
|
142
145
|
* @param options.platform - Platform (default: Windows)
|
|
143
146
|
*/
|
|
144
147
|
async getPlayerMatches(accountId, fortniteToken, options) {
|
|
@@ -359,5 +362,34 @@ class TournamentsResource {
|
|
|
359
362
|
}
|
|
360
363
|
return this.client.request(`/events/leaderboard?${query.toString()}`, options, "v2");
|
|
361
364
|
}
|
|
365
|
+
/**
|
|
366
|
+
* The match a consenting player is in right now — any mode: Battle Royale, Reload,
|
|
367
|
+
* Ranked, or a custom-key scrim hosted by anyone. This is the only route to a player's
|
|
368
|
+
* non-tournament matches: Epic exposes no match-history listing. **Custom plan.**
|
|
369
|
+
*
|
|
370
|
+
* The token flow authenticates as the Fortnite client, not as your application: Epic warns
|
|
371
|
+
* the player, and Epic Account Services developer terms do not allow routing your users
|
|
372
|
+
* through it — suited to tools a player runs for themselves, not third-party apps asking
|
|
373
|
+
* other players to log in.
|
|
374
|
+
*
|
|
375
|
+
* Requires that player's OWN Fortnite token: it is verified against `accountId` before
|
|
376
|
+
* anything is forwarded (any other account's token returns **403**). Fortnite kills every
|
|
377
|
+
* other session of an account when the game launches, so a token obtained before the
|
|
378
|
+
* player started playing is dead by the time they play — obtain it from stored device
|
|
379
|
+
* auth (`/oauth/link` once, then `/oauth/refresh-device` on 401), not a one-off login.
|
|
380
|
+
*
|
|
381
|
+
* While the player is in a game, `sessionId` is the replay match ID: pass it to the
|
|
382
|
+
* replay endpoints once the match has ended. `playlist` lets you filter (e.g. scrims)
|
|
383
|
+
* before parsing. Cached 10 s per account (polling faster gains nothing); Epic's own
|
|
384
|
+
* party state lags the real match by about 1-2 minutes; a session ID does not change
|
|
385
|
+
* during a match. Never returns the custom match key (`hasCustomKey` only) nor
|
|
386
|
+
* teammates' state (account ids only). `inParty` is false when the client is offline.
|
|
387
|
+
*
|
|
388
|
+
* @param accountId - Epic Games Account ID
|
|
389
|
+
* @param fortniteToken - That same player's Fortnite access token
|
|
390
|
+
*/
|
|
391
|
+
async getPlayerSession(accountId, fortniteToken) {
|
|
392
|
+
return this.client.request(`/events/player/${encodeURIComponent(accountId)}/session`, { headers: { "x-fortnite-token": fortniteToken } });
|
|
393
|
+
}
|
|
362
394
|
}
|
|
363
395
|
exports.TournamentsResource = TournamentsResource;
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1187,3 +1187,30 @@ export interface SpriteBoonsResponse {
|
|
|
1187
1187
|
status: number;
|
|
1188
1188
|
data: SpriteBoon[];
|
|
1189
1189
|
}
|
|
1190
|
+
/** GET /events/player/{accountId}/session — the match a consenting player is in right now. */
|
|
1191
|
+
export interface PlayerSession {
|
|
1192
|
+
accountId: string;
|
|
1193
|
+
/** False when the player's client is offline; no other field is meaningful then. */
|
|
1194
|
+
inParty: boolean;
|
|
1195
|
+
inMatch: boolean;
|
|
1196
|
+
/** The replay match ID while in a game; null in the lobby or offline. */
|
|
1197
|
+
sessionId: string | null;
|
|
1198
|
+
partySize?: number;
|
|
1199
|
+
isLeader?: boolean;
|
|
1200
|
+
/** e.g. "PreLobby" | "InGame" */
|
|
1201
|
+
location?: string | null;
|
|
1202
|
+
gameMode?: string | null;
|
|
1203
|
+
/** e.g. "playlist_showdown_cts_solo" — what they play, or what they have selected in the lobby. */
|
|
1204
|
+
playlist?: string | null;
|
|
1205
|
+
region?: string | null;
|
|
1206
|
+
/** The party runs on a custom match key. The key itself is never returned. */
|
|
1207
|
+
hasCustomKey?: boolean;
|
|
1208
|
+
matchStartedAt?: string | null;
|
|
1209
|
+
playersLeft?: number | null;
|
|
1210
|
+
/** Teammates by account id only. */
|
|
1211
|
+
members?: Array<{
|
|
1212
|
+
accountId: string | null;
|
|
1213
|
+
isLeader: boolean;
|
|
1214
|
+
}>;
|
|
1215
|
+
note?: string;
|
|
1216
|
+
}
|