Skip to content

Fortnite API client in Golang. Get player statistics, server status, and global leaderboards.

License

Notifications You must be signed in to change notification settings

Fyb3roptik/fortnite-go

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

54 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

fortnite-go

An interfacer for the Fortnite game API. Can retrieve player statistics and global leaderboard information by specified platform type. Handles authentication, token renewal, and token destruction upon program exit.

🍻 Tip me!

Setup

In order to authenticate successfully with the Epic game servers, you must have an Epic Account, and Fortnite installed on the PC you are using. Two authentication tokens must be extracted on client and game launch.

To obtain header tokens:

  • Install & Open Fiddler 4
  • In Tools -> Options -> HTTPS, enable "Capture HTTPS CONNECTs" and "Decrypt HTTPS traffic"
  • Start your Epic Games Launcher.
  • You will see a request with /account/api/oauth/token. Click on it and then click Inspectors tab to get the header (Copy Authorization header content and remove "basic ") => This header is your Launcher Token
  • Launch Fortnite
  • You will see again a request with /account/api/oauth/token. Click on it and then click Inspectors tab to get the header (Copy Authorization header content and remove "basic ") => This header is your Game Token

V2 Stats

This package has been updated to the latest V2 stats from Epic. There are no more platforms. All stats are broken up between input type (keyboardmouse, gamepad, and touch).

V1 Stats Compatibility - Deprecated

To retrieve stats via V1 stats, please use the QueryPlayerV1 method:

// Retrieve player info and stats by Account ID.
player, err := s.QueryPlayerV1("", "AccountID")
if err != nil {
	fmt.Println(err)
}

Usage

See Godoc for in-depth documentation.

Player Stats

To retrieve a player's information and statistics for Battle Royale:

// Create the session.
sess := fortnitego.Create("USERNAME", "PASSWORD", "LAUNCHER-TOKEN", "GAME-TOKEN")

// Retrieve player info and stats by Username.
player, err := s.QueryPlayer("PlayerName", "")
if err != nil {
	fmt.Println(err)
}

// Retrieve player info and stats by Account ID.
player, err := s.QueryPlayer("", "AccountID")
if err != nil {
	fmt.Println(err)
}

If the player exists, a result may look like the example below. (Represented in JSON)

