Loot Seller

Price API

Programmatic access to live DonutSMP auction house prices — the same data behind the charts on Loot Seller. REST, JSON, read-only.

Overview

The API is available to subscribers. Sign in with Discord and generate a key below, then try a live request straight from this page — no setup required.

All endpoints share one base URL, return JSON, and accept only GET:

Base URL
https://www.lootseller.io/api/v1

Why use a key at all? The public endpoints return one item per request. An API key unlocks the bulk shape — /prices returns every tracked item's current price in a single call, which is the difference between practical and not if you're building something on top.


Your API key

Checking your account…


Try it

Send a real request against your own key and see exactly what comes back — no curl needed.

/api/v1/prices

Authentication

Send your key as a bearer token:

Request
curl -H "Authorization: Bearer ls_live_YOUR_KEY" \
  https://www.lootseller.io/api/v1/prices

Or with the X-API-Key header, if that suits your client better:

Alternative
curl -H "X-API-Key: ls_live_YOUR_KEY" \
  https://www.lootseller.io/api/v1/prices

Treat the key like a password — it identifies your subscription. Keep it server-side rather than in browser or client code. You can rotate or revoke it at any time from the Price Alerts panel; rotating invalidates the previous key immediately. A key stops working if the subscription lapses.


Rate limits

120 requests per minute per key, on a fixed one-minute window. Every response carries your current usage:

HeaderMeaning
X-RateLimit-LimitRequests allowed per minute.
X-RateLimit-RemainingRequests left in the current window.
Retry-AfterSeconds until the window resets. Sent on 429 only.

Prices refresh roughly every 5–10 minutes, so polling faster than that returns identical data. Read ageSeconds to see how fresh a row actually is rather than polling harder.


Endpoints

GET/api/v1/prices

Current price of every tracked item, across all three series, in one request.

Query parameters

NameTypeDescription
itemsstring Optional. Comma-separated item names to limit the response, e.g. Elytra,Mace. Max 200. Omit for everything.
Request
curl -H "Authorization: Bearer ls_live_YOUR_KEY" \
  "https://www.lootseller.io/api/v1/prices?items=Elytra,Mace"
Response
{
  "count": 2,
  "items": [
    {
      "item": "Elytra",
      "single": 300000000,
      "stack": null,
      "order": 299000000,
      "updated": 1787169000,
      "ageSeconds": 92
    },
    {
      "item": "Mace",
      "single": 3200000,
      "stack": null,
      "order": 7600000,
      "updated": 1787169000,
      "ageSeconds": 92
    }
  ],
  "at": 1787169092000
}
GET/api/v1/history

OHLC candles for a single series, for charting or backtesting.

Query parameters

NameTypeDescription
item requiredstring Exact item name, e.g. Elytra. See /items.
kindstring single (default), stack, or order.
tfstring 1h (default, ~14 days) or 1d (~13 months).
Request
curl -H "Authorization: Bearer ls_live_YOUR_KEY" \
  "https://www.lootseller.io/api/v1/history?item=Elytra&kind=single&tf=1d"
Response
{
  "item": "Elytra",
  "kind": "single",
  "tf": "1d",
  "count": 2,
  "candles": [
    { "t": 1787040000, "o": 310000000, "h": 315000000,
      "l": 298000000, "c": 301000000, "n": 214 },
    { "t": 1787126400, "o": 301000000, "h": 305000000,
      "l": 297000000, "c": 300000000, "n": 198 }
  ],
  "at": 1787169092000
}
GET/api/v1/items

Every tracked item name, plus which have stack and buy-order data.

Response
{
  "items": ["Ancient Debris", "Bamboo", "Beacon", "..."],
  "stackItems": ["Ancient Debris", "Bamboo", "..."],
  "orderItems": ["Ancient Debris", "Bamboo", "..."],
  "at": 1787169092000
}

Discord bot

Don't want to write any code? The bot in the Discord server answers price lookups directly in chat — free for everyone, no key needed.

/priceitem:<name>

Posts a card with the current AH price, full-stack price and top buy order, the 24h trend, the flip margin where one exists, and the price chart — plus a link through to the full interactive chart here.

The item field autocompletes as you type, so you don't need to remember whether it's “Block of Coal” or “Coal Block”.

Field reference

All prices are DonutSMP in-game coins — not real money.

FieldDescription
singleCheapest current listing total from /ah <item>.
stackCheapest full-stack total from /ah <item> stack.
orderHighest buy-order bid, per unit — the bid side of the market.
updatedUNIX seconds when the item was last observed.
ageSecondsHow long ago that was. The freshness signal to trust.
atServer time in milliseconds when the response was built.
tCandle bucket start, UNIX seconds.
o h l cOpen, high, low, close for the bucket.
nNumber of observations folded into the bucket.

A null price means no data for that series — not a price of zero. Many items are never listed as full stacks, so stack is commonly null.


Errors

Errors return the matching HTTP status and a JSON body with an error string.

StatusMeaning
400A required parameter is missing or malformed.
401No key sent, or the key isn't valid.
403The key is real but its subscription is no longer active.
404Unknown endpoint.
405Wrong method — every endpoint is GET.
429Rate limit exceeded. Wait for Retry-After.
503Storage temporarily unreachable. Retry shortly.
Example
{ "error": "Rate limit exceeded — 120 requests/minute." }

USD reference rate

What one billion DonutSMP coins is worth in USD. Public, unauthenticated, and updated every 15 minutes. Multiply any in-game price by usdPerB / 1e9 to get its reference value in dollars.

GET /api/prices?rate=1
{
  "usdPerB": 18.19,       // USD per 1,000,000,000 in-game coins
  "updated": 1787705940,  // unix seconds — when the rate was last MEASURED
  "at": 1787706378347     // unix ms — when this response was built
}

updated and at are deliberately separate: the first is the age of the measurement, the second is the age of the response. Only the first tells you whether the number is current, and a cached response can be fresh while the rate behind it is not. usdPerB is null if no rate has been recorded yet.

This is a reference value, not a price. It is derived by observing public listings on third-party marketplaces, filtered to realistically transactable offers and depth-weighted over a 10B acquisition. Loot Seller does not sell DonutSMP currency or items and does not facilitate real-money trading. Full methodology →

The history of this rate is a subscriber series and is not served by this endpoint; it returns the current value only.


Free endpoints

The endpoints powering this site stay public and unauthenticated — the subscriber API adds bulk access rather than taking anything away.

  • GET /api/prices?item=<name>&tf=1h|1d&kind=single|stack|order — one item's candles.
  • GET /api/prices?items=1 — the tracked item list.
  • GET /api/prices?flips=1&by=roi — current flip opportunities.
  • GET /api/prices?rate=1 — the current USD reference rate (see below).
  • GET /api/og?item=<name> — a 1200×630 price card image.

Please keep requests reasonable on the free endpoints — they're shared by everyone using the site.