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 21 Aug 2026

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 21 Aug 2026, 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

Alternatives to Guild Wars 2 API

If Guild Wars 2 API does not fit, these game & anime apis cover similar ground. Every one was called before publishing, and each links to its own reference page with a working curl command and the response it returned.

APIWhat it doesAuthCORSLast verified
PokéAPIFree Pokémon API with no key: stats, types, abilities, moves, evolutions and sprites for 1,000+ species. The most popular API for learning REST. Tested example.No keyYes19 Aug 2026
Rick and Morty APIFree Rick and Morty API with no key: 800+ characters, episodes and locations with images, filtering and pagination. REST and GraphQL. Tested example.No keyYes19 Aug 2026
Jikan (MyAnimeList)Free unofficial MyAnimeList API with no key: anime and manga data, scores, characters, staff and seasonal listings. Tested curl example and live JSON.No keyYes19 Aug 2026
Deck of CardsFree playing card API with no key: shuffle decks, draw cards, manage piles and get card images. Stateful deck ids. Tested curl example and live JSON.No keyYes19 Aug 2026
Italian JokesFree joke API with no key returning Italian-themed jokes, each tagged with a subtype such as Wordplay, One-liner or Observational so you can filter the tone. Live example.No keyNo21 Aug 2026
JokeAPIFree JokeAPI with no key: programming, pun and miscellaneous jokes with category filters, blacklist flags and safe mode for family-friendly output. Tested.No keyYes20 Aug 2026
All Game & Anime APIs

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 21 Aug 2026; always check the official documentation before relying on this API in production, as terms and limits can change.