Player Data - swgoh-utils/swgoh-comlink GitHub Wiki

Table of Contents

  1. Getting player data
  2. Returned player data
  3. Expanding player data
     3.a. Roster details
     3.b. Grand Arena details
    3.c. Datacron details

Getting player data

To retrieve player data from the api you will need to use the /player endpoint. The request body will look like this:

{
  "payload":{
        "allyCode": 596966614,
        "playerId": "PLAYER_ID" //OPTIONAL: Can use allyCode or playerId
  },
  "enums": false
}

Returned player data

The returned data will look similar to this:

{
  "rosterUnit": [],
  "playerRating": [],
  "profileStat": [],
  "pvpProfile": [],
  "unlockedPlayerTitle": [],
  "unlockedPlayerPortrait": [],
  "seasonStatus": [],
  "datacron": [],
  "selectedPlayerTitle": {},
  "selectedPlayerPortrait": {},
  "name": "Kidori",
  "level": 85,
  "allyCode": "596966614",
  "playerId": "xW1z7pRBS4q-aTs1uQjGys",
  "guildId": "PdxGl_0-Tjec_h_qE5o9jA",
  "guildName": "Galactic Kn??ghts",
  "guildLogoBackground": "",
  "guildBannerColor": "bright_blue_dark_blue",
  "guildBannerLogo": "guild_icon_jedi",
  "guildTypeId": "NORMAL",
  "localTimeZoneOffsetMinutes": -240,
  "lastActivityTime": "1651947547000",
  "lifetimeSeasonScore": "246798"
}

name: The player's in-game name.
level: The player's level.
allyCode: The player's ally code.
playerId: The player's assigned GUID.
guildId: The guild's assigned GUID.
guildName: The guild's name.
guildLogoBackground: The background used for the guild's logo icon.
guildBannerColor: The color scheme used for the guild's logo icon.
guildBannerLogo: The icon used to the guild's logo.
guildType: The guild's type. Indicates if the guild is a normal guild or a special type of guild such as a starter guild.
localTimeZoneOffsetMinutes: Indicates the offset from UTC that the player's time is set to.
lastActivityTime: The epoch time in seconds that the player last logged into the game.
lifetimeSeasonScore: The lifetime GAC score for the player. This is no longer used as the old GAC system no longer exists.
selectedPlayerTitle: The player's selected in-game title.
selectedPlayerPortrait: The player's selected in-game portrait.
unlockedPlayerTitle: A list of all titles the player has unlocked.
unlockedPlayerPortrait: A list of all portraits the player has unlocked.
profileStat: The complete list of statistics found on the player's STATS screen in-game.
pvpProfile: The player's Squad Arena and Fleet Arena ranks along with the team used in them last.
playerRating: The player's current Grand Arena Skill Rating, League, and Division.
seasonStatus: A list of the last three Grand Arena seasons that contains information about start and end times, points, league, and division.
rosterUnit: List of all units the player has unlocked along with detailed information about the progression of those units including equipped mods, skill tiers, equipped gear, gear level, relic level, and rarity.
datacron: List of all acquired datacrons the player has collected along with detailed information on them.

Expanding player data

The returned player data has several ways it can be expanded to include more details by combining it with game data from the /data endpoint. Below will go over several ways to increase the depth of information provided by the /player endpoint.

IMPORTANT: All values in the nameKey and descKey keys require using the data from the /localization endpoint to convert the value to the in-game displayed value.

Roster details

The most commonly used unit properties from rosterUnit are:

  • skill: contains the "id" and "tier" for each skill. A skill must be upgraded at least once in order for it to show up in this list. You will need to add + 2 to the tier value of each skill to get the actual in-game tier.
  • equipment: contains the "id" and "slot" for all gear equipped at the units current gear level.
  • equippedStatMod: an array containing detailed information on all equipped mods
  • purchasedAbilityId: contains the ability ids for special unit abilities that require special resources to unlock such as ultimate abilities.
  • id: the assigned GUID used to identify that specific unit in that specific players roster.
  • definitionId: the main identifier for the unit.
  • currentRarity: current unit rarity.
  • currentLevel: current unit level.
  • currentTier: indicates the current gear level of the unit.
  • relic.currentTier : indicates the current relic level of the unit.

