For tool makers

Building a bot, a spreadsheet, a guide or a calculator of your own? Take these, and link back.

What you can use

From the beta build

Four things, and they are the four a tool maker actually asks for: what every player can already see in the game’s own talent panel, and what it takes to draw a build, link to one and say where it came from. They are generated with the site, from the build every page is built from, so a number here and the same number on the page it came from are one number.

Use them, change them, sell what you make with them. One line of credit is the whole of what we ask, and it is right below.

The credit line we ask for

One line, with the address in it. In a spreadsheet it is a cell, in a video it is a line in the description, in a bot it is the footer of the message.

Talent trees and statistics from WoW Forever, https://wow-forever.gg (CC BY 4.0)

This compilation and our own statistics are licensed CC BY 4.0. World of Warcraft names, icons and game content belong to Blizzard Entertainment, Inc. and are not ours to license. Published as is, with no warranty.

You can only license what you own, so that sentence is narrow on purpose. Ours is the selection, the arrangement, the field names, this page and the figures we counted. Not ours, and no licence of ours can reach them: every name, every sentence of game text, every icon and every picture. The full terms are Creative Commons Attribution 4.0. This is a plain note about what we are handing you and not legal advice; if you are doing something where the difference matters, ask a lawyer rather than a fan site.

If you quote a number, name the build it came from: values change between builds, and the build is the first key of every file here.

Talent trees file

466 talents

Every talent of all nine classes in build 1.60.1.70532: the tree it sits in, its row and column, how many ranks it takes, how many points the tree needs first, what it needs above it, the ability and icon it wears, and the text of each rank exactly as the calculator prints it in a tooltip.

The talents of a tree are listed in build code order, so position N in the list is digit N in that tree’s part of a code. That ordering is the one promise this file makes to a decoder, and it is what the next section is built on.

talents.json 213 KB, 33 KB over the wire

FieldWhat it is
build, generated, siteThe game build the talents come from, the day the data behind the file was last refreshed, and this page, where every field is written down.
licence, attributionThe licence sentence, and the exact line to show. Copy the second one as it stands.
points_at_level_60How many talent points a character has at the level cap.
levels_that_grant_a_pointThe levels at which a point is given, in order.
classes[].trees[].idThe tree id. This is the number before the dot in a build code.
trees[].rows, .columnsThe size of the grid the calculator draws for that tree.
talents[]In build code order: position N in this list is digit N in that tree’s part of a code.
talents[].row, .columnZero based position in the grid, top left first.
talents[].max_ranksHow many points the talent takes. 0 means it cannot be bought in this build.
talents[].points_requiredPoints that must already be spent in that tree before it can be taken.
talents[].requiresTalent ids that must be at full rank first. Where there is more than one, any one of them is enough. Empty for most.
talents[].spell_id, .icon_idThe ability behind the talent, and the icon it wears. Both are the ids this site already shows in its own addresses.
talents[].descriptionThe text of each rank, exactly as the calculator prints it in a tooltip. One entry when every rank reads alike, and absent when there is none.
talents[].name = nullA position we keep but do not describe, so the digits still line up. There are none in this build.

Not in this file. Costs, cooldowns and anything a talent record carries beyond the tree. Those belong to the ability, they move faster than anything here, and a stale copy of them in somebody’s spreadsheet is worse than no copy.

Build code format

A build lives in the link. The calculator keeps it in the address after the #, and a build this site holds a page for keeps the same code in the path.

  • https://wow-forever.gg/talents/<class>/#<code> opens the calculator on that build.
  • https://wow-forever.gg/talents/<class>/b/<code>/ is the build’s own page, for the builds this site holds.

How a code is spelled

  • The marker names the talent trees the code was made on, because a digit means a different talent once a tree changes. v5_ is the trees of beta build 70291, today’s, and it is what a calculator link carries. v4_ is 70170’s trees (also those of 70245). v3_ is 70009’s trees (written until 1 October). v2_ was written from 20 September on and can be either 69913’s trees or 70009’s; a code with no marker is 69913’s. The calculator reads an older code on its own trees and says what changed. A build’s own page keeps v2_ in its path, read on today’s trees.
  • What follows the marker is <ranks>, and after a second underscore an optional <order>.
  • <ranks> is one segment per tree that has points in it, joined with -. Trees with no points are left out.
  • A segment is <tree id>.<digits>. The tree id is the id of a tree in talents.json.
  • <digits> is one base 32 digit per talent of that tree, in the order that file lists them. The digit is the rank spent, from the alphabet 0123456789abcdefghijklmnopqrstuv. Trailing zeros are trimmed, so a segment is often shorter than the tree, and a missing digit means no points.
  • <order> is the click order, oldest point first: one character per point naming the talent’s position across every tree of the class, in the 62 character alphabet 0-9a-zA-Z. It is written only when the class has 62 talents or fewer and the reader clicked the order themselves, and it is advisory: the ranks decide what the build is.
  • Only 0-9 a-z A-Z . _ - ever appear in a code, which is why it can also be a path segment.