{
  "AccountInfo": {
    "AccountID": "6cd40c1722f2497fa1d2145b26da88e3",
  },
  "Stats": {
    "Solo": {
			"Touch": {
	      "Wins": 23,
	      "Top10": 86,
	      "Top25": 154,
	      "KillDeathRatio": "3.13",
	      "WinPercentage": "6.74",
	      "Matches": 341,
	      "Kills": 995,
	      "MinutesPlayed": 2174,
	      "KillsPerMatch": "2.92",
	      "KillsPerMinute": "0.46",
	      "Score": 56247
			},
			"Gamepad": {
	      "Wins": 23,
	      "Top10": 86,
	      "Top25": 154,
	      "KillDeathRatio": "3.13",
	      "WinPercentage": "6.74",
	      "Matches": 341,
	      "Kills": 995,
	      "MinutesPlayed": 2174,
	      "KillsPerMatch": "2.92",
	      "KillsPerMinute": "0.46",
	      "Score": 56247
			},
			"KeyboardMouse": {
	      "Wins": 23,
	      "Top10": 86,
	      "Top25": 154,
	      "KillDeathRatio": "3.13",
	      "WinPercentage": "6.74",
	      "Matches": 341,
	      "Kills": 995,
	      "MinutesPlayed": 2174,
	      "KillsPerMatch": "2.92",
	      "KillsPerMinute": "0.46",
	      "Score": 56247
			},
    },
    "Duo": {
			"Touch": {
	      "Wins": 45,
	      "Top5": 89,
	      "Top12": 149,
	      "KillDeathRatio": "3.27",
	      "WinPercentage": "11.03",
	      "Matches": 408,
	      "Kills": 1186,
	      "MinutesPlayed": 1465,
	      "KillsPerMatch": "2.91",
	      "KillsPerMinute": "0.81",
	      "Score": 91499
			},
			"Gamepad": {
	      "Wins": 45,
	      "Top5": 89,
	      "Top12": 149,
	      "KillDeathRatio": "3.27",
	      "WinPercentage": "11.03",
	      "Matches": 408,
	      "Kills": 1186,
	      "MinutesPlayed": 1465,
	      "KillsPerMatch": "2.91",
	      "KillsPerMinute": "0.81",
	      "Score": 91499
			},
			"KeyboardMouse": {
	      "Wins": 45,
	      "Top5": 89,
	      "Top12": 149,
	      "KillDeathRatio": "3.27",
	      "WinPercentage": "11.03",
	      "Matches": 408,
	      "Kills": 1186,
	      "MinutesPlayed": 1465,
	      "KillsPerMatch": "2.91",
	      "KillsPerMinute": "0.81",
	      "Score": 91499
			},
    },
    "Squad": {
			"Touch": {
	      "Wins": 116,
	      "Top3": 190,
	      "Top6": 305,
	      "KillDeathRatio": "3.60",
	      "WinPercentage": "14.23",
	      "Matches": 815,
	      "Kills": 2516,
	      "MinutesPlayed": 3143,
	      "KillsPerMatch": "3.09",
	      "KillsPerMinute": "0.80",
	      "Score": 253462
			},
			"Gamepad": {
	      "Wins": 116,
	      "Top3": 190,
	      "Top6": 305,
	      "KillDeathRatio": "3.60",
	      "WinPercentage": "14.23",
	      "Matches": 815,
	      "Kills": 2516,
	      "MinutesPlayed": 3143,
	      "KillsPerMatch": "3.09",
	      "KillsPerMinute": "0.80",
	      "Score": 253462
			},
			"KeyboardMouse": {
	      "Wins": 116,
	      "Top3": 190,
	      "Top6": 305,
	      "KillDeathRatio": "3.60",
	      "WinPercentage": "14.23",
	      "Matches": 815,
	      "Kills": 2516,
	      "MinutesPlayed": 3143,
	      "KillsPerMatch": "3.09",
	      "KillsPerMinute": "0.80",
	      "Score": 253462
			},
    }
  }
}

Leaderboard

To retrieve the top 50 global wins leaderboard:

lb, err := sess.GetWinsLeaderboard(fortnitego.PC, fortnitego.Squad) // (Solo, Duo, Squad)
if err != nil {
	fmt.Println(err)
}

A typical response would look like:

