Guild Wars 2 API
The official Guild Wars 2 API: items, recipes, world bosses, WvW matches and trading post prices, all key-free for public data. Tested curl example and live response.
Endpoint tested and returned HTTP 200 on 2026-08-21
What is the Guild Wars 2 API?
The Guild Wars 2 API is ArenaNet's official public API. Items, skills, recipes, maps, achievements, World vs World match state and live trading post prices are all readable with no API key; only account-specific endpoints require one.
This is a first-party API that has been running since 2013, and its longevity is the reason to prefer it over the fan-built trading post trackers that have accumulated around it. The design is unusual in one respect: most collection endpoints, called bare, return an array of ids rather than an array of objects. `/v2/items` with no parameters hands back roughly ninety thousand integers. You then request the ones you want with `?ids=24,68`, up to 200 at a time. It feels awkward until you realise it makes client-side caching trivial — you diff the id list, and fetch only what is new.
Watch the `details` object. It is polymorphic: its shape is determined by `details.type`, so a consumable carries `{ type: "Generic" }` while an armour piece carries weight class, defence, infusion slots and an `infix_upgrade` block. Treat it as a tagged union keyed on `type` rather than a fixed record. There is also a schema-versioning system — pass a `v=` date parameter to pin the response shape — which is worth using in anything long-lived, because unpinned responses follow the latest schema.
Quick facts
- Base URL
https://api.guildwars2.com/v2- Authentication
- Public game data needs no key. Account endpoints (inventory, characters, wallet) require a player-generated API key, which we did not use or need.
- Rate limit
- The response carried `x-rate-limit-limit: 600`. ArenaNet operates a leaky-bucket limiter per address; batching ids is the intended way to stay inside it.
- Pricing
- Free. It is ArenaNet's own API, funded as part of the game.
- CORS
- Enabled — callable directly from browser JavaScript
- Official docs
- Read the docs
How to use the Guild Wars 2 API
Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.
1. Fetch two Guild Wars 2 items by id
GET https://api.guildwars2.com/v2/items?ids=24,68
curl 'https://api.guildwars2.com/v2/items?ids=24,68'const res = await fetch("https://api.guildwars2.com/v2/items?ids=24,68");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);import requests
res = requests.get("https://api.guildwars2.com/v2/items?ids=24,68", timeout=20)
res.raise_for_status()
print(res.json())[
{
"name": "Sealed Package of Snowballs",
"description": "Open this package to create several snowballs that can hit anyone else holding a snowball.",
"type": "Consumable",
"level": 0,
"rarity": "Basic",
"vendor_value": 0,
"game_types": [
"Pve"
],
"flags": [
"NoSalvage"
],
"restrictions": [],
"id": 24,
"chat_link": "[&AgEYAAAA]",
"icon": "https://render.guildwars2.com/file/1D05D1EE04E16E69710E1EAB11AC466BBF105778/219347.png",
"details": {
"type": "Generic"
}
},
{
"name": "Mighty Country Coat",
"description": "",
"type": "Armor",
"level": 0,
"rarity": "Basic",
"vendor_value": 6,
"default_skin": 13,
"game_types": [
"Activity",
"Wvw",
"Dungeon",
"Pve"
],
"flags": [
"NotUpgradeable"
],
"restrictions": [],
"id": 68,
"chat_link": "[&AgFEAAAA]",
"icon": "https://render.guildwars2.com/file/F03808FFE89B40044671EED2E427053B389BE0A1/61007.png",
"details": {
"type": "Coat",
"weight_class": "Light",
"defense": 23,
"infusion_slots": [],
"attribute_adjustment": 11.583,
"infix_upgrade": {
"id": 137,
"attributes": [
{
"attribute": "Power",
"modifier": 4
}
]
},
"secondary_suffix_item_id": ""
}
}
]Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
ids | query | Optional | Comma-separated ids, up to 200 per request. Omit it to get the full id list instead of objects. 24,68 |
lang | query | Optional | Response language: `en`, `es`, `de`, `fr`, `zh`. en |
page / page_size | query | Optional | Page through a collection without listing ids first. `page_size` caps at 200. 0 |
v | query | Optional | Schema version date. Pin this in production so a schema update cannot change your response shape. 2022-03-23T19:00:00.000Z |
Response fields
(root)array- An array of item objects when `ids` is supplied; an array of bare integers when it is not.
idinteger- Item id. Note it appears well down the object rather than first — do not rely on key order.
descriptionstring- Flavour or effect text. Empty string when absent, never null, so a falsy check is the right test.
raritystring- `Basic`, `Fine`, `Masterwork`, `Rare`, `Exotic`, `Ascended`, `Legendary` — the values the game's UI colours by.
flagsarray of strings- Behaviour markers such as `NoSalvage`, `NotUpgradeable`, `AccountBound`. Empty array rather than null when none apply.
chat_linkstring- The in-game chat code, for example `[&AgEYAAAA]`. Paste-able directly into the game client.
iconstring- Absolute render-service URL. Stable, and safe to hotlink.
detailsobject- Polymorphic sub-object whose shape depends on `details.type`. Switch on that field before reading anything else inside it.
details.secondary_suffix_item_idstring- An empty string where you would expect a number or null — a long-standing quirk of the armour schema.
What you can build with the Guild Wars 2 API
- Track trading post prices for crafting materials
- Build a recipe calculator that costs out a legendary weapon
- Show live World vs World match scores on a guild site
- Render item tooltips with correct rarity colours and chat links
- Sync a wardrobe or achievement tracker from public game data
Common errors and how to fix them
404 with `all ids provided are invalid`
Every id in your `ids` list is unknown.
Fix: Fetch the bare collection first to get the valid id list, then request in batches from it.
206 Partial Content
Some ids in the batch were valid and some were not.
Fix: This is not a failure — read what came back and reconcile against what you asked for; missing ids are silently omitted.
429
The leaky bucket is empty.
Fix: Batch up to 200 ids per request rather than looping single lookups, and back off when the limit header approaches zero.
Unexpected fields appearing
You did not pin a schema version.
Fix: Send `v=` with a fixed date. Unpinned requests follow the latest schema, which changes over time.
Guild Wars 2 API — frequently asked questions
Does the Guild Wars 2 API need an API key?
Not for public game data. Items, recipes, maps, achievements, WvW match state and trading post prices are all readable anonymously. A key is only needed for endpoints tied to a specific player account, and players generate those themselves.
Why does /v2/items return a list of numbers?
Because collection endpoints return ids by default and objects only when you ask for specific ones. Fetch the id list, diff it against what you have cached, then request the new ids in batches of up to 200 with `?ids=`.
How do I get trading post prices?
Use the commerce endpoints — `/v2/commerce/prices` and `/v2/commerce/listings` — with the same id-batching pattern. They are public, so no key is needed, and they reflect live buy and sell offers.
What does the v parameter do?
It pins the response to a dated schema version. Without it you always get the newest schema, so a future change can alter your response shape without warning. Anything long-lived should send a fixed `v=` date.
Tools that pair with this API
JSON Formatter
Format, beautify and minify JSON online with 2-space, 4-space or tab indentation. Sort keys alphabetically and catch syntax errors instantly — free and private.
JSON to CSV Converter
Convert a JSON array of objects to CSV online. Automatic column headers from the union of all keys, delimiter choice and proper quoting — all in-browser.
JSON Flattener
Flatten nested JSON into single-level dot-notation keys online. Choose the separator, bracket or dotted array indexes, and copy or download the result.
Guild Wars 2 API is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.