GET/api/v1· API index
What's available: every endpoint, when the data was last synced, the rate limit and the data sources.
Developers
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.
429 Too Many Requests for a short while; wait and retry. It can take a few seconds to kick in.meta.updatedAt says when). Answers are cached for up to 15 minutes, so polling faster gains nothing.meta.attribution and meta.sources say so in every answer./api/v2).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.
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.
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"
},
"…"
]
}
}[{ name, url }].What's available: every endpoint, when the data was last synced, the rate limit and the data sources.
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.
| Parameter | In | What it does |
|---|---|---|
| faction | query | Only what this faction can do (results marked for both factions are included). One of alliance, horde. |
| minLevel | query | Only dungeons that are open at this level or higher. |
| maxLevel | query | Only dungeons that are open at this level or lower. |
| q | query | Only names containing this text (case-insensitive). |
Returns [DungeonSummary] · Try it: /api/v1/dungeons?faction=horde&maxLevel=30
One dungeon in full: its quests (with XP, rewards and prerequisites), bosses, loot and notes.
| Parameter | In | What it does |
|---|---|---|
| id | path | The dungeon's id, as in its page address (wailing-caverns). |
Returns Dungeon · Try it: /api/v1/dungeons/wailing-caverns
Dungeon quests and elite (group) quests, with XP, level, faction, rewards and prerequisites.
| Parameter | In | What it does |
|---|---|---|
| type | query | Only dungeon quests, or only elite (group) quests. One of dungeon, elite. |
| dungeon | query | Only this dungeon's quests (its id). |
| faction | query | Only what this faction can do (results marked for both factions are included). One of alliance, horde. |
| class | query | Only quests this class can do (warrior, priest, …); class-only quests for other classes are left out. |
| minLevel | query | Only quests at this level or higher. |
| maxLevel | query | Only quests at this level or lower. |
| q | query | Only names containing this text (case-insensitive). |
| limit | query | Results per page (default 100, at most 500). |
| offset | query | How 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
One quest by its game quest id (the number in its Wowhead address).
| Parameter | In | What it does |
|---|---|---|
| questId | path | The game's quest id. |
Returns Quest · Try it: /api/v1/quests/1486
Item summaries: quality, item level, required level, slot, armor type and stats. Covers every item the site knows (dungeon loot, quest and reputation rewards).
| Parameter | In | What it does |
|---|---|---|
| ids | query | Only these item ids, comma-separated. |
| quality | query | Only this quality. One of poor, common, uncommon, rare, epic, legendary. |
| slot | query | Only this slot (Head, Chest, Two-Hand, …). |
| minLevel | query | Only items whose required level is at least this. |
| maxLevel | query | Only items whose required level is at most this. |
| q | query | Only names containing this text (case-insensitive). |
| limit | query | Results per page (default 100, at most 500). |
| offset | query | How many results to skip, for the next page (see page.next). |
Returns [ItemSummary], paged · Try it: /api/v1/items?quality=rare&maxLevel=25
One item: its summary, full tooltip lines, which dungeons drop it and which quests reward it.
| Parameter | In | What it does |
|---|---|---|
| id | path | The game's item id. |
Returns Item · Try it: /api/v1/items/6465
Rare spawns with their zone, levels, coordinates and drops.
| Parameter | In | What it does |
|---|---|---|
| zone | query | Only rares in this zone (its name). |
| faction | query | Only what this faction can do (results marked for both factions are included). One of alliance, horde. |
| q | query | Only names containing this text (case-insensitive). |
Returns [Rare] · Try it: /api/v1/rares?zone=The%20Barrens
Questing zones with their level range and who they're for.
| Parameter | In | What it does |
|---|---|---|
| faction | query | Only what this faction can do (results marked for both factions are included). One of alliance, horde. |
| minLevel | query | Only zones that overlap at this level or higher. |
| maxLevel | query | Only zones that overlap at this level or lower. |
Returns [Zone] · Try it: /api/v1/zones?faction=horde&maxLevel=30
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
Quests that unlock class abilities and notable items, by class and level.
| Parameter | In | What it does |
|---|---|---|
| class | query | Only this class's quests. |
| faction | query | Only 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
Missing values are null, never left out. Levels are character levels; XP is what Forever gives (see xpEstimated).
| name | string | The API's name. |
| version | string | "v1". |
| endpoints | [object] | Every endpoint: path, summary, url of an example request. |
| docs | string | The human docs. |
| openapi | string | The OpenAPI 3.1 spec. |
| id | string | Stable id, used in addresses (wailing-caverns). |
| name | string | Its name. |
| minLevel | integer | Lowest level it's meant for. |
| maxLevel | integer | Highest level it's meant for. |
| zone | string | Where it is. |
| entrance | string | null | Where the entrance is. |
| access | string | null | alliance or horde when the entrance is in a faction capital the other side can't realistically reach. |
| isNew | boolean | New to Forever. |
| status | string | launch (in the game) or announced. |
| betaLocked | boolean | Not open in the beta yet. |
| bosses | [string] | Bosses, in order. |
| questCount | integer | How many quests it has (both factions). |
| lootCount | integer | How many drops it has. |
| url | string | Its page on Forever Companion. |
| … | DungeonSummary | Every DungeonSummary field, plus: |
| quests | [Quest] | Its quests. |
| loot | [Loot] | Its drop table. |
| notes | [string] | null | Practical notes. |
| questId | integer | null | The game's quest id; missing for the few quests not matched to the game yet. |
| type | string | dungeon or elite. |
| name | string | Its name. |
| level | integer | null | Quest level. |
| minLevel | integer | null | Level needed to pick it up. |
| faction | string | alliance, horde or both. |
| classes | [string] | null | Only these classes can do it. |
| xp | integer | null | XP in Forever. |
| xpEstimated | boolean | The XP is estimated from Classic's, not seen in Forever yet. |
| classicXp | integer | null | XP in Classic, for comparison. |
| dungeon | object | null | { id, name } of its dungeon (dungeon quests). |
| zone | string | null | Its zone (elite quests). |
| giver | string | null | Who gives it. |
| location | string | null | Where the giver is. |
| objective | string | null | What to do. |
| rewards | object | { items: [{ id, name }], choice }: reward items, and whether you choose one. |
| prerequisites | [[object]] | null | Quests to do first, earliest first; each step's quests ({ questId, name }) are done side by side. |
| confidence | string | null | beta (seen in Forever), classic (carried over) or announced. |
| verified | Verified | null | What players' games confirmed through the Forever Companion app. |
| wowhead | string | null | Its Wowhead page. |
| url | string | Where it is on Forever Companion. |
| id | integer | The game's item id. |
| name | string | Its name. |
| quality | string | poor, common, uncommon, rare, epic or legendary. |
| icon | string | null | Icon name; image at https://wow.zamimg.com/images/wow/icons/large/{icon}.jpg. |
| itemLevel | integer | null | Item level. |
| requiredLevel | integer | null | Level needed to use it. |
| slot | string | null | Slot (Chest, Two-Hand, …). |
| armor | string | null | cloth, leather, mail or plate. |
| weaponType | string | null | Weapon type (Staff, Sword, …). |
| stats | [string] | Stats it has (stamina, spellpower, …). |
| classicOnly | boolean | Only Classic's stats are known; not seen in Forever yet. |
| verified | integer | null | How many players' games confirmed its quality, item level and level requirement. |
| wowhead | string | Its Wowhead page. |
| … | ItemSummary | Every ItemSummary field, plus: |
| tooltip | [object] | null | Tooltip 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. |
| itemId | integer | null | The item's id, when known. |
| name | string | The item's name. |
| slot | string | Its slot. |
| quality | string | null | Its quality. |
| source | string | null | Who drops it (a boss), when known. |
| id | string | Stable id. |
| name | string | Its name. |
| zone | string | Its zone. |
| levels | string | Its level or range (24 or 24-25). |
| faction | string | Who can reach it: alliance, horde or both. |
| coords | [string] | Spawn points as x, y map coordinates. |
| elite | boolean | A rare elite. |
| tameable | string | null | Hunter pet family, if tameable. |
| loot | [Loot] | Notable drops. |
| verified | integer | null | How many players' games saw it. |
| id | string | Stable id. |
| name | string | Its name. |
| minLevel | integer | Lowest level it's meant for. |
| maxLevel | integer | Highest level it's meant for. |
| faction | string | Who it's for: alliance, horde or both. |
| isNew | boolean | New to Forever. |
| race | string | null | Only this race can reach it (Zephras Isle is Skyborne-only). |
| id | string | Stable id. |
| name | string | Its name. |
| factionNames | object | Its name on each side: { alliance?, horde? }. |
| minLevel | integer | Level to start. |
| currency | string | null | What rewards cost, if not reputation itself. |
| summary | string | What it is. |
| howTo | [string] | How to earn it. |
| standings | [object] | { standing, reputation, unlocks }. |
| rewards | [object] | { itemId, name, kind, profession?, skill?, cost, standing? }. |
| status | string | live or announced. |
| id | string | Stable id. |
| class | string | The class (warlock, …). |
| level | integer | Level it becomes available. |
| name | string | Its name. |
| faction | string | alliance, horde or both. |
| races | [string] | null | Only these races. |
| giver | string | null | Who gives it. |
| location | string | null | Where. |
| reward | string | What it unlocks. |
| essential | boolean | Unlocks a core ability. |
| players | integer | How many players' games. |
| facts | [string] | What was confirmed (XP, level, dungeon, name, zone). |
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.