[
  {
    "DisplayName": "4hs_UwatakashiТV",
    "Rank": 1,
    "Wins": 1131
  },
  {
    "DisplayName": "qoowill",
    "Rank": 2,
    "Wins": 827
  },
  {
    "DisplayName": "RedemeЯ",
    "Rank": 3,
    "Wins": 818
  },
  {
    "DisplayName": "Copy - TH",
    "Rank": 4,
    "Wins": 801
  },
  {
    "DisplayName": "TTV.vannesskwan",
    "Rank": 5,
    "Wins": 800
  },
  {
    "DisplayName": "BlooTeaTV",
    "Rank": 6,
    "Wins": 789
  },
  {
    "DisplayName": "Twitch_PuZiiyo",
    "Rank": 7,
    "Wins": 765
  },
  {
    "DisplayName": "Infamous Uniq",
    "Rank": 8,
    "Wins": 680
  },
  {
    "DisplayName": "ŁїƒεSnoopySworld",
    "Rank": 9,
    "Wins": 635
  },
  {
    "DisplayName": "tuổi lz sánh vai",
    "Rank": 10,
    "Wins": 622
  },
  {
    "DisplayName": "SaltySoji",
    "Rank": 11,
    "Wins": 620
  },
  {
    "DisplayName": "Fluuuuuuu",
    "Rank": 12,
    "Wins": 619
  },
  {
    "DisplayName": "Faze_MadGames",
    "Rank": 13,
    "Wins": 618
  },
  {
    "DisplayName": "Mafia WillzonePH",
    "Rank": 14,
    "Wins": 618
  },
  {
    "DisplayName": "IDOLˆMrTìnhˆ",
    "Rank": 15,
    "Wins": 609
  },
  {
    "DisplayName": "Twitch.DapanoTV",
    "Rank": 16,
    "Wins": 607
  },
  {
    "DisplayName": "VIP. Trung Lương",
    "Rank": 17,
    "Wins": 599
  },
  {
    "DisplayName": "Ĺαšt-Prince",
    "Rank": 18,
    "Wins": 576
  },
  {
    "DisplayName": "DongminHero_o",
    "Rank": 19,
    "Wins": 565
  },
  {
    "DisplayName": "TacoSlut.",
    "Rank": 20,
    "Wins": 563
  },
  {
    "DisplayName": "Ĺαšt-ÐεÑz ツ",
    "Rank": 21,
    "Wins": 554
  },
  {
    "DisplayName": "Pvt.alifrizani",
    "Rank": 22,
    "Wins": 544
  },
  {
    "DisplayName": "Copy - 2 TAP",
    "Rank": 23,
    "Wins": 543
  },
  {
    "DisplayName": "Death Donator",
    "Rank": 24,
    "Wins": 538
  },
  {
    "DisplayName": "Pvt.Brokutt",
    "Rank": 25,
    "Wins": 534
  },
  {
    "DisplayName": "ⓛⓞⓥⓔBetty-CosMix",
    "Rank": 26,
    "Wins": 533
  },
  {
    "DisplayName": "Pre3idium",
    "Rank": 27,
    "Wins": 528
  },
  {
    "DisplayName": "BC Mr.Spawnz",
    "Rank": 28,
    "Wins": 528
  },
  {
    "DisplayName": "CTGS.TTâm SoNy",
    "Rank": 29,
    "Wins": 525
  },
  {
    "DisplayName": "Early_Morning",
    "Rank": 30,
    "Wins": 518
  },
  {
    "DisplayName": "Kreyzi",
    "Rank": 31,
    "Wins": 516
  },
  {
    "DisplayName": "i7 - 1080 Ti",
    "Rank": 32,
    "Wins": 510
  },
  {
    "DisplayName": "sunin-",
    "Rank": 33,
    "Wins": 509
  },
  {
    "DisplayName": "1.0.1",
    "Rank": 34,
    "Wins": 502
  },
  {
    "DisplayName": "Sarkanos",
    "Rank": 35,
    "Wins": 492
  },
  {
    "DisplayName": "VexNguyen",
    "Rank": 36,
    "Wins": 487
  },
  {
    "DisplayName": "eShield DoNtm1nd",
    "Rank": 37,
    "Wins": 481
  },
  {
    "DisplayName": "Ninja O Ceifador",
    "Rank": 38,
    "Wins": 480
  },
  {
    "DisplayName": "Fa_YeuVoBan",
    "Rank": 39,
    "Wins": 473
  },
  {
    "DisplayName": "N68 3 .",
    "Rank": 40,
    "Wins": 472
  },
  {
    "DisplayName": "K- Mày Tuổi Tôm",
    "Rank": 41,
    "Wins": 471
  },
  {
    "DisplayName": "Oraculoo",
    "Rank": 42,
    "Wins": 471
  },
  {
    "DisplayName": "i7 - 6700K",
    "Rank": 43,
    "Wins": 466
  },
  {
    "DisplayName": "Fable Zamas",
    "Rank": 44,
    "Wins": 464
  },
  {
    "DisplayName": "NoCry- arT.",
    "Rank": 45,
    "Wins": 461
  },
  {
    "DisplayName": "TwitchTranq96",
    "Rank": 46,
    "Wins": 457
  },
  {
    "DisplayName": "Twitch.ItsWiKKiD",
    "Rank": 47,
    "Wins": 455
  },
  {
    "DisplayName": "이영돈",
    "Rank": 48,
    "Wins": 455
  },
  {
    "DisplayName": "Mafia Chrism-",
    "Rank": 49,
    "Wins": 455
  },
  {
    "DisplayName": "Infamous G0D",
    "Rank": 50,
    "Wins": 454
  }
]

Special Thanks

To qlaffont for fortnite-api, which this project was largely based off of and inspired by.

About

Fortnite API client in Golang. Get player statistics, server status, and global leaderboards.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Go 100.0%