What stays true

A v2 code keeps opening. The version marker is the whole point of the marker: if the layout ever changes, the new one takes a new prefix, and every link already shared goes on opening the build it was shared for. Codes written before the marker existed carry no prefix at all, and those still open too; the calculator rewrites them as v2 on the way in. Nothing else about a code is promised: which builds have a page of their own changes with what people make.

Worked example 1: Warrior, 8 of 51 points

v6_26.35

26 is the Arms tree. 35 is one digit per talent in it, spending 8 points.

PositionDigitTalentRank
1 3 Improved Heroic Strike 3 of 3
2 5 Deflection 5 of 5

Opens at /talents/warrior/#v6_26.35

Worked example 2: Mage, 51 of 51 points

v6_237.25522252231-8.235523

237 is the Arcane tree. 25522252231 is one digit per talent in it, spending 31 points.

PositionDigitTalentRank
1 2 Wand Specialization 2 of 2
2 5 Arcane Focus 5 of 5
3 5 Improved Channeling 5 of 5
4 2 Missile Barrage 2 of 2
5 2 Arcane Subtlety 2 of 2
6 2 Magic Absorption 2 of 2
7 5 Arcane Concentration 5 of 5
8 2 Arcane Resilience 2 of 2
9 2 Arcane Geometry 2 of 2
10 3 Arcane Impact 3 of 3
11 1 Arcane Blast 1 of 1

8 is the Fire tree. 235523 is one digit per talent in it, spending 20 points.

PositionDigitTalentRank
1 2 Improved Fire Blast 2 of 2
2 3 Incineration 3 of 3
3 5 Improved Fireball 5 of 5
4 5 Ignite 5 of 5
5 2 Flame Throwing 2 of 2
6 3 Impact 3 of 3

Opens at /talents/mage/#v6_237.25522252231-8.235523

A decoder to copy

Plain JavaScript, no dependency. It reads a code against one class from talents.json and hands back a rank per talent id. It reads a code; it does not judge a build, so a code edited by hand can decode to more points than the calculator will show you.

// Read a WoW Forever build code against one class from talents.json.
// Returns { "<talent id>": rank }. It reads a code; it does not judge a build:
// the calculator replays every point through the rules, so a hand-edited code
// can decode to more points than the calculator will show.
const B32 = '0123456789abcdefghijklmnopqrstuv';

