Passive Skill Tree JSON

This page contains development information and is intended for developers and not regular end users.
Passive skill tree JSON is used by the official website and many other community tools to display the skill tree.
JSON
The subsections follow the format of the json.
Key | Type |
---|---|
assets | Associative Array |
characterData | Associative Array |
constants | Associative Array |
extraImages | Associative Array |
groups | Associative Array |
imageRoot | String |
imageZoomLevels | Float Array |
max_x | Integer |
max_y | Integer |
min_x | Integer |
min_y | Integer |
nodes | Associative Array |
root | SkillTreeNode |
skillSprites | Associative Array |
assets
This is an associative array that maps an asset name to an asset at a specific zoom level (i.e. "0.3835" below, note: Assets that don't change with zoom level will have a single entry of "1").
Example:
"assets": {
"PSSkillFrame": {
"0.1246": "https://link/to/asset/",
"0.2109": "https://link/to/asset/",
"0.2972": "https://link/to/asset/",
"0.3835": "https://link/to/asset/"
},
...
"PSPointsFrame": {
"1": "https://link/to/asset/"
},
...
}
characterData
Associative array that maps the character attributes to the classid.
Each value for the array contains another associative array for various attributes:
Key | Value description | Type |
---|---|---|
base_dex | character class starting dexterity | integer |
base_int | character class starting intelligence | integer |
base_str | character class starting strength | integer |
This maps to Scion as of this writing for example:
>>> st['characterData']['0']
{'base_int': 20, 'base_dex': 20, 'base_str': 20}
"characterData": {
"0": {
"base_str": 20,
"base_dex": 20,
"base_int": 20
},
...
}
constants
Constants contain various game constants.
Located under the top level:
{
constants: { /* constants */}
}
Key | Value description | Type |
---|---|---|
PSSCentreInnerRadius | Radius | Integer |
chracterAttributes | See Below | Associative Array |
classes | See Below | Associative Array |
skillsPerOrbit | A constant for SkillTreeNode.oidx | Integer Array |
orbitRadii | A constant for SkillTreeNode.o | Integer Array |
characterAttributes
Associative array of character attributes and their id.
Format:
Key | Value description | Type |
---|---|---|
<Name of the attribute> | Id of attribute | integer |
Example:
>>> json['constants']['characterAttributes']['Strength']
0
"characterAttributes": {
"Strength": 0,
"Dexterity": 1,
"Intelligence": 2
}
classes
Associative array of Character classes and their associated id
Format:
Key | Value description | Type |
---|---|---|
Internal name of the class based on attributes, i.e. <Attribute>Class for example:
|
Id of the class | integer |
Example:
>>> json['constants']['classes']['StrDexIntClass']
0
"classes": {
"StrClass": 1,
"DexClass": 2,
"IntClass": 3,
"StrDexClass": 4,
"StrIntClass": 5,
"DexIntClass": 6,
"StrDexIntClass": 0
}
extraImages
This an associative array linking the CharacterClassId found in constants.classes to the associated 2DArt and location on the tree in which to display the art.
Note: Scion does not have an extra image to display when the class is selected
Example:
"extraImages": {
"1": {
"x": -4070.52,
"y": 7.37268,
"image": "Art/2DArt/BaseClassIllustrations/Str.png"
},
...
}
groups
Groups is an associative array containing groups for the nodes.
Key | Value description | Type |
---|---|---|
oo | Associative array of orbitals (i.e. SkillTreeNode.oidx). The boolean value states if the orbit is occupied | assoc array[string, boolean] |
n | Contains a list of the associated nodes by their unique id | array[integer] |
x | x-coordinate | float |
y | y-coordinate | float |
You can see in the sample below that group 6 has an oo that is just an array of booleans. If this is seen, treat the index of the boolean as the key in the associative array.
"groups": {
...
"6": {
"x": 400.602,
"y": -1786.7,
"oo": [
true
],
"n": [
60090
]
},
...
"15": {
"x": 3424.24,
"y": 3807.71,
"oo": {
"1": true
},
"n": [
45033,
53324,
15344
]
},
...
}
imageRoot
This is just a link to the image root for assets. Values that have been seen in the passed include: https://web.poecdn.com/image/, /image/, /image//
imageZoomLevels
This is an array of floats that designate the zoom levels for different assets used when creating a tree
"imageZoomLevels": [
0.1246,
0.2109,
0.2972,
0.3835
]
max_x
This is the maximum x that a node on the normal skill tree will be (does not include ascendancy nodes and their odd locations).
max_y
This is the maximum y that a node on the normal skill tree will be (does not include ascendancy nodes and their odd locations).
min_x
This is the minimum x that a node on the normal skill tree will be (does not include ascendancy nodes and their odd locations).
min_y
This is the minimum y that a node on the normal skill tree will be (does not include ascendancy nodes and their odd locations).
nodes
Nodes is an associative array containing general information about the passive skill nodes in form of an associative array. The key of this dictionary is the Node ID and the value uses the following key value pairs:
Key | Value description | Type |
---|---|---|
ascendancyName | Name of the associated ascendancy class
Not present if the node is not associated with an ascendancy |
string |
da | how much dexterity the node adds | integer |
dn | Name of the node | string |
g | Id of the group the node is in | integer |
ia | how much intelligence the node adds | integer |
icon | Path relative to the root to node icon | string |
id | Unique id of the nodes | integer |
isAscendancyStart | Whether the node is a starting point for ascendancy class
Not present if the node is not associated with an ascendancy |
boolean |
isJewelSocket | Whether the node is a socket for jewel | boolean |
isMultipleChoice | Whether the node is a multiple choice node | boolean |
isMultipleChoiceOption | Whether the node is a choice option for a multiple choice node | boolean |
ks | Whether the node is a key stone | boolean |
m | Whether the node is a mastery (i.e. the center of certain circles have images which are technically also passive skill nodes) | boolean |
not | Whether the node is a notable | boolean |
o | Radii of orbit (0 to 4, orbitRadii = [0, 82, 162, 335, 493]) | integer |
oidx | index on the orbit (skillsPerOrbit = [1, 6, 12, 12, 40]) | integer |
out | Connections to other nodes by their id | array[integer] |
passivePointsGranted | Passive points given | integer |
reminderText | Reminder text(s). These appear grey in game and give some extra information about the mechanics or node.
Not present if there is no reminder text |
array[string] |
flavourText | Node flavour text (similar to the flavour text on uniques, appears in the unique border color in game) | array[string] |
sa | How much strength the node adds | integer |
sd | Stat descriptions. One Element per line (lines still may contain escaped characters, i.e. \n )
|
array[string] |
spc | class starting node | array |
"nodes": {
...
"57279": {
"id": 57279,
"icon": "Art/2DArt/SkillIcons/passives/KeystoneBloodMagic.png",
"ks": true,
"not": false,
"dn": "Blood Magic",
"m": false,
"isJewelSocket": false,
"isMultipleChoice": false,
"isMultipleChoiceOption": false,
"passivePointsGranted": 0,
"flavourText": [
"Lay open your veins, and draw power from your own spilled life."
],
"spc": [],
"sd": [
"Removes all mana. Spend Life instead of Mana for Skills"
],
"g": 451,
"o": 0,
"oidx": 0,
"sa": 0,
"da": 0,
"ia": 0,
"out": [
3644,
56143
],
"in": []
},
...
}
root
Contains the class starting nodes under the out key.
Example:
>>> st['root']
{'out': [50459, 47175, 50986, 61525, 54447, 44683, 58833], 'oidx': 0, 'ia': 0, 'da': 0, 'g': 0, 'o': 0, 'sa': 0}
>>> st['root']['out']
[50459, 47175, 50986, 61525, 54447, 44683, 58833]
skillSprites
Contains various arrays
Key | Value description | Type |
---|---|---|
keystoneActive | array[assoc array] | |
keystoneInactive | array[assoc array] | |
mastery | array[assoc array] | |
normalActive | array[assoc array] | |
normalInactive | array[assoc array] | |
notableActive | array[assoc array] | |
notableInactive | array[assoc array] |
Each of the array elements contains another associative array with that links the icon path with a specific sprite:
Key | Value description | Type |
---|---|---|
coords | Contains an associate array that maps the icon path (as from the nodes) to coordinates in the sprite file and the size of the icon in the sprite file (see below) | assoc array |
filename | Name of the sprite file | string |
Example:
>>> st['skillSprites']['mastery'][0]['filename']
'skill_sprite-active-0-4ea513d186d9a3e9936128b9e53674b8.png'
The each of the coords values contains another associative array like this:
Key | Value description | Type |
---|---|---|
w | width of the icon | integer |
h | height of the icon | integer |
x | x position | integer |
y | y position | integer |
Examples:
>>> st['skillSprites']['mastery'][0]['coords']['Art/2DArt/SkillIcons/passives/MasteryGroupMana.png']
{'w': 32, 'h': 32, 'y': 96, 'x': 128}
Ascendancy classes JSON
The ascendancy classes json section (i.e. from the json release under var = opts [...] ascClasses: { /* json */}
)
Contains an associative array that maps the character class id to the information about the ascendancy classes.
assoc array for each class
Key | Value description | Type |
---|---|---|
name | Name of the regular class (ex. "Marauder") | string |
classes | ascendancy classes for this class by their id. The key is a class id, the value is another associative array. | assoc array[string, assoc array] |
assoc array for ascendancy classes
Key | Value description | Type |
---|---|---|
displayName | Name of the ascendancy class | string |
name | Name of the ascendancy class | string |
flavourText | The flavour text of the class | string |
flavourTextColour | comma-separated RGB colour | string |
flavourTextRect | comma-separated coordinates | string |
Examples:
>>> asc['1']['classes']['1'].items()
dict_items([('name', 'Juggernaut'), ('flavourTextColour', '175,90,50'), ('flavourText', ' What divides the conqueror \n from the conquered? Perseverance.'), ('displayName', 'Juggernaut'), ('flavourTextRect', '250,150,1063,436')])
>>> asc['1']['classes']['2'].items()
dict_items([('name', 'Berserker'), ('flavourTextColour', '175,90,50'), ('flavourText', 'The savage path is \nalways swift and sure.'), ('displayName', 'Berserker'), ('flavourTextRect', '760,415,976,429')])
>>> asc['1']['classes']['3'].items()
dict_items([('name', 'Chieftain'), ('flavourTextColour', '175,90,50'), ('flavourText', ' The Ancestors speak \nthrough your clenched fists.'), ('displayName', 'Chieftain'), ('flavourTextRect', '250,175,976,429')])
List of official JSON announcements
The latest passive skill tree JSON can be found in the official github account of the developers https://github.com/grindinggear/skilltree-export
Historically, JSON files are posted in the official website directly:
Versions | json link | Ref |
---|---|---|
version 1.2.0 | [1] | [2] |
version 1.3.0 | N/A (posted via poeskilltree tool dev) | [3] |
version 2.0.0 | ||
version 2.1.0 | ||
version 2.2.0 | ||
version 2.3.0 | [4] | [5] |
version 2.4.0 | [6] | [7] |
version 2.5.0 | [8] | [9] |
version 2.6.0 | ||
version 3.0.0 | ||
version 3.1.0 | ||
version 3.2.0 | ||
version 3.3.0 | ||
version 3.4.0 | ||
version 3.5.0 | ||
version 3.6.0 | [10] | [11] |
version 3.7.0 | [12] | [13] |
version 3.8.0 | [14] | [15] |
version 3.9.0 | ||
version 3.10.0 | [16] | [17] |
version 3.11.0 | [18] | [19] |
version 3.12.0 | [20] | [21] |
version 3.13.0 | ||
version 3.14.0 | [22] | [23] |
version 3.15.0 | [24] | [25] |