Developers

Forever Companion API

Free, read-only JSON with the same WoW Forever data the site shows: dungeons, quests, items, rares, zones, reputations and class quests, refreshed after every sync. No key or sign-up. Build a bot, an addon companion, a fan site or an agent tool with it.

Quick start

Every endpoint is a plain GET under https://forevercompanion.io/api/v1 and answers JSON. Browsers can call it from any site (CORS is open).

curl "https://forevercompanion.io/api/v1/quests?type=dungeon&faction=horde&minLevel=15&maxLevel=20"
const res = await fetch("https://forevercompanion.io/api/v1/dungeons/wailing-caverns");
const { data, meta } = await res.json();
console.log(data.name, data.quests.length, "quests · data from", meta.updatedAt);

Start at /api/v1: it lists every endpoint with an example you can open.

Limits and fair use

  • 120 requests per 60 seconds per IP. Over that, you get 429 Too Many Requests for a short while; wait and retry. It can take a few seconds to kick in.
  • Cache on your side. The data changes when the site syncs, every 6 hours (meta.updatedAt says when). Answers are cached for up to 15 minutes, so polling faster gains nothing.
  • Credit the data. Link back to Forever Companion. The game data is gathered from ForeverChanges, Wowhead and Zockify and checked in game by players; meta.attribution and meta.sources say so in every answer.
  • Stable within v1. Fields may be added; nothing is renamed or removed without a new version (/api/v2).
  • It's a fan project: no uptime guarantee. Data from the Forever beta can change at launch. Not affiliated with Blizzard Entertainment.

Sources: ForeverChanges (opens foreverchanges.pro, a separate site, in a new tab), Wowhead (opens wowhead.com, a separate site, in a new tab) and Zockify (opens zockify.com, a separate site, in a new tab).

These are independent sites, not affiliated with Forever Companion. Links open their sites in a new tab.

For AI agents

The full API is described as OpenAPI 3.1 at /api/v1/openapi.json: point an agent framework or code generator at it. A plain-text summary of the site and its data is at /llms.txt.

Tips for agents: filter on the server (faction, minLevel, maxLevel, q) instead of fetching everything; follow page.next for more results; quests are keyed by the game's quest id (questId), the same number as on Wowhead; prefer values with verified set, which players' games confirmed.

Response format

Every answer has data (an object or a list) and meta. Lists that can be long (/quests, /items) also have page: 100 results per page by default, up to 500 with limit.

{
  "data": [
    {
      "questId": 1486,
      "type": "dungeon",
      "name": "Deviate Hides",
      "level": 17,
      "minLevel": 13,
      "faction": "both",
      "classes": null,
      "xp": 3120,
      "xpEstimated": false,
      "classicXp": 1600,
      "dungeon": {
        "id": "wailing-caverns",
        "name": "Wailing Caverns"
      },
      "zone": null,
      "giver": "Nalpak",
      "location": "The Barrens",
      "objective": "Nalpak in the Wailing Caverns wants 20 Deviate Hides.",
      "rewards": {
        "items": [
          {
            "id": 918,
            "name": "Deviate Hide Pack"
          },
          {
            "id": 6480,
            "name": "Slick Deviate Leggings"
          }
        ],
        "choice": true
      },
      "prerequisites": null,
      "confidence": "beta",
      "verified": null,
      "wowhead": "https://www.wowhead.com/forever/quest=1486",
      "url": "https://forevercompanion.io/dungeons/wailing-caverns"
    }
  ],
  "page": {
    "total": 7,
    "limit": 100,
    "offset": 0,
    "next": null
  },
  "meta": {
    "updatedAt": "2026-10-28T12:03:32.483+00:00",
    "version": "v1",
    "docs": "https://forevercompanion.io/developers",
    "attribution": "Data from Forever Companion (https://forevercompanion.io) …",
    "sources": [
      {
        "name": "ForeverChanges",
        "url": "https://foreverchanges.pro"
      },
      "…"
    ]
  }
}
meta.updatedAt
When the game data was last synced (ISO 8601), or null.
meta.version
The API version, "v1".
meta.docs
Where the docs are.
meta.attribution
How to credit the data.
meta.sources
The sites the data comes from: [{ name, url }].
page.total
How many results match.
page.limit
Results per page.
page.offset
Results skipped.
page.next
The URL of the next page, or null on the last one.

Endpoints

GET/api/v1· API index

What's available: every endpoint, when the data was last synced, the rate limit and the data sources.

Returns Index · Try it: /api/v1

GET/api/v1/dungeons· List dungeons

Every dungeon with its level range, zone, bosses and how many quests and drops it has. Use the dungeon endpoint for the quests and loot themselves.

ParameterWhat it does
factionOnly what this faction can do (results marked for both factions are included). One of alliance, horde.
minLevelOnly dungeons that are open at this level or higher.
maxLevelOnly dungeons that are open at this level or lower.
qOnly names containing this text (case-insensitive).

