API reference
This page lists every public endpoint and is generated from the OpenAPI document the API serves. Base URL: https://api.exiledata.dev. Schema version 0.2.0.
Download the document as openapi.json, or read it live at https://api.exiledata.dev/openapi.json. Postman, Insomnia and most client generators can import it. Examples read the key from $EXILEDATA_KEY; see Authentication.
Game data
List base items#
/v1/{game}/basesAPI keyBase items from one game patch, in the order the game files list them. Without version, the newest published patch answers, and meta.gameVersion names it.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
game | path | string | poe1 or poe2. Required. |
version | query | string | Game patch to read, e.g. 0.5.5.4. Default: the newest published patch. |
itemClass | query | string | Only items of this class. Exact match, e.g. Amulet. |
limit | query | integer | Records to return. 1 to 1000. Default: 100. |
offset | query | integer | Records to skip. Use with limit to page through results. At least 0. Default: 0. |
Responses
| Status | Meaning | Body |
|---|---|---|
200 | The requested page of base items. | object with data: array of BaseItem, meta: ListMeta |
400 | A query parameter is out of range, e.g. limit=5000. | Error |
401 | The API key is missing, invalid or revoked. | Error |
404 | Unknown game (unknown_game), no dataset for the game (no_dataset), or no dataset for that patch (unknown_game_version). | Error |
429 | The key's per-minute limit is used up. Wait retry-after seconds. | Error |
Example
$ curl -H "x-api-key: $EXILEDATA_KEY" \
"https://api.exiledata.dev/v1/poe2/bases?version=0.5.5.4&itemClass=Amulet&limit=1"{
"data": [
{
"id": "Metadata/Items/Amulets/FourAmulet1",
"name": "Crimson Amulet",
"itemClass": "Amulet",
"version": {
"schemaVersion": "0.2.0",
"game": "poe2",
"gameVersion": "0.5.5.4"
},
"source": [
{
"name": "poe2-ggpk-extract",
"version": "0.5.5.4",
"retrievedAt": "2026-10-06T02:30:14.967Z",
"locator": "base_items.json#Metadata/Items/Amulets/FourAmulet1"
}
],
"ext": {
"domain": "item",
"drop_level": 1,
"implicit_text": ["(2-4) Life Regeneration per second"],
"tags": ["amulet", "default"]
}
}
],
"meta": { "game": "poe2", "gameVersion": "0.5.5.4", "total": 25 }
}Datasets
List games#
/v1/gamesAPI keyThe games ExileData covers. Use one as {game} in other paths.
Responses
| Status | Meaning | Body |
|---|---|---|
200 | Supported games. | object with games: array of "poe1" | "poe2" |
401 | The API key is missing, invalid or revoked. | Error |
429 | The key's per-minute limit is used up. Wait retry-after seconds. | Error |
Example
$ curl -H "x-api-key: $EXILEDATA_KEY" \
"https://api.exiledata.dev/v1/games"{ "games": ["poe1", "poe2"] }List published datasets#
/v1/versionsAPI keyOne entry per published game patch, oldest patch first within each game. The last entry for a game is the one that answers when no version is given.
Responses
| Status | Meaning | Body |
|---|---|---|
200 | Published datasets. | object with datasets: array of DatasetMetadata |
401 | The API key is missing, invalid or revoked. | Error |
429 | The key's per-minute limit is used up. Wait retry-after seconds. | Error |
Example
$ curl -H "x-api-key: $EXILEDATA_KEY" \
"https://api.exiledata.dev/v1/versions"{
"datasets": [
{
"game": "poe1",
"gameVersion": "3.29.3.3",
"generatedAt": "2026-09-18T16:14:25.635Z",
"schemaVersion": "0.2.0",
"sources": [
{
"name": "poe1-ggpk-extract",
"version": "3.29.3.3",
"retrievedAt": "2026-09-18T16:14:25.635Z"
}
]
}
]
}Service
Liveness#
/healthNo keyAnswers while the process is up. Checks nothing else.
Responses
| Status | Meaning | Body |
|---|---|---|
200 | The process is up. | object with status: "ok" |
Example
$ curl "https://api.exiledata.dev/health"{ "status": "ok" }Service status#
/statusNo keyUptime, database reachability, and which dataset storage is in use.
Responses
| Status | Meaning | Body |
|---|---|---|
200 | Current status. | object with status: "ok", uptimeSeconds: integer, nodeVersion: string, database: "ok" | "unreachable", adminApi: "enabled" | "disabled", datasetStorage: object with driver: "local" | "r2" |
Example
$ curl "https://api.exiledata.dev/status"{
"status": "ok",
"uptimeSeconds": 3600,
"nodeVersion": "v24.21.0",
"database": "ok",
"adminApi": "enabled",
"datasetStorage": { "driver": "r2", "bucket": "exiledata-datasets" }
}Errors#
Every error has the same body: an error code to branch on and a message for people. Codes are stable; messages can change.
{
"error": "rate_limited",
"message": "Rate limit of 120 requests per minute exceeded."
}| Code | Status | Meaning |
|---|---|---|
invalid_request | 400 | A parameter is malformed or out of range. message says which. |
missing_api_key | 401 | No key was sent. Send it in x-api-key. |
invalid_api_key | 401 | The key is unknown or revoked. |
unknown_game | 404 | {game} is not poe1 or poe2. |
no_dataset | 404 | Nothing is published for that game yet. |
unknown_game_version | 404 | No dataset exists for that patch. See GET /v1/versions. |
not_found | 404 | No such route. |
rate_limited | 429 | The key's per-minute limit is used up. Wait retry-after seconds. |
not_implemented | 501 | The resource is planned but not published yet. |
internal_error | 500 | The server failed. Retry later. |
Schemas#
Shapes used in the responses above. Fields marked optional can be absent.
Error#
Body of every error response.
| Field | Type | Description |
|---|---|---|
error | string | Stable code to branch on, e.g. invalid_api_key. |
message | string | Explanation for people. Its wording can change. |
EntityVersion#
Which schema and game patch a record belongs to.
| Field | Type | Description |
|---|---|---|
schemaVersion | string | ExileData schema version, e.g. 0.2.0. |
game | "poe1" | "poe2" | Game the record belongs to. |
gameVersion | string | Game patch, e.g. 0.5.5.4. Optional. |
SourceProvenance#
Where a record came from.
| Field | Type | Description |
|---|---|---|
name | string | Source id, e.g. poe2-ggpk-extract. |
version | string | Version of the source, here the game patch. Optional. |
retrievedAt | string (date-time) | When the source was read. |
locator | string | Where in the source the record was found, e.g. base_items.json#<id>. Optional. |
BaseItem#
The template for an item type, such as Crimson Amulet, before any modifiers.
| Field | Type | Description |
|---|---|---|
id | string | The game's metadata path. Stable across patches while the item exists. |
name | string | Display name. |
itemClass | string | The game's item class, e.g. Amulet. Optional. |
version | EntityVersion | |
source | array of SourceProvenance | |
ext | object (any fields) | Every other field from the game files, under its original name. It is not a stable contract. Optional. |
derived | object (any fields) | Values ExileData computes. Empty today. Optional. |
DatasetMetadata#
Describes one published dataset: one game patch.
| Field | Type | Description |
|---|---|---|
game | "poe1" | "poe2" | |
gameVersion | string | Game patch, e.g. 0.5.5.4. |
generatedAt | string (date-time) | When this build of the dataset was made. Changes if the patch is rebuilt. |
schemaVersion | string | Schema version the records follow. |
sources | array of object with name: string, version: string, retrievedAt: string (date-time) |
ListMeta#
| Field | Type | Description |
|---|---|---|
game | "poe1" | "poe2" | |
gameVersion | string | The patch that answered. Pass it as ?version= to pin to it. |
total | integer | Matching records before limit and offset. Optional. |