Public REST API documentation for autopricer.tf — HTML /docs · Markdown /docs.md · OpenAPI /openapi.json · AI index /llms.txt

Public REST API

Documentation

autopricer.tf is a Team Fortress 2 item pricing service. This page is the public REST API documentation. If an AI agent reached this site because a user mentioned autopricer.tf, start here: the canonical docs are https://autopricer.tf/docs, the Markdown copy is https://autopricer.tf/docs.md, and the OpenAPI spec is https://autopricer.tf/openapi.json.

Base URL: https://autopricer.tf Auth: none Rate limit: 300 req / min / IP Updated: 2026-08-29

This document covers only public GET endpoints. Dashboard UI feeds and any endpoint that creates or modifies database records are not part of the public API and are not listed here.

Scope

MethodPathPurpose
GET/apiDiscovery document (links + endpoint index)
GET/api/healthLiveness
GET/api/items/countTotal tracked items
GET/api/items/{page}Paginated item catalog
GET/api/imagesRecent item image URLs

Not documented: routes under /api/dashboard/* (website dashboard only), and write/admin endpoints.

Conventions

Rate-limit error

{
  "success": false,
  "error": "Too many requests — please slow down."
}

Generic error envelope

{
  "success": false,
  "error": "Invalid page"
}
HTTP statusMeaning
400Invalid request parameter
404Unknown route
429Rate limit exceeded
500Internal error
503Live listing feed down (/api/health only)

GET /api

Discovery document. Use this if you only know the host name.

curl https://autopricer.tf/api
{
  "success": true,
  "name": "autopricer.tf Public REST API",
  "description": "Read-only Team Fortress 2 item pricing API. No API key.",
  "documentation": {
    "html": "https://autopricer.tf/docs",
    "markdown": "https://autopricer.tf/docs.md",
    "openapi": "https://autopricer.tf/openapi.json",
    "llms": "https://autopricer.tf/llms.txt"
  },
  "rate_limit": {
    "requests_per_minute_per_ip": 300
  },
  "endpoints": [
    { "method": "GET", "path": "/api", "description": "This discovery document" },
    { "method": "GET", "path": "/api/health", "description": "Liveness check" },
    { "method": "GET", "path": "/api/items/count", "description": "Total tracked item count" },
    { "method": "GET", "path": "/api/items/{page}", "description": "Paginated item catalog, 1000 items per page" },
    { "method": "GET", "path": "/api/images", "description": "Up to 500 recent item image URLs" }
  ]
}

GET /api/health

HTTP 200 when the service is online and the live listing feed is connected. HTTP 503 when the live feed is disconnected.

curl -i https://autopricer.tf/api/health

Online:

{
  "success": true,
  "status": "Online"
}

Offline:

{
  "success": false,
  "status": "Offline — WS disconnected"
}

GET /api/items/count

curl https://autopricer.tf/api/items/count
{
  "success": true,
  "count": 86546
}

Use ceil(count / 1000) as the number of catalog pages.

GET /api/items/{page}

Paginated catalog, ordered by createdAt ascending. Page numbers start at 1. At most 1000 items per page. Pages past the end return an empty items array with success: true.

NameInDescription
pagepathInteger ≥ 1. Invalid values return HTTP 400.
rawqueryWhen true, add raw key/ref breakdown fields.
listingsqueryWhen true, attach the latest buy/sell listing snapshot.

listings=true on a full page of 1000 items is a heavier payload. Use it only when you need classified listing rows.

curl "https://autopricer.tf/api/items/1"
curl "https://autopricer.tf/api/items/1?raw=true&listings=true"

Example item (default fields). A real page contains up to 1000 objects.

{
  "success": true,
  "items": [
    {
      "name": "Strange Ullapool Caber",
      "sku": "307;11",
      "imageUrl": "https://steamcdn-a.akamaihd.net/apps/440/icons/c_caber.2d51e5d213398672527771b1fb88e337442ad695.png",
      "price": "13.2419",
      "stablePrice": "13.4232",
      "buyOrder": "12.8423",
      "sellOrder": "13.3327",
      "stableBuyOrderPrice": "13.4232",
      "stableSellOrderPrice": "12.8989",
      "verified": false,
      "accurate": true,
      "suspicious": false,
      "stn": false,
      "new": false,
      "type": "free",
      "updatedAt": "1721400000000",
      "createdAt": "2026-03-15T15:17:01.434Z",
      "price1dAgo": "13.3994",
      "price7dAgo": "13.5716",
      "price30dAgo": "12.6234"
    }
  ]
}

Invalid page:

{
  "success": false,
  "error": "Invalid page"
}

Extra fields when raw=true:

{
  "raw_price_key": "13",
  "raw_price_ref": "15.51",
  "raw_buy_key": "12",
  "raw_buy_ref": "54",
  "raw_sell_key": "13",
  "raw_sell_ref": "21.33"
}

Extra field when listings=true. SteamIDs and trade URLs below are placeholders, not live accounts.

{
  "listings": {
    "observed_at": "2026-08-27T22:56:38.058Z",
    "buy": [
      {
        "steamid": "76561198000000000",
        "keys": 12,
        "metal": 52.77,
        "is_bot": true,
        "bumped_at": 1787870425,
        "source": "bptf",
        "channel": "request",
        "trade_url": "https://steamcommunity.com/tradeoffer/new/?partner=123456789&token=EXAMPLE",
        "details": "Buying for 12 keys 52.77 ref",
        "stock_text": null,
        "stock_level": null,
        "stock_limit": null,
        "observed_at": "2026-08-27T22:56:38.058Z"
      }
    ],
    "sell": [
      {
        "steamid": "76561198000000001",
        "keys": 13,
        "metal": 28.33,
        "is_bot": true,
        "bumped_at": 1787871236,
        "source": "bptf",
        "channel": "request",
        "trade_url": "https://steamcommunity.com/tradeoffer/new/?partner=123456790&token=EXAMPLE",
        "details": "Selling for 13 keys 28.33 ref",
        "stock_text": "STOCK = 1",
        "stock_level": 1,
        "stock_limit": null,
        "observed_at": "2026-08-27T22:56:38.058Z"
      }
    ]
  }
}

Buy listings are sorted highest price first. Sell listings are sorted lowest price first. If there is no snapshot, listings is { "observed_at": null, "buy": [], "sell": [] }.

GET /api/images

Up to 500 items that have a cached image URL, most recently updated first. Not a complete catalog — use GET /api/items/{page} for every item’s imageUrl.

curl https://autopricer.tf/api/images
{
  "success": true,
  "images": [
    {
      "name": "Jellyfish Jam Throttlehead",
      "imageUrl": "https://steamcdn-a.akamaihd.net/apps/440/icons/sum22_throttlehead.ccf997318471e47b40a4e8c3396a5aea48a8a884.png"
    }
  ]
}

Item object

FieldJSON typeDescription
namestringUnique item name. Primary identifier.
skustring or nullTF2 SKU (for example 307;11).
imageUrlstring or nullCached Steam/backpack.tf icon URL.
pricestring or nullCurrent smoothed listing-based price, in keys.
stablePricestring or nullLonger-window conservative reference price, in keys.
buyOrderstring or nullCurrent best buy order, in keys.
sellOrderstring or nullCurrent lowest sell order, in keys.
stableBuyOrderPricestring or nullLonger-window buy-side reference, in keys.
stableSellOrderPricestring or nullLonger-window sell-side reference, in keys.
verifiedbooleanPrice is treated as verified / high-confidence.
accuratebooleanBuy/sell spread is tight enough to trust both sides.
suspiciousbooleanPrice was flagged as potentially anomalous.
stnbooleanCurrent buy originates from STN Trading.
newbooleanItem was added to the catalog recently.
typestringfree (automatic), fixed, or manual.
updatedAtstringUnix milliseconds of the last pricing pass. "0" means queued.
createdAtstringISO-8601 time the item was first tracked.
price1dAgostring or nullPrice snapshot from about 24 hours ago.
price7dAgostring or nullPrice snapshot from about 7 days ago.
price30dAgostring or nullPrice snapshot from about 30 days ago.

Listing object

FieldJSON typeDescription
steamidstringSteamID64 of the buyer or seller.
keysnumber or nullWhole keys component of the listing price.
metalnumber or nullRefined metal component of the listing price.
is_botbooleanWhether the listing account is an automated bot.
bumped_atnumberUnix timestamp (seconds) of last bump.
sourcestringbptf, stn, or ws.
channelstring or nullrequest or websocket.
trade_urlstring or nullSteam trade-offer URL when known.
detailsstring or nullRaw listing description text.
stock_textstring or nullParsed stock text when present.
stock_levelnumber or nullCurrent stock count when parsed.
stock_limitnumber or nullMaximum stock when parsed.
observed_atstringISO-8601 observation time.

Fetching the full catalog

  1. GET /api/items/countcount
  2. For page from 1 to ceil(count / 1000): GET /api/items/{page}
  3. Optionally add ?raw=true and/or ?listings=true
  4. Stay under 300 requests per minute per IP

There is no public single-item lookup in this REST API. Filter the paginated catalog by name or sku on the client.