Developers beta
The same data behind every KQ Book page, as JSON your own code can read. Build a sales bot, a floor tracker, a mint checker, a spreadsheet that fills itself.
Start in three steps
- Sign in on the Account page.
- Create a key under API keys. It is shown once, so copy it.
- Call an endpoint with the key in an
X-API-Keyheader.
curl -H "X-API-Key: YOUR_KEY" \
"https://kqboard.com/api/archive/sales/KASGOTHS?limit=3&pretty=1" Add pretty=1 while exploring and the answer comes back indented and
readable. Your code does not need it.
Try it live
Signed in, you can call the API right here with no key.
{
"ticker": "KASGOTHS",
"tier": "reader",
"count": 1,
"rows": [
{
"kind": "nft",
"token_id": "559",
"price_kas": 699,
"rank": 655,
"buyer": "kaspa:qp30ah…9jjqlf",
"seller": "kaspa:qqy0a5…qcwpdv",
"time": "2026-09-19T21:25:29Z"
}
]
} Above is an example answer. Press Run to see a real one.
Endpoints
/archive/sales/TICKERReader+Every recorded sale: price, buyer, seller, time. NFT sales carry a token id and rank; token (KRC-20) trades carry the amount and price per token.
/archive/mints/TICKERReader+Every mint: who paid, who received, when, the fee, the txid, and who holds it now.
/archive/lifecycles/TICKERBook+Every listing KQ Book has seen: price, seller, when it appeared, when it closed, and how.
/archive/price-events/TICKERBook+Every price change on this collection’s listings, with the time it was seen.
/archive/floor/TICKERReader+The floor over time, with the listed count and 24h volume at each reading. Add daily=1 for one point a day.
/archive/wallet/ADDRESSReader+Everything one wallet did that KQ Book recorded: buys, sells, listings and mints, newest first, with the other side of each trade.
Options
limit | How many rows, newest first. Default 100, up to 5,000. |
daily | On floor: 1 for one reading per day. |
kind | On sales: nft or token. Some tickers are both, NACHO is one. |
pretty | 1 to indent the JSON for reading. |
Limits
| Plan | Calls/day | History |
|---|---|---|
| Reader | 500 | 24 hours |
| Book | 25,000 | 365 days |
| Desk | 250,000 | Everything |
Your key follows your plan automatically. Counts reset at midnight UTC and every
answer carries X-RateLimit-Remaining. Max 240 requests a minute per IP.
Examples
JavaScript
const r = await fetch("https://kqboard.com/api/archive/sales/KASGOTHS?limit=50", {
headers: { "X-API-Key": process.env.KQ_KEY },
});
const { rows } = await r.json();
for (const s of rows) console.log(`#${s.token_id} sold for ${s.price_kas} KAS`);Python
import os, requests
r = requests.get("https://kqboard.com/api/archive/sales/KASGOTHS",
params={"limit": 50},
headers={"X-API-Key": os.environ["KQ_KEY"]})
for s in r.json()["rows"]:
print(f"#{s['token_id']} sold for {s['price_kas']} KAS")Questions
What is this actually for?
Anything you would otherwise do by refreshing KQ Book by hand. A bot that posts every sale in your collection's Telegram. A sheet that tracks what really filled, not what is listed. A check before a mint: who minted, and with whose KAS. Your code asks, KQ Book answers in JSON.
Why does it look like a wall of text in my terminal?
That is JSON: built for programs, not eyes. Add pretty=1 to read it, or use the
Try it box above. In code you never read it raw; you loop over rows.
Why are buyer and seller empty on some token trades?
Some venues do not publish who traded KRC-20 lots, only the amount and price. NFT sales always name both wallets.
Is it free?
Yes, on Reader: 500 calls a day, sales and mints, last 24 hours. Book and Desk open the full archive and more calls. See plans.
I need an endpoint that is not here.
Tell us what you are building. More are on the way.