Quickstart
No sign-up, no authentication. Every call below works as written.
A small helper
Section titled “A small helper”The JavaScript and Python snippets below share this helper. It returns the
response’s data, waits out a 429 for Retry-After seconds (60 if the
header is missing) up to three times, and throws on any other error. The
JavaScript version also retries a plain network error (a thrown TypeError
from fetch) after a fixed 10-second wait, up to three times: that’s what
Cloudflare’s edge burst limit
looks like in a browser, since its block response carries no CORS headers
for fetch to read as a 429. Python sees no CORS, so there the block is
an ordinary 429 and the same 429 branch handles it.
const API = 'https://truefloat.app/api/v1';const EDGE_BLOCK_RETRY_MS = 10_000; // the edge burst-limit block lasts 10sconst MAX_RETRIES = 3;
async function get(path) { for (let attempt = 0; ; attempt++) { let res; try { res = await fetch(API + path); } catch (err) { // No response at all, just a thrown TypeError: the shape of the // Cloudflare edge burst limit in a browser, since its block carries // no CORS headers for us to read as a 429. Treat it the same way. if (err instanceof TypeError && attempt < MAX_RETRIES) { await new Promise((resolve) => setTimeout(resolve, EDGE_BLOCK_RETRY_MS)); continue; } throw err; } if (res.status === 429 && attempt < MAX_RETRIES) { const wait = Number(res.headers.get('Retry-After')) || 60; await new Promise((resolve) => setTimeout(resolve, wait * 1000)); continue; } const body = await res.json().catch(() => null); if (!res.ok) { const error = body?.error ?? { code: 'http_error', message: res.statusText }; throw new Error(`${res.status} ${error.code}: ${error.message}`); } return body.data; }}import time
import requests
API = 'https://truefloat.app/api/v1'
def get(path): for attempt in range(4): res = requests.get(API + path, timeout=30) if res.status_code == 429 and attempt < 3: retry_after = res.headers.get('Retry-After', '') time.sleep(int(retry_after) if retry_after.isdigit() else 60) continue res.raise_for_status() return res.json()['data']-
Fetch an item and its guides
Section titled “Fetch an item and its guides”GET /v1/items/{def_index}/{paint_index}returns the item plus a menu of every guide covering it — authors, titles, and each system’s id, label and scale — with no seeds yet.Terminal window curl https://truefloat.app/api/v1/items/7/44const data = await get('/items/7/44');console.log(data.item.slug, data.guides.length, 'guides');data = get('/items/7/44')print(data['item']['slug'], len(data['guides']), 'guides'){"dataset_version": "e9c25a6","data": {"item": {"def_index": 7,"paint_index": 44,"slug": "ak47-case-hardened","weapon": "AK-47","finish": "Case Hardened","paint_label": "Case Hardened"},"guides": [{"steam_id": "2941982575","title": "AK-47 Case Hardened | Blue Gem","authors": ["korenevskiy"],"url": "https://steamcommunity.com/sharedfiles/filedetails/?id=2941982575","permission": "unknown","updated": "2026-03-01T13:29:00","systems": [{"id": "ak47-blue-gem","label": "AK-47 Blue Gem","alias": null,"topic": null,"kind": "tier","levels": 4,"seeds": 97}]},{"steam_id": "3313951742","title": "The Complete Gold Gem Patterns Guide","authors": ["korenevskiy"],"url": "https://steamcommunity.com/sharedfiles/filedetails/?id=3313951742","permission": "unknown","updated": "2026-06-19T17:01:00","systems": [{"id": "ak47-gold-gem","label": "Gold Gem Patterns","alias": null,"topic": null,"kind": "group","levels": 1,"seeds": 4}]}]}} -
Look up one seed
Section titled “Look up one seed”GET /v1/items/{def}/{paint}/seeds/{seed}returns every guide’s verdict on one seed, side by side, plus which of the item’s other guides don’t list it at all.Terminal window curl https://truefloat.app/api/v1/items/7/44/seeds/387const data = await get('/items/7/44/seeds/387');for (const v of data.verdicts) {console.log(v.guide.title, '→', v.level.label, `(${v.level.place} of ${v.level.of})`);}data = get('/items/7/44/seeds/387')for v in data['verdicts']:print(v['guide']['title'], '->', v['level']['label'],f"({v['level']['place']} of {v['level']['of']})")Always show
v.guide.authorsandv.guide.urlnext to any verdict you render — see Attribution. -
Grab every graded seed for a listings page
Section titled “Grab every graded seed for a listings page”A listings page shouldn’t fetch per seed.
GET /v1/items/{def}/{paint}/patternsreturns every graded seed for the item in one response, with guide and system details given once; look each listing’s seed up in it locally.Terminal window curl https://truefloat.app/api/v1/items/7/44/patternsconst data = await get('/items/7/44/patterns');const verdictsFor661 = data.seeds['661'] ?? [];data = get('/items/7/44/patterns')verdicts_for_661 = data['seeds'].get('661', [])A page showing several items makes one
/patternscall per item shown, never one call per listing. For a full local copy of the whole dataset, download/v1/dumponce instead.
- Reading a guide response — the verbatim quotes, ranks, values and recorded contradictions in a full guide.
- Access & rate limits — 1000 requests per minute per IP, nothing to sign up for.
- The data model — item → guide → system → level → seeds.
- Endpoints — all eight, one line each, linked into the interactive reference.