the block / api
Take the data.
The whole board is public JSON. No key, no signup. Build the leaderboard we didn’t build, the bot that tweets every eviction, the counter that shames your team into buying a tile.
https://tilesquat.com/api/v1none*10s at the edgeEndpoints
| GET | /api/v1/stats | Sold count, phase, floor price, total taken, hottest tile. |
| GET | /api/v1/board | Every tile, hottest first. status=owned|open|all, limit≤250, offset. |
| GET | /api/v1/tiles/{slug} | One tile plus its last 20 changes of hands. |
| GET | /badge/{slug}.svg | Live rank badge, sized for a footer. |
| GET | /og/t/{slug}.png | 1200×630 card for link previews. |
Everything is a plain GET. Nothing here writes — buying still goes through the checkout, and it always will.
Try it
curl https://tilesquat.com/api/v1/stats{
"generated_at": "2026-08-23T09:14:02.000Z",
"phase": "subscription",
"sold_count": 247,
"open_count": 753,
"total_tiles": 1000,
"squatters": 118,
"floor_price_cents": 1500,
"tiles_until_next_tier": 53,
"total_paid_cents": 412300,
"sold_out_at": null,
"half_life_days": 3,
"hottest": {
"slug": "0000",
"anchor": "Acme",
"heat_cents": 34920,
"page_url": "https://tilesquat.com/t/0000"
}
}curl "https://tilesquat.com/api/v1/board?status=owned&limit=5"Returns tiles[], hottest first, each shaped like this:
{
"id": 42,
"slug": "0000",
"status": "owned",
"rank": 1,
"anchor": "Acme",
"target_url": "https://acme.example",
"logo_url": "https://tilesquat.com/logo/u/01HXXX/128.webp",
"page_url": "https://tilesquat.com/t/0000",
"badge_url": "https://tilesquat.com/badge/0000.svg",
"heat_cents": 34920,
"price_cents": 52380,
"lifetime_paid_cents": 61000,
"steals": 2,
"block": null,
"owner": "h_9f2c1a",
"claimed_at": "2026-08-21T18:03:11.000Z"
}Fields worth explaining
heat_cents- What the tile is worth right now. Halves every 3 days.
price_cents- What it costs you to take it, this second. 1.5× heat, floor-clamped.
rank- Position on the board. 1 is top-left. null for unsold tiles.
block- Tiles bought in one order share a block id. null if bought alone.
owner- A public handle. We never expose emails or internal ids.
target_url- The advertiser’s link. Every link we render to it carries rel="sponsored".
Money is always integer cents. Times are always UTC ISO 8601. Heat is computed at request time, so two calls a minute apart return different numbers for a tile nobody touched — that’s the decay, working.
Put the badge on your site
It renders your live rank and links back. Squatters who ship this tend to keep their tile longer, which is not a coincidence.
<a href="https://tilesquat.com/t/0000">
<img src="https://tilesquat.com/badge/0000.svg" alt="tilesquat rank" width="150" height="28">
</a>Fair use
Responses are cached for 10 seconds — polling faster than that just gets you the same bytes. One request every 10 seconds is plenty for anything real time. Hammer it and we’ll start rate limiting, which nobody enjoys. Attribution isn’t required, but a link back is how this stays free.
Anything that breaks or reads wrong: the tile owner behind that slug is not the person to ask — write to us instead.