Market
Live trade-market listings observed by the Ghost bot, plus pre-computed price history aggregates. Bot-fed, not patch-aware — listings carry the patch they were observed under in captured_patch_id but aren't time-travelable.
Endpoints
GET /v2/market paginated listing feed
GET /v2/market/{id} single listing by surrogate id
GET /v2/market/analytics/{item_id}/prices/history price history for one item
List
curl 'https://api.darkerdb.com/v2/market?item_id=id.item.potion_health&has_sold=true&limit=50'
Query parameters
Identity / categorization:
| Name | Mode | Description |
|---|---|---|
id | exact | surrogate listing id (integer) |
item_id | exact | id.item.<slug> |
item | exact | raw upstream item key |
archetype | exact | item archetype slug |
rarity | exact | listing rarity |
loot_state | exact | game-side loot state at observation time |
seller | exact | seller display name |
Price / quantity ranges:
| Name | Description |
|---|---|
min_price, max_price | total listing price |
min_price_per_unit, max_price_per_unit | normalized per-unit price |
min_quantity, max_quantity | stack size |
Time window / status:
| Name | Description |
|---|---|
from, to | ISO 8601 — restrict by created_at |
has_sold, has_expired, has_cancelled | bool — listing terminal state |
Pagination: page (default 1), limit (default 25, max 250). Default order is created_at DESC.
Response
{
"body": [
{
"id": 1005,
"cursor": 5,
"item_id": "id.item.potion_health",
"item": "Health Potion",
"archetype": "potionhealth",
"rarity": "common",
"price": 50,
"price_per_unit": "25.00",
"quantity": 2,
"created_at": "2026-05-18T04:41:02+00:00",
"expires_at": "2026-05-23T04:56:02+00:00",
"has_sold": false,
"has_cancelled": false,
"seller": "Trader2"
}
]
}
Price history
curl 'https://api.darkerdb.com/v2/market/analytics/id.item.potion_health/prices/history?interval=15m&from=2026-05-01T00:00:00Z&to=2026-05-07T00:00:00Z'
Query parameters:
| Name | Type | Default | Description |
|---|---|---|---|
interval | enum | 15m | bucket size — see below |
from, to | ISO 8601 | last 7d | window bounds |
Pre-computed buckets exist for: 1m, 3m, 5m, 10m, 15m, 30m, 45m, 1h, 2h, 4h, 1d, 1w, 2w, 4w. Other intervals fall through to a live time_bucket aggregate (TimescaleDB extension required).
Response:
{
"body": {
"item_id": "id.item.potion_health",
"interval": "15m",
"from": "2026-05-01T00:00:00Z",
"to": "2026-05-07T00:00:00Z",
"series": [
{ "timestamp": "2026-05-01T00:00:00+00:00", "avg": 24.50, "min": 22, "max": 27, "volume": 41 }
]
}
}
Capped at 250 buckets per response.