WARCRAFT FOREVER / DEVELOPERS
Game data
Read versioned items, recipes, professions, supported spells, and reference values from JavaScript or MCP.
Use the public data library to build search, selectors, and custom displays. Responses identify their dataset, source and coverage. No account or API key is required.
JavaScript
Import the browser module from Warcraft Forever:
import {
Items,
Spells,
Recipes,
Professions,
References,
manifest,
createClient
} from 'https://warcraftforever.com/data/latest.mjs';
const item = await Items.get(118, { locale: 'enUS' });
console.log(item.data); // Item record, or null when this dataset has no match.
const recipes = await Recipes.getMany([2149, 2152], { locale: 'enUS' });
console.log(recipes.data, recipes.missingIds);
const professions = await Professions.search('', { limit: 25 });
const spells = await Spells.search('wrath', { limit: 10 });
const references = await References.list({ locale: 'enUS' });
console.log(professions.data, spells.data, references.data);Items, Recipes, Professions, and Spells each provide get(id, options), getMany(ids, options), and search(query, options). References.list(options) returns the complete small reference groups.
Every read returns an envelope with schemaVersion, dataset, locale, resource, source, coverage, and data. A single lookup returns a record or null in data. Batch reads return an array and missingIds; search returns an array and nextCursor, which is null at the end. Check the response’s coverage before interpreting a missing record.
Names report their actual language through nameLocale. Missing translations can fall back to English; an unknown name remains null. Item records include effects and flavor text when available. Recipes retain product, reagent, skill, and cooldown information from the maintained client data. Numeric IDs and absent optional fields retain their published meaning.
Discovery is loaded once per client. References.list() also lazily caches its complete small catalog in memory per dataset and locale, sharing concurrent requests. Returned objects are independent copies; failed loads can be retried. Create a new client or reload the page to discover newer data. Item, recipe, profession, and spell lookups remain bounded server requests.
Failed requests reject. Show an error or retry state instead of treating a failure as an empty dataset.
Pin a dataset
The manifest lists the published channels and an immutable dataset ID for each resource:
const published = await manifest();
const channel = published.channels[published.defaultChannel];
const options = { dataset: channel.datasets.items, locale: 'enUS' };
const first = await Items.search('copper', { ...options, limit: 25 });
console.log(first.source, first.coverage, first.data);
if (first.nextCursor) {
const next = await Items.search('copper', {
...options,
dataset: first.dataset,
cursor: first.nextCursor,
limit: 25
});
console.log(next.data);
}A channel follows its published dataset. A dataset pin selects one immutable resource version. Copy the pin for the resource you are reading: an item dataset and a spell dataset need not have the same ID, even when they describe the same client build. Keep the dataset, locale, query, and includeUnknown setting when continuing a search; a cursor from another scope is rejected.
Batch reads accept up to 50 IDs. Search defaults to 25 records and allows at most 100 per page. Queries are limited to 64 characters and match names literally: % and _ are not wildcards. An empty query browses the resource. Undiscovered records are excluded from search unless includeUnknown: true is supplied; a direct ID lookup can still return one.
Configure defaults for several reads with createClient:
const game = createClient({ channel: 'beta', locale: 'deDE' });
const recipe = await game.Recipes.get(2149);
console.log(recipe.data?.name, recipe.data?.nameLocale);createClient({ origin, channel, dataset, locale, reader }) accepts an optional origin for another Warcraft Forever deployment and defaults for requests. Per-call options select a different resource pin or locale when needed.
Availability and caller storage
Public origin snapshots keep the latest three distinct published pin sets per patch across the latest two patches of each channel. Patch means the first three client-build components. Same-build changed pins count as another revision; identical pins do not. Active deployments and explicitly selected rollback targets remain protected while referenced. Expired pins return 404, never newer data. Code pins and saved calculator layouts have separate compatibility lifetimes.
An optional per-client reader(url, options) returns a normal fetch Response for discovery and resource JSON. The default is unchanged network fetching. You can map resolved paths and query strings to your own storage; an explicit dataset skips discovery. Keep matching response envelopes, locale, query, cursor and missing-ID metadata. Saved records alone do not provide an offline search engine. Reference/discovery caching, retries, errors and returned-object isolation remain unchanged. Images and linked site pages remain separate resources. The library includes no bulk exporter or storage adapter registry.
const saved = createClient({ dataset: savedItemDataset, reader: readSavedResponse });
const item = await saved.Items.get(118);Here readSavedResponse is your application function returning a Response from a matching saved request. Its archive lifetime is independent of origin retention.
Coverage and reference values
The available item and recipe data is the maintained profession corpus. It includes crafting products, materials, tools, and teaching items; it is not a complete item database. Profession records describe the maintained profession definitions and categories.
The spell resource covers talent and Legacy rank variants plus recipe spells. One spell ID can have several rank variants; preserve those variants when displaying descriptions. This is not a complete spellbook or proof that a spell is available to a particular character.
Reference groups provide quality, equipment-slot, school, power, stat, and class-color values. Keep their source and inference markers. School IDs and school bitmasks have different meanings; site presentation colors are not client availability data.
There are no published quest, loot, or NPC datasets in this interface. The manifest reports unavailable resources explicitly. A missing item, spell, or relationship does not prove it is absent from the game.
HTTP and MCP
Read the data manifest directly to discover dataset pins, limits, and unavailable resources. The class, race, faction, and pet-family catalogs remain available separately.
Connect an agent to the public MCP endpoint. It offers:
| Tool | Use |
|---|---|
discover_data | Discover published resource pins, builds, limits, and unavailable datasets. |
get_records | Read a bounded batch of item, recipe, profession, or supported spell IDs. |
search_records | Search or browse records with a bounded cursor page. |
get_references | Read all small reference groups for a published dataset. |
Data tools accept a client locale and either a channel or an explicit dataset pin. A pin takes precedence over the channel. They use the same public resolver and response envelopes as the library; resolver failures remain errors.
MCP resources include the published Markdown documents and both manifests. Resources at warcraftforever://schemas/get_records, warcraftforever://schemas/search_records, warcraftforever://schemas/get_references, and warcraftforever://schemas/discover_data describe tool inputs. They are generated from the tools’ validation schemas. TypeScript declarations describe response records.