Returns [DungeonSummary] · Try it: /api/v1/dungeons?faction=horde&maxLevel=30

GET/api/v1/dungeons/{id}· Get a dungeon

One dungeon in full: its quests (with XP, rewards and prerequisites), bosses, loot and notes.

ParameterWhat it does
idThe dungeon's id, as in its page address (wailing-caverns).

Returns Dungeon · Try it: /api/v1/dungeons/wailing-caverns

GET/api/v1/quests· List quests

Dungeon quests and elite (group) quests, with XP, level, faction, rewards and prerequisites.

ParameterWhat it does
typeOnly dungeon quests, or only elite (group) quests. One of dungeon, elite.
dungeonOnly this dungeon's quests (its id).
factionOnly what this faction can do (results marked for both factions are included). One of alliance, horde.
classOnly quests this class can do (warrior, priest, …); class-only quests for other classes are left out.
minLevelOnly quests at this level or higher.
maxLevelOnly quests at this level or lower.
qOnly names containing this text (case-insensitive).
limitResults per page (default 100, at most 500).
offsetHow many results to skip, for the next page (see page.next).

Returns [Quest], paged · Try it: /api/v1/quests?type=dungeon&faction=horde&minLevel=15&maxLevel=20

GET/api/v1/quests/{questId}· Get a quest

One quest by its game quest id (the number in its Wowhead address).

ParameterWhat it does
questIdThe game's quest id.

Returns Quest · Try it: /api/v1/quests/1486

GET/api/v1/items· List items

Item summaries: quality, item level, required level, slot, armor type and stats. Covers every item the site knows (dungeon loot, quest and reputation rewards).

ParameterWhat it does
idsOnly these item ids, comma-separated.
qualityOnly this quality. One of poor, common, uncommon, rare, epic, legendary.
slotOnly this slot (Head, Chest, Two-Hand, …).
minLevelOnly items whose required level is at least this.
maxLevelOnly items whose required level is at most this.
qOnly names containing this text (case-insensitive).
limitResults per page (default 100, at most 500).
offsetHow many results to skip, for the next page (see page.next).

Returns [ItemSummary], paged · Try it: /api/v1/items?quality=rare&maxLevel=25

GET/api/v1/items/{id}· Get an item

One item: its summary, full tooltip lines, which dungeons drop it and which quests reward it.

ParameterWhat it does
idThe game's item id.

Returns Item · Try it: /api/v1/items/6465

GET/api/v1/rares· List rares

Rare spawns with their zone, levels, coordinates and drops.

ParameterWhat it does
zoneOnly rares in this zone (its name).
factionOnly what this faction can do (results marked for both factions are included). One of alliance, horde.
qOnly names containing this text (case-insensitive).

Returns [Rare] · Try it: /api/v1/rares?zone=The%20Barrens

GET/api/v1/zones· List zones

Questing zones with their level range and who they're for.

ParameterWhat it does
factionOnly what this faction can do (results marked for both factions are included). One of alliance, horde.
minLevelOnly zones that overlap at this level or higher.
maxLevelOnly zones that overlap at this level or lower.

Returns [Zone] · Try it: /api/v1/zones?faction=horde&maxLevel=30

GET/api/v1/reputations· List reputations