The roster data can be expanded to include the following details:

  • combatType: indicates if the unit is a character or a ship
  • isGalacticLegend: indicates if the unit is a Galactic Legend
  • baseId: another main identifier for the unit
  • name: the in-game name of the unit
  • categories []: includes alignment, professions, roles, and factions
  • crew []: the id of each crew member
  • skills []: All skills regardless of tier with details on zeta, omega, and omicron status
  • mods []: Added details on set, slot, and pips (dots) along with better formatting of the data.

You will need the following collections from the /data endpoint:

  • units
  • category
  • skill
  • statMod | optional

First cycle through each unit in the players rosterUnit using the definitionId to match the id in units. You can then use the following from units:

  • combatType for combatType
  • baseId for baseId
  • nameKey for name
  • legend for isGalacticLegend
  • crew (unitId) for crew
  • Use each categoryId to match the id in category and return only the ones that have visible set to true. Use this to create categories.
  • Cycle through each skillReference adding the skillId for skill. For ships you will also need to use add skillReference[0].skillId for each unit found in crew in order to add the crew skills. If the skillId already exists in the unit's data found in the player roster you can skip it, otherwise add it along with tier set to 1. It is best to do this as an array of objects containing the following keys: skillId (or id), name, tier, maxTier, isZeta, isOmicron, hasOmicron, and hasZeta. More details about this are below.

To further expand skills, either during getting them from units or after you have all of the id and tier values, you will need to match each skillId to the id in the skill collection. You can then add the following information to the skills object:

  • nameKey for name
  • tier.length + 1 for maxTier
  • isZeta for isZeta
  • omicronMode for isOmicron
  • omicronMode for omicronArea
  • hasZeta and hasOmicron: For determining if the unit already has the zeta or omicron you will need to search each tier in the skill collection for isZetaTier or isOmicronTier set to TRUE. You will then need to compare that tier index + 1 to the tier you got from rosterUnit and you can set the hasOmicron and hasZeta to true or false depending on the result.

Omicron Enums

Value ENUM Note
0 DEFAULT
1 ALLOMICRON
2 PVEOMICRON
3 PVPOMICRON
4 GUILDRAIDOMICRON
5 TERRITORYSTRIKEOMICRON Territory Battles Combat Missions Only
6 TERRITORYCOVERTOMICRON Territory Battles Special Missions Only
7 TERRITORYBATTLEBOTHOMICRON Territory Battles
8 TERRITORYWAROMICRON Territory Wars
9 TERRITORYTOURNAMENTOMICRON Grand Arena
10 WAROMICRON Galactic War
11 CONQUESTOMICRON Conquest
12 GALACTICCHALLENGEOMICRON Galactic Challenges
13 PVEEVENTOMICRON
14 TERRITORYTOURNAMENT3OMICRON Grand Arena 3v3 Only
15 TERRITORYTOURNAMENT5OMICRON Grand Arena 5v5 Only
16 GALACTICCHALLENGE3OMICRON Galactic Challenges 3v3
17 GALACTICCHALLENGE5OMICRON Galactic Challenges 5v5

For adjusting mods you can either use your own array to check the value in each position for each mod definitionId found within equippedStatMod or you can match the definitionId to the id in statMod. You can then add set, slot, and pips(rarity or dots) directly to the mod information.

  • statMod: Return slot, setId, and rarity
  • Array: The first number in definitionId is the set id, the second number is the rarity (pips) and the third number is the slot with the value -1. You will need to add 1 to the slot if you want it to match how statMod returns the value otherwise you can use the following.
    set = {1:"Health", 2:"Offense", 3:"Defense", 4:"Speed", 5:"Critical Chance", 6:"Critical Damage", 7:"Potency", 8:"Tenacity"};
    slot = {1:"Square", 2:"Arrow", 3:"Diamond", 4:"Triangle", 5:"Circle", 6:"Plus/Cross"};

