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.
Scope
| Method | Path | Purpose |
|---|---|---|
GET | /api | Discovery document (links + endpoint index) |
GET | /api/health | Liveness |
GET | /api/items/count | Total tracked items |
GET | /api/items/{page} | Paginated item catalog |
GET | /api/images | Recent item image URLs |
Not documented: routes under /api/dashboard/* (website dashboard only), and write/admin endpoints.
Conventions
- No authentication.
- JSON responses. Successful payloads include
"success": true. - Prices are in Mann Co. Supply Crate Keys unless a field is refined metal (
metal,raw_*_ref). - Item price fields serialize as JSON strings (up to 4 decimal places) or
null. - Listing
keys/metalserialize as JSON numbers ornull. - Boolean query flags (
raw,listings) accepttrue,1,yes, oron. - Rate limit: 300 requests per minute per IP. HTTP 429 when exceeded.
Rate-limit error
{
"success": false,
"error": "Too many requests — please slow down."
}
Generic error envelope
{
"success": false,
"error": "Invalid page"
}
| HTTP status | Meaning |
|---|---|
| 400 | Invalid request parameter |
| 404 | Unknown route |
| 429 | Rate limit exceeded |
| 500 | Internal error |
| 503 | Live 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.
| Name | In | Description |
|---|---|---|
page | path | Integer ≥ 1. Invalid values return HTTP 400. |
raw | query | When true, add raw key/ref breakdown fields. |
listings | query | When 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
| Field | JSON type | Description |
|---|---|---|
name | string | Unique item name. Primary identifier. |
sku | string or null | TF2 SKU (for example 307;11). |
imageUrl | string or null | Cached Steam/backpack.tf icon URL. |
price | string or null | Current smoothed listing-based price, in keys. |
stablePrice | string or null | Longer-window conservative reference price, in keys. |
buyOrder | string or null | Current best buy order, in keys. |
sellOrder | string or null | Current lowest sell order, in keys. |
stableBuyOrderPrice | string or null | Longer-window buy-side reference, in keys. |
stableSellOrderPrice | string or null | Longer-window sell-side reference, in keys. |
verified | boolean | Price is treated as verified / high-confidence. |
accurate | boolean | Buy/sell spread is tight enough to trust both sides. |
suspicious | boolean | Price was flagged as potentially anomalous. |
stn | boolean | Current buy originates from STN Trading. |
new | boolean | Item was added to the catalog recently. |
type | string | free (automatic), fixed, or manual. |
updatedAt | string | Unix milliseconds of the last pricing pass. "0" means queued. |
createdAt | string | ISO-8601 time the item was first tracked. |
price1dAgo | string or null | Price snapshot from about 24 hours ago. |
price7dAgo | string or null | Price snapshot from about 7 days ago. |
price30dAgo | string or null | Price snapshot from about 30 days ago. |
Listing object
| Field | JSON type | Description |
|---|---|---|
steamid | string | SteamID64 of the buyer or seller. |
keys | number or null | Whole keys component of the listing price. |
metal | number or null | Refined metal component of the listing price. |
is_bot | boolean | Whether the listing account is an automated bot. |
bumped_at | number | Unix timestamp (seconds) of last bump. |
source | string | bptf, stn, or ws. |
channel | string or null | request or websocket. |
trade_url | string or null | Steam trade-offer URL when known. |
details | string or null | Raw listing description text. |
stock_text | string or null | Parsed stock text when present. |
stock_level | number or null | Current stock count when parsed. |
stock_limit | number or null | Maximum stock when parsed. |
observed_at | string | ISO-8601 observation time. |
Fetching the full catalog
GET /api/items/count→count- For
pagefrom 1 toceil(count / 1000):GET /api/items/{page} - Optionally add
?raw=trueand/or?listings=true - 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.