Reputations new to Forever (Waylaid Supplies, Merchant's Favor): how to earn them, standings and every reward with its cost.

Returns [Reputation] · Try it: /api/v1/reputations

GET/api/v1/class-quests· List class quests

Quests that unlock class abilities and notable items, by class and level.

ParameterWhat it does
classOnly this class's quests.
factionOnly what this faction can do (results marked for both factions are included). One of alliance, horde.

Returns [ClassQuest] · Try it: /api/v1/class-quests?class=warlock

Data shapes

Missing values are null, never left out. Levels are character levels; XP is what Forever gives (see xpEstimated).

Index · The API's own description.

namestringThe API's name.
versionstring"v1".
endpoints[object]Every endpoint: path, summary, url of an example request.
docsstringThe human docs.
openapistringThe OpenAPI 3.1 spec.

DungeonSummary · A dungeon without its quests and loot.

idstringStable id, used in addresses (wailing-caverns).
namestringIts name.
minLevelintegerLowest level it's meant for.
maxLevelintegerHighest level it's meant for.
zonestringWhere it is.
entrancestring | nullWhere the entrance is.
accessstring | nullalliance or horde when the entrance is in a faction capital the other side can't realistically reach.
isNewbooleanNew to Forever.
statusstringlaunch (in the game) or announced.
betaLockedbooleanNot open in the beta yet.
bosses[string]Bosses, in order.
questCountintegerHow many quests it has (both factions).
lootCountintegerHow many drops it has.
urlstringIts page on Forever Companion.

Dungeon · A dungeon in full.

…DungeonSummaryEvery DungeonSummary field, plus:
quests[Quest]Its quests.
loot[Loot]Its drop table.
notes[string] | nullPractical notes.

Quest · A dungeon or elite quest.

questIdinteger | nullThe game's quest id; missing for the few quests not matched to the game yet.
typestringdungeon or elite.
namestringIts name.
levelinteger | nullQuest level.
minLevelinteger | nullLevel needed to pick it up.
factionstringalliance, horde or both.
classes[string] | nullOnly these classes can do it.
xpinteger | nullXP in Forever.
xpEstimatedbooleanThe XP is estimated from Classic's, not seen in Forever yet.
classicXpinteger | nullXP in Classic, for comparison.
dungeonobject | null{ id, name } of its dungeon (dungeon quests).
zonestring | nullIts zone (elite quests).
giverstring | nullWho gives it.
locationstring | nullWhere the giver is.
objectivestring | nullWhat to do.
rewardsobject{ items: [{ id, name }], choice }: reward items, and whether you choose one.
prerequisites[[object]] | nullQuests to do first, earliest first; each step's quests ({ questId, name }) are done side by side.
confidencestring | nullbeta (seen in Forever), classic (carried over) or announced.
verifiedVerified | nullWhat players' games confirmed through the Forever Companion app.
wowheadstring | nullIts Wowhead page.
urlstringWhere it is on Forever Companion.

ItemSummary · An item's key facts.

idintegerThe game's item id.
namestringIts name.
qualitystringpoor, common, uncommon, rare, epic or legendary.
iconstring | nullIcon name; image at https://wow.zamimg.com/images/wow/icons/large/{icon}.jpg.
itemLevelinteger | nullItem level.
requiredLevelinteger | nullLevel needed to use it.
slotstring | nullSlot (Chest, Two-Hand, …).
armorstring | nullcloth, leather, mail or plate.
weaponTypestring | nullWeapon type (Staff, Sword, …).
stats[string]Stats it has (stamina, spellpower, …).
classicOnlybooleanOnly Classic's stats are known; not seen in Forever yet.
verifiedinteger | nullHow many players' games confirmed its quality, item level and level requirement.
wowheadstringIts Wowhead page.

Item · An item in full.

…ItemSummaryEvery ItemSummary field, plus:
tooltip[object] | nullTooltip lines as in game: { left, right?, kind, changed? }. kind is plain, green, set, bonus, muted or flavor; changed marks lines that differ from Classic.
dropsFrom[object]{ dungeon: { id, name }, source }: dungeons that drop it, and the boss when known.
rewardFrom[object]{ questId, name, type }: quests that reward it.

Loot · One drop in a dungeon's loot table.

itemIdinteger | nullThe item's id, when known.
namestringThe item's name.
slotstringIts slot.
qualitystring | nullIts quality.
sourcestring | nullWho drops it (a boss), when known.

Rare · A rare spawn.

idstringStable id.
namestringIts name.
zonestringIts zone.
levelsstringIts level or range (24 or 24-25).
factionstringWho can reach it: alliance, horde or both.
coords[string]Spawn points as x, y map coordinates.
elitebooleanA rare elite.
tameablestring | nullHunter pet family, if tameable.
loot[Loot]Notable drops.
verifiedinteger | nullHow many players' games saw it.

Zone · A questing zone.

idstringStable id.
namestringIts name.
minLevelintegerLowest level it's meant for.
maxLevelintegerHighest level it's meant for.
factionstringWho it's for: alliance, horde or both.
isNewbooleanNew to Forever.
racestring | nullOnly this race can reach it (Zephras Isle is Skyborne-only).

Reputation · A reputation and its rewards.

idstringStable id.
namestringIts name.
factionNamesobjectIts name on each side: { alliance?, horde? }.
minLevelintegerLevel to start.
currencystring | nullWhat rewards cost, if not reputation itself.
summarystringWhat it is.
howTo[string]How to earn it.
standings[object]{ standing, reputation, unlocks }.
rewards[object]{ itemId, name, kind, profession?, skill?, cost, standing? }.
statusstringlive or announced.

ClassQuest · A quest that unlocks a class ability or item.

idstringStable id.
classstringThe class (warlock, …).
levelintegerLevel it becomes available.
namestringIts name.
factionstringalliance, horde or both.
races[string] | nullOnly these races.
giverstring | nullWho gives it.
locationstring | nullWhere.
rewardstringWhat it unlocks.
essentialbooleanUnlocks a core ability.

Verified · Confirmed in game: at least three players' games reported the same values.

playersintegerHow many players' games.
facts[string]What was confirmed (XP, level, dungeon, name, zone).

Errors

Errors answer JSON with a code you can check and a message you can show:

{ "error": { "code": "not_found", "message": "No dungeon with that id." }, "meta": { … } }
  • 400 bad_parameter: a parameter isn't valid; the message says which and why.
  • 404 not_found: no such thing, or no such endpoint.
  • 429: over the rate limit (sent by the host, not in this format). Wait and retry.
  • 503 unavailable: the data couldn't be loaded; try again in a minute.

Questions or ideas? Use the feedback form.