BYTETOOLS

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.

No API key requiredCORS enabledHTTPSFree tier

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
curl 'https://api.guildwars2.com/v2/items?ids=24,68'
JavaScript (fetch)
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);
Python (requests)
import requests

res = requests.get("https://api.guildwars2.com/v2/items?ids=24,68", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200
[
  {
    "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

ParameterTypeRequiredDescription
idsqueryOptionalComma-separated ids, up to 200 per request. Omit it to get the full id list instead of objects. 24,68
langqueryOptionalResponse language: `en`, `es`, `de`, `fr`, `zh`. en
page / page_sizequeryOptionalPage through a collection without listing ids first. `page_size` caps at 200. 0
vqueryOptionalSchema 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

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.