Grand Arena details

Within seasonStatus are the following fields:

  • seasonId: The identifier for the entire season.
  • eventInstanceId: The instance id. Includes the season number and Unix Epoch Time the season starts.
  • league: The current league.
  • wins: INACTIVE - This field is not populated with information.
  • losses: INACTIVE - This field is not populated with information.
  • seasonPoints: Current points earned this season. Re-calculated at the end of each round.
  • division: Current division. Re-calculated at the end of each round.
  • joinTime: Unix Epoch Time the player joined the event.
  • endTime: Unix Epoch Time the entire season ends.
  • remove: UNCONFIRMED - Possibly the flag used to remove this season from the player profile
  • rank: Current rank within your league division.

The only field that could use modifying is the division and will use the territoryTournamentDivisionDefinition collection. Match the division value from the player profile to the id within territoryTournamentDivisionDefinition and return the nameKey. Alternatively you can manually create an object or named array in the following way.
divisions = { 5: 5, 10: 4, 15: 3, 20: 2, 25: 1 };

If you would like to further the seasonId can be used with the territoryTournamentDefinition and seasonDefinition collections to further modify or add details if desired.

Datacron details

Within datacron are each datacron the player has in their inventory and contains the following fields:

  • tag: Contains any key tags to quickly identify things about the datacron.
  • affix: List of all unlocked tiers including detailed information including added ability and stat details.
    • tag: Contains any key tags to quickly identify things about the datacron.
    • targetRule: The id for the battleTargetingRule collection
    • abilityId: The id for the ability collection
    • statType: The stat, if any, to enhance
    • statValue: The amount to increase the stat by
    • requiredUnitTier: Any required gear level
    • requiredRelicTier: Any required Relic level
  • rerollOption: UNCCONFIRMED - Possibly the saved reroll options if none were chosen when rerolled.
  • id: The assigned GUID used to identify that specific datacron.
  • setId: The id for the datacron set.
  • templateId: The id of the template used for the datacron.
  • locked: Indicates if the datacron is locked.
  • rerollIndex: UNCONCFIRMED - Possibly related to unchosen reroll options.
  • rerollCount: The number of times the datacron has been rerolled.

The datacron data can be expanded by adding the following details:

  • setName: The name of the set
  • maxTier: The max tier the datacron is at
  • affix.targetNameKey: The name of the stat or target the current tier affects
  • affix.abilityNameKey: The ability name, if any, the current tier affects
  • affix.abilityDescKey: The ability details, if any, the current tier affects
  • tagNames: OPTIONAL: An array or string of all targetNameKeys for quick loookup

You will need the following collections from the /data endpoint:

  • datacronSet
  • battleTargetingRule
  • ability
  • category
  • localization for all names and descriptions

First get the setName, match the setId from the player data to the id within the datacronSet collection and then return the localized displayName. To get maxTier get the count/length of affix for that datacron.

For the tier additions if their is a targetRule value you will need to match the targetRule for that tier to the id within the battleTargetingRule collection. Then, send each categoryId within category.category to the id in the category collection. Return the localized descKey only if the value is NOT "PLACEHOLDER". This will give you the targetNameKey. Save it to be used for the next steps. After getting the target name you will need to use the abilityId for that datacron tier to the id within the ability collection returning the localized nameKey for abilityNameKey and the localized decKey for the abilityDescKey. For both of these you will need to replace the "{0}" in the value with the targetNameKey
Note: So far they only use one category per tier, but if that changes you may need to save the index with the value.

If the tier does not have a targetRule then it is a stat and you will need to match statType to the UnitStat within /enums. Alternatively you can use the following json data in your code.