function decodeBuild(code, cls) {
  // 'v2_26.0503-27.5_a1b' and '#26.0503-27.5' and '26.0503' all read the same.
  const body = String(code).replace(/^#/, '').replace(/^v\d+_/, '').split('_')[0];
  const ranks = {};
  for (const segment of body.split('-')) {
    const dot = segment.indexOf('.');
    if (dot <= 0) continue;
    const tree = cls.trees.find((t) => t.id === Number(segment.slice(0, dot)));
    if (!tree) continue;
    const digits = segment.slice(dot + 1);
    tree.talents.forEach((talent, i) => {
      const rank = i < digits.length ? B32.indexOf(digits[i]) : 0;
      if (rank > 0) ranks[talent.id] = Math.min(rank, talent.max_ranks);
    });
  }
  return ranks;
}

Embed a build

A link around a picture, and a text link under it. No script of ours on your page and no frame of ours either, so it keeps working whatever either of us changes later.

The picture is the card this site already drew for that build. Cards exist for the builds this site holds; for any other code there is no card, so the snippet falls back to the class card and the link still opens the exact build. Both forms are below.

Feral 9/42/0, a build this site holds

<a href="https://wow-forever.gg/talents/druid/b/v6_574.050022-134.05232332120131012551/">
  <img src="https://wow-forever.gg/og/forever/build/druid-4b658e93d95610e5.jpg"
       alt="Feral 9/42/0: a Druid talent build on WoW Forever"
       width="1200" height="630" loading="lazy">
</a>
<p><a href="https://wow-forever.gg/talents/druid/#v6_574.050022-134.05232332120131012551">Open in the WoW Forever talent calculator</a></p>

any other code, falling back to the class card

<a href="https://wow-forever.gg/talents/druid/#v6_26.35">
  <img src="https://wow-forever.gg/og/forever/calc/druid.jpg"
       alt="A druid talent build on WoW Forever"
       width="1200" height="630" loading="lazy">
</a>
<p><a href="https://wow-forever.gg/talents/druid/#v6_26.35">Open in the WoW Forever talent calculator</a></p>

The calculator’s own share sheet is unchanged. It follows the build on screen, and the build on screen usually has no card of its own, so a Copy embed button there would hand out the class card most of the time and look like it had failed.

Tooltips for your links

One line in your page, and every link you already make to an item or a spell here shows the game tooltip our own pages show when someone points at it: name, stats, effects and sell price for an item; cost, cast time, range and the ability’s own words for a spell.

<script src="https://wow-forever.gg/embed/tooltips.js" defer></script>

17 KB, 7 KB compressed

What it does

  • It looks for ordinary links to https://wow-forever.gg/db/items/<id>-<name>/ and https://wow-forever.gg/db/spells/<id>-<name>/, for example https://wow-forever.gg/db/items/12640-lionheart-helm/. You write the link; the script never adds, moves or rewrites one.
  • Hover shows the tooltip next to the pointer. Tabbing to the link shows it under the link, and Escape hides it. On a phone the first tap shows it and the second opens the page.
  • Every tooltip ends in one line, wow-forever.gg, linking the record.
  • Its look is sealed off from your page in both directions: your styles cannot change the tooltip, and its styles cannot touch anything of yours.
  • A link you want left alone takes data-wf-tip="off", on the link or on anything around it.

What it does not do

  • No cookies, no storage, no analytics, no tracking of any kind, of you or of your readers.
  • Nothing is fetched when your page loads. The only request it ever makes is the tooltip of a link somebody pointed at, tabbed to or tapped, sent without cookies and without saying which page it came from.
  • Nothing breaks when it cannot reach us. The link stays a plain link and your page carries on.

Try it

Point at these, or tab to them. They are plain links, handled by the same script tag as above.

Free to use. On any site, commercial or not, with no key and no sign-up. The link itself is the credit: keep it pointing here and the tooltip does the rest.

Our news in your Discord

Every list on this site that changes has an RSS feed, and a Discord channel can follow any of them. Pick the feed that fits the channel: most guild servers want News, a theorycrafting channel wants Build changes. Every address starts with this site, so the News feed is https://wow-forever.gg/rss.xml.

FeedWhat arrivesAddress
News Every post on /news/: Blizzard announcements we write up, our own game write-ups, and the short post that announces each new game build. /rss.xml
What's new The What's new list: Blizzard's posts, what each build changed and what this site added, the newest 30. /whats-new/feed.xml
Build changes One entry per new game build, with the counts its changelog prints. /changelog/feed.xml
Official posts Blizzard's own posts about WoW Forever, as a short excerpt with the link to the original. /official.xml

Discord has no feed reader of its own, so a post reaches the channel one of two ways. Both are free, and both take a few minutes. You need the Manage Server permission, or Manage Webhooks for the second.

With an RSS bot

  1. Open Discord’s App Directory from your server’s menu and search for “RSS”. Pick a free RSS bot with plenty of servers and recent reviews, and add it to your server.
  2. In the channel that should get the posts, run the bot’s add-a-feed command (each bot lists its commands when you type /) and paste one of the addresses above.
  3. The bot checks the feed every few minutes and posts each new entry with its title and link. Our feeds change a few times a day at most, so the free tier of any bot is enough.

With a webhook

  1. In Discord, open the channel’s settings, then Integrations, then Webhooks, and choose New Webhook. Name it, pick the channel and copy the webhook URL.
  2. In a feed-to-webhook service or an automation tool that can watch an RSS feed, make a rule: when the feed has a new item, post it to that webhook URL.
  3. Paste one of the addresses above as the feed. Keep the webhook URL to yourself: anyone who has it can post in that channel.

A feed entry is the title, the date and the link, so the post in Discord opens the page here, where the figures and the pictures are. Nothing to credit: linking the page is the credit.

Our own statistics

4 figures

What this site counted itself, and nothing else. Every figure carries the sentence that says who counted it, what was counted, over how many and when, so you can judge it before you print it.

A figure whose sample is under its floor is left out whole rather than trimmed or printed small: a question this site cannot answer yet is missing here, never guessed. Counts of finished talent builds join the file once enough builds have been made in the calculator.

stats.json 3 KB

QuestionCountedWhere the number comes from
Which classes people play 1,912 From 1,912 players seen in the beta, to 14 Oct 2026
Which faction people play 612 From 612 players seen in the beta, to 14 Oct 2026
Which levels people are 1,912 From 1,912 players seen in the beta, to 14 Oct 2026
Which races people play 1,912 From 1,912 players seen in the beta, to 14 Oct 2026

Not in this file. Anybody else’s counting, whatever it says. The talent builds the community published before launch are counted separately, are never added to a live count, and are not here: they are not ours to hand on.

What is not here

The database is the site itself: items, spells, quests, zones, routes and what changed since Classic are pages, with a tooltip, a picture and a sentence around every number, and they are not offered as files. Anything a reader shared with us is counted and never handed on as rows.

Reach us

A field you need that is not here, a number that looks wrong, or something you built with these and want us to see: the Contact card on the home page reaches us, and we read everything.

What we publish · About this site

Share

Share this page

The preview card for For tool makers
What a paste of this link shows
Download image

Post it to

Nothing is sent anywhere until you press one of these. WoW Forever has no share counters.