ExileData
Contents

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#

GET/v1/{game}/basesAPI key

Base 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

NameInTypeDescription
gamepathstringpoe1 or poe2. Required.
versionquerystringGame patch to read, e.g. 0.5.5.4. Default: the newest published patch.
itemClassquerystringOnly items of this class. Exact match, e.g. Amulet.
limitqueryintegerRecords to return. 1 to 1000. Default: 100.
offsetqueryintegerRecords to skip. Use with limit to page through results. At least 0. Default: 0.

Responses

StatusMeaningBody
200The requested page of base items.object with data: array of BaseItem, meta: ListMeta
400A query parameter is out of range, e.g. limit=5000.Error
401The API key is missing, invalid or revoked.Error
404Unknown game (unknown_game), no dataset for the game (no_dataset), or no dataset for that patch (unknown_game_version).Error
429The key's per-minute limit is used up. Wait retry-after seconds.Error

Example

Shell
$ curl -H "x-api-key: $EXILEDATA_KEY" \
    "https://api.exiledata.dev/v1/poe2/bases?version=0.5.5.4&itemClass=Amulet&limit=1"
JSON
{
  "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#

GET/v1/gamesAPI key

The games ExileData covers. Use one as {game} in other paths.

Responses

StatusMeaningBody
200Supported games.object with games: array of "poe1" | "poe2"
401The API key is missing, invalid or revoked.Error
429The key's per-minute limit is used up. Wait retry-after seconds.Error

Example

Shell
$ curl -H "x-api-key: $EXILEDATA_KEY" \
    "https://api.exiledata.dev/v1/games"
JSON
{ "games": ["poe1", "poe2"] }

List published datasets#

GET/v1/versionsAPI key

One 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

StatusMeaningBody
200Published datasets.object with datasets: array of DatasetMetadata
401The API key is missing, invalid or revoked.Error
429The key's per-minute limit is used up. Wait retry-after seconds.Error

Example

Shell
$ curl -H "x-api-key: $EXILEDATA_KEY" \
    "https://api.exiledata.dev/v1/versions"
JSON
{
  "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#

GET/healthNo key

Answers while the process is up. Checks nothing else.

Responses

StatusMeaningBody
200The process is up.object with status: "ok"

Example

Shell
$ curl "https://api.exiledata.dev/health"
JSON
{ "status": "ok" }

Service status#

GET/statusNo key

Uptime, database reachability, and which dataset storage is in use.

Responses

StatusMeaningBody
200Current status.object with status: "ok", uptimeSeconds: integer, nodeVersion: string, database: "ok" | "unreachable", adminApi: "enabled" | "disabled", datasetStorage: object with driver: "local" | "r2"

Example

Shell
$ curl "https://api.exiledata.dev/status"
JSON
{
  "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.

JSON
{
  "error": "rate_limited",
  "message": "Rate limit of 120 requests per minute exceeded."
}
CodeStatusMeaning
invalid_request400A parameter is malformed or out of range. message says which.
missing_api_key401No key was sent. Send it in x-api-key.
invalid_api_key401The key is unknown or revoked.
unknown_game404{game} is not poe1 or poe2.
no_dataset404Nothing is published for that game yet.
unknown_game_version404No dataset exists for that patch. See GET /v1/versions.
not_found404No such route.
rate_limited429The key's per-minute limit is used up. Wait retry-after seconds.
not_implemented501The resource is planned but not published yet.
internal_error500The server failed. Retry later.

Schemas#

Shapes used in the responses above. Fields marked optional can be absent.

Error#

Body of every error response.

FieldTypeDescription
errorstringStable code to branch on, e.g. invalid_api_key.
messagestringExplanation for people. Its wording can change.

EntityVersion#

Which schema and game patch a record belongs to.

FieldTypeDescription
schemaVersionstringExileData schema version, e.g. 0.2.0.
game"poe1" | "poe2"Game the record belongs to.
gameVersionstringGame patch, e.g. 0.5.5.4. Optional.

SourceProvenance#

Where a record came from.

FieldTypeDescription
namestringSource id, e.g. poe2-ggpk-extract.
versionstringVersion of the source, here the game patch. Optional.
retrievedAtstring (date-time)When the source was read.
locatorstringWhere 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.

FieldTypeDescription
idstringThe game's metadata path. Stable across patches while the item exists.
namestringDisplay name.
itemClassstringThe game's item class, e.g. Amulet. Optional.
versionEntityVersion
sourcearray of SourceProvenance
extobject (any fields)Every other field from the game files, under its original name. It is not a stable contract. Optional.
derivedobject (any fields)Values ExileData computes. Empty today. Optional.

DatasetMetadata#

Describes one published dataset: one game patch.

FieldTypeDescription
game"poe1" | "poe2"
gameVersionstringGame patch, e.g. 0.5.5.4.
generatedAtstring (date-time)When this build of the dataset was made. Changes if the patch is rebuilt.
schemaVersionstringSchema version the records follow.
sourcesarray of object with name: string, version: string, retrievedAt: string (date-time)

ListMeta#

FieldTypeDescription
game"poe1" | "poe2"
gameVersionstringThe patch that answered. Pass it as ?version= to pin to it.
totalintegerMatching records before limit and offset. Optional.