{
  "1":{
    "statId":1,
    "nameKey":"UnitStat_Health",
    "descKey":"UnitStatDescription_Health_TU7",
    "isDecimal":false,
    "name":"Health",
    "detailedName":"Max Health"
  },
  "2":{
    "statId":2,
    "nameKey":"UnitStat_Strength",
    "descKey":"UnitStatDescription_Strength",
    "isDecimal":false,
    "name":"Strength",
    "detailedName":"Strength"
  },
  "3":{
    "statId":3,
    "nameKey":"UnitStat_Agility",
    "descKey":"UnitStatDescription_Agility",
    "isDecimal":false,
    "name":"Agility",
    "detailedName":"Agility"
  },
  "4":{
    "statId":4,
    "nameKey":"UnitStat_Intelligence_TU7",
    "descKey":"UnitStatDescription_Intelligence",
    "isDecimal":false,
    "name":"Tactics",
    "detailedName":"Tactics"
  },
  "5":{
    "statId":5,
    "nameKey":"UnitStat_Speed",
    "descKey":"UnitStatDescription_Speed",
    "isDecimal":false,
    "name":"Speed",
    "detailedName":"Speed"
  },
  "6":{
    "statId":6,
    "nameKey":"UnitStat_AttackDamage",
    "descKey":"UnitStatDescription_AttackDamage",
    "isDecimal":false,
    "name":"Physical Damage",
    "detailedName":"Physical Damage"
  },
  "7":{
    "statId":7,
    "nameKey":"UnitStat_AbilityPower",
    "descKey":"UnitStatDescription_AbilityPower",
    "isDecimal":false,
    "name":"Special Damage",
    "detailedName":"Special Damage"
  },
  "8":{
    "statId":8,
    "nameKey":"UnitStat_Armor",
    "descKey":"UnitStatDescription_Armor",
    "isDecimal":false,
    "name":"Armor",
    "detailedName":"Armor"
  },
  "9":{
    "statId":9,
    "nameKey":"UnitStat_Suppression",
    "descKey":"UnitStatDescription_Suppression",
    "isDecimal":false,
    "name":"Resistance",
    "detailedName":"Resistance"
  },
  "10":{
    "statId":10,
    "nameKey":"UnitStat_ArmorPenetration",
    "descKey":"UnitStatDescription_ArmorPenetration",
    "isDecimal":false,
    "name":"Armor Penetration",
    "detailedName":"Armor Penetration"
  },
  "11":{
    "statId":11,
    "nameKey":"UnitStat_SuppressionPenetration",
    "descKey":"UnitStatDescription_SuppressionPenetration",
    "isDecimal":false,
    "name":"Resistance Penetration",
    "detailedName":"Resistance Penetration"
  },
  "12":{
    "statId":12,
    "nameKey":"UnitStat_DodgeRating_TU5V",
    "descKey":"UnitStatDescription_DodgeRating",
    "isDecimal":false,
    "name":"Dodge Chance",
    "detailedName":"Dodge Rating"
  },
  "13":{
    "statId":13,
    "nameKey":"UnitStat_DeflectionRating_TU5V",
    "descKey":"UnitStatDescription_DeflectionRating",
    "isDecimal":false,
    "name":"Deflection Chance",
    "detailedName":"Deflection Rating"
  },
  "14":{
    "statId":14,
    "nameKey":"UnitStat_AttackCriticalRating_TU5V",
    "descKey":"UnitStatDescription_AttackCriticalRating",
    "isDecimal":false,
    "name":"Physical Critical Chance",
    "detailedName":"Physical Critical Rating"
  },
  "15":{
    "statId":15,
    "nameKey":"UnitStat_AbilityCriticalRating_TU5V",
    "descKey":"UnitStatDescription_AbilityCriticalRating",
    "isDecimal":false,
    "name":"Special Critical Chance",
    "detailedName":"Special Critical Rating"
  },
  "16":{
    "statId":16,
    "nameKey":"UnitStat_CriticalDamage",
    "descKey":"UnitStatDescription_CriticalDamage",
    "isDecimal":true,
    "name":"Critical Damage",
    "detailedName":"Critical Damage"
  },
  "17":{
    "statId":17,
    "nameKey":"UnitStat_Accuracy",
    "descKey":"UnitStatDescription_Accuracy",
    "isDecimal":true,
    "name":"Potency",
    "detailedName":"Potency"
  },
  "18":{
    "statId":18,
    "nameKey":"UnitStat_Resistance",
    "descKey":"UnitStatDescription_Resistance",
    "isDecimal":true,
    "name":"Tenacity",
    "detailedName":"Tenacity"
  },
  "19":{
    "statId":19,
    "nameKey":"UnitStat_DodgePercentAdditive",
    "descKey":"",
    "isDecimal":true,
    "name":"Dodge",
    "detailedName":"Dodge Percent Additive"
  },
  "20":{
    "statId":20,
    "nameKey":"UnitStat_DeflectionPercentAdditive",
    "descKey":"",
    "isDecimal":true,
    "name":"Deflection",
    "detailedName":"Deflection Percent Additive"
  },
  "21":{
    "statId":21,
    "nameKey":"UnitStat_AttackCriticalPercentAdditive",
    "descKey":"",
    "isDecimal":true,
    "name":"Physical Critical Chance",
    "detailedName":"Physical Critical Percent Additive"
  },
  "22":{
    "statId":22,
    "nameKey":"UnitStat_AbilityCriticalPercentAdditive",
    "descKey":"",
    "isDecimal":true,
    "name":"Special Critical Chance",
    "detailedName":"Special Critical Percent Additive"
  },
  "23":{
    "statId":23,
    "nameKey":"UnitStat_ArmorPercentAdditive",
    "descKey":"",
    "isDecimal":true,
    "name":"Armor",
    "detailedName":"Armor Percent Additive"
  },
  "24":{
    "statId":24,
    "nameKey":"UnitStat_SuppressionPercentAdditive",
    "descKey":"",
    "isDecimal":true,
    "name":"Resistance",
    "detailedName":"Resistance Percent Additive"
  },
  "25":{
    "statId":25,
    "nameKey":"UnitStat_ArmorPenetrationPercentAdditive",
    "descKey":"",
    "isDecimal":true,
    "name":"Armor Penetration",
    "detailedName":"Armor Penetration Percent Additive"
  },
  "26":{
    "statId":26,
    "nameKey":"UnitStat_SuppressionPenetrationPercentAdditive",
    "descKey":"",
    "isDecimal":true,
    "name":"Resistance Penetration",
    "detailedName":"Resistance Penetration Percent Additive"
  },
  "27":{
    "statId":27,
    "nameKey":"UnitStat_HealthSteal",
    "descKey":"UnitStatDescription_HealthSteal",
    "isDecimal":true,
    "name":"Health Steal",
    "detailedName":"Health Steal"
  },
  "28":{
    "statId":28,
    "nameKey":"UnitStat_MaxShield",
    "descKey":"UnitStatDescription_MaxShield",
    "isDecimal":false,
    "name":"Protection",
    "detailedName":"Max Protection"
  },
  "29":{
    "statId":29,
    "nameKey":"UnitStat_ShieldPenetration",
    "descKey":"",
    "isDecimal":true,
    "name":"Protection Ignore",
    "detailedName":"Protection Ignore"
  },
  "30":{
    "statId":30,
    "nameKey":"UnitStat_HealthRegen",
    "descKey":"",
    "isDecimal":true,
    "name":"Health Regeneration",
    "detailedName":"Health Regen"
  },
  "31":{
    "statId":31,
    "nameKey":"UnitStat_AttackDamagePercentAdditive",
    "descKey":"",
    "isDecimal":true,
    "name":"Physical Damage",
    "detailedName":"Physical Damage Percent Additive"
  },
  "32":{
    "statId":32,
    "nameKey":"UnitStat_AbilityPowerPercentAdditive",
    "descKey":"",
    "isDecimal":true,
    "name":"Special Damage",
    "detailedName":"Special Damage Percent Additive"
  },
  "33":{
    "statId":33,
    "nameKey":"UnitStat_DodgeNegatePercentAdditive",
    "descKey":"",
    "isDecimal":true,
    "name":"Physical Accuracy",
    "detailedName":"Dodge Negate Percent Additive"
  },
  "34":{
    "statId":34,
    "nameKey":"UnitStat_DeflectionNegatePercentAdditive",
    "descKey":"",
    "isDecimal":true,
    "name":"Special Accuracy",
    "detailedName":"Deflection Negate Percent Additive"
  },
  "35":{
    "statId":35,
    "nameKey":"UnitStat_AttackCriticalNegatePercentAdditive",
    "descKey":"",
    "isDecimal":true,
    "name":"Physical Critical Avoidance",
    "detailedName":"Physical Critical Negate Percent Additive"
  },
  "36":{
    "statId":36,
    "nameKey":"UnitStat_AbilityCriticalNegatePercentAdditive",
    "descKey":"",
    "isDecimal":true,
    "name":"Special Critical Avoidance",
    "detailedName":"Special Critical Negate Percent Additive"
  },
  "37":{
    "statId":37,
    "nameKey":"UnitStat_DodgeNegateRating",
    "descKey":"UnitStatDescription_DodgeNegateRating",
    "isDecimal":false,
    "name":"Physical Accuracy",
    "detailedName":"Dodge Negate Rating"
  },
  "38":{
    "statId":38,
    "nameKey":"UnitStat_DeflectionNegateRating",
    "descKey":"UnitStatDescription_DeflectionNegateRating",
    "isDecimal":false,
    "name":"Special Accuracy",
    "detailedName":"Deflection Negate Rating"
  },
  "39":{
    "statId":39,
    "nameKey":"UnitStat_AttackCriticalNegateRating",
    "descKey":"UnitStatDescription_AttackCriticalNegateRating",
    "isDecimal":false,
    "name":"Physical Critical Avoidance",
    "detailedName":"Physical Critical Negate Rating"
  },
  "40":{
    "statId":40,
    "nameKey":"UnitStat_AbilityCriticalNegateRating",
    "descKey":"UnitStatDescription_AbilityCriticalNegateRating",
    "isDecimal":false,
    "name":"Special Critical Avoidance",
    "detailedName":"Special Critical Negate Rating"
  },
  "41":{
    "statId":41,
    "nameKey":"UnitStat_Offense",
    "descKey":"UnitStatDescription_Offense",
    "isDecimal":false,
    "name":"Offense",
    "detailedName":"Offense"
  },
  "42":{
    "statId":42,
    "nameKey":"UnitStat_Defense",
    "descKey":"UnitStatDescription_Defense",
    "isDecimal":false,"name":"Defense",
    "detailedName":"Defense"
  },
  "43":{
    "statId":43,
    "nameKey":"UnitStat_DefensePenetration",
    "descKey":"UnitStatDescription_DefensePenetration",
    "isDecimal":false,
    "name":"Defense Penetration",
    "detailedName":"Defense Penetration"
  },
  "44":{
    "statId":44,
    "nameKey":"UnitStat_EvasionRating",
    "descKey":"UnitStatDescription_EvasionRating",
    "isDecimal":false,
    "name":"Evasion",
    "detailedName":"Evasion Rating"
  },
  "45":{
    "statId":45,
    "nameKey":"UnitStat_CriticalRating",
    "descKey":"UnitStatDescription_CriticalRating",
    "isDecimal":false,
    "name":"Critical Chance",
    "detailedName":"Critical Rating"
  },
  "46":{
    "statId":46,
    "nameKey":"UnitStat_EvasionNegateRating",
    "descKey":"UnitStatDescription_EvasionNegateRating",
    "isDecimal":false,
    "name":"Accuracy",
    "detailedName":"Evasion Negate Rating"
  },
  "47":{
    "statId":47,
    "nameKey":"UnitStat_CriticalNegateRating",
    "descKey":"UnitStatDescription_CriticalNegateRating",
    "isDecimal":false,
    "name":"Critical Avoidance",
    "detailedName":"Critical Negate Rating"
  },
  "48":{
    "statId":48,
    "nameKey":"UnitStat_OffensePercentAdditive",
    "descKey":"",
    "isDecimal":true,
    "name":"Offense",
    "detailedName":"Offense Percent Additive"
  },
  "49":{
    "statId":49,
    "nameKey":"UnitStat_DefensePercentAdditive",
    "descKey":"",
    "isDecimal":true,
    "name":"Defense",
    "detailedName":"Defense Percent Additive"
  },
  "50":{
    "statId":50,
    "nameKey":"UnitStat_DefensePenetrationPercentAdditive",
    "descKey":"",
    "isDecimal":true,
    "name":"Defense Penetration",
    "detailedName":"Defense Penetration Percent Additive"
  },
  "51":{
    "statId":51,
    "nameKey":"UnitStat_EvasionPercentAdditive",
    "descKey":"",
    "isDecimal":true,
    "name":"Evasion",
    "detailedName":"Evasion Percent Additive"
  },
  "52":{
    "statId":52,
    "nameKey":"UnitStat_EvasionNegatePercentAdditive",
    "descKey":"",
    "isDecimal":true,
    "name":"Accuracy",
    "detailedName":"Evasion Negate Percent Additive"
  },
  "53":{
    "statId":53,
    "nameKey":"UnitStat_CriticalChancePercentAdditive",
    "descKey":"",
    "isDecimal":true,
    "name":"Critical Chance",
    "detailedName":"Critical Chance Percent Additive"
  },
  "54":{
    "statId":54,
    "nameKey":"UnitStat_CriticalNegateChancePercentAdditive",
    "descKey":"",
    "isDecimal":true,
    "name":"Critical Avoidance",
    "detailedName":"Critical Negate Chance Percent Additive"
  },
  "55":{
    "statId":55,
    "nameKey":"UnitStat_MaxHealthPercentAdditive",
    "descKey":"",
    "isDecimal":true,
    "name":"Health",
    "detailedName":"Max Health Percent Additive"
  },
  "56":{
    "statId":56,
    "nameKey":"UnitStat_MaxShieldPercentAdditive",
    "descKey":"",
    "isDecimal":true,
    "name":"Protection",
    "detailedName":"Max Protection Percent Additive"
  },
  "57":{
    "statId":57,
    "nameKey":"UnitStat_SpeedPercentAdditive",
    "descKey":"",
    "isDecimal":true,
    "name":"Speed",
    "detailedName":"Speed Percent Additive"},
  "58":{
    "statId":58,
    "nameKey":"UnitStat_CounterAttackRating",
    "descKey":"",
    "isDecimal":true,
    "name":"Counter Attack",
    "detailedName":"Counter Attack Rating"
  },
  "59":{
    "statId":59,
    "nameKey":"Combat_Buffs_TASK_NAME_2",
    "descKey":"",
    "isDecimal":true,
    "name":"Taunt",
    "detailedName":"Taunt"
  },
  "60":{
    "statId":60,
    "nameKey":"UnitStat_DefensePenetrationTargetPercentAdditive",
    "descKey":"UnitStatDescription_DefensePenetrationTargetPercentAdditive",
    "isDecimal":true,
    "name":"Defense Penetration",
    "detailedName":"Target Defense Penetration Percent Additive"
  },
  "61":{
    "statId":61,
    "nameKey":"UNIT_STAT_STAT_VIEW_MASTERY",
    "descKey":"",
    "isDecimal":true,
    "name":"Mastery",
    "detailedName":"Mastery"
  }
}
⚠️ **GitHub.com Fallback** ⚠️