The live HEAVEN/USDT price and market data as JSON — the same figures the Heaven Terminal shows, read from the same contract call. Free, read-only, CORS-open, cached at the edge.
Fetching the current price…
One request gets you the price. No key, no signup, no headers.
curl https://www.heaventoken.com/api/v1/price
const r = await fetch('https://www.heaventoken.com/api/v1/price');
const { price, day24h } = await r.json();
console.log(price); // 0.0109
console.log(day24h.volumeUsd); // 608.23
Current price and a 24-hour summary. This is the one most integrations want.
{
"ok": true,
"symbol": "HEAVEN",
"pair": "HEAVEN/USDT",
"chain": "bsc",
"price": 0.0109,
"quote": "USDT",
"day24h": { "complete": true, "volumeUsd": 608.23, "trades": 27, "heaven": 55934 },
"tradingOpen": true,
"sellEnabled": false,
"updatedAt": 1787851060786,
"source": "heaven-terminal"
}
Everything: order-book depth, lifetime totals, purchase limits, the treasury threshold and which launch phase the market is in, plus the contract addresses so you can verify any of it on chain yourself.
OHLC history. tf is the timeframe in minutes (5–1440, default 5),
limit is how many candles (1–1200, default 400). Times are
seconds since epoch UTC — the convention charting libraries expect.
{ "time": 1787846400, "open": 0.0109, "high": 0.0109, "low": 0.0109, "close": 0.0109, "volume": 112.57 }
The market keyed by pair, in the shape price aggregators generally expect.
Not from a liquidity pool. The only PancakeSwap pair that exists for HEAVEN is HEAVEN/WBNB, and it holds about eight cents of liquidity — a price read from it comes out roughly 73× wrong. Nothing here ever touches it.
heavenUsd is the best ask on the Heaven Terminal's on-chain
order book — source: "ladder-ask". It is the price HEAVEN can
actually be bought at right now: a buyer paying it on the terminal fills at it. It is
executable, not notional, and it is the same number the terminal itself displays,
read from the same contract call.
{
"heavenUsd": "0.010900", // decimal STRING, formatted from the 18-decimal
// integer — never passed through a float
"decimals": 6,
"source": "ladder-ask",
"sourceLabel": "Best ask on the Heaven Terminal ladder — …",
"at": "2026-08-27T17:49:02.702Z",
"maxAgeSeconds": 300, // treat anything older than this as stale
"fallbackHeavenUsd": "0.010000" // the treasury's standing baseline bid
}
price is still there
as a float for convenience, but heavenUsd is the one to charge against:
it is formatted straight from the on-chain integer, so nothing is lost on the way out.
Four things worth agreeing before anyone charges money against this.
| Question | Our answer |
|---|---|
| Who rounds? | You do. We publish the rate; you round the token amount, always in the holder's favour. One side rounds and the other obeys. |
| Quote vs charge | The commitment is the USDT figure. If the rate moves between quote and charge, the token amount moves with it. There is no quote lock. |
| Auth & limits | None. No key, no rate limit. Cached 15s at the edge, so polling faster returns the same body and costs nothing. |
| When it is down | Fall back to fallbackHeavenUsd and label it.
It is the treasury's standing baseline bid — below the ladder ask, so it
errs in the holder's favour. Do not refuse the charge. |
| Staleness | Treat at older than maxAgeSeconds (300) as stale
and use the fallback. A served body is normally under 75 seconds old. |
Land them on a filled form rather than a blank one:
https://www.heaventoken.com/terminal?amount=253 &to=0xac9a… // the wallet you expect — we warn if a different one is connected &return=https://… // where to send them afterwards
to is not a destination. The ladder always delivers to
whoever signs the transaction. It is the address you expect, so a mismatch can be
flagged before they spend rather than after.
Did it land? Returns that address's purchases from the last 24 hours, served from
data already collected — so it answers in about a second.
Check complete first: when false, an empty list means
"we cannot tell yet", not "it did not happen".
| Field | Type | Meaning |
|---|---|---|
price | number | Best ask on the ladder — what a buyer pays right now, in USDT. |
bestBid | number | Highest standing USDT bid. The floor a seller would fill against. |
day24h.complete | boolean | Read this before the 24h numbers. When false, the other day24h fields are null. |
day24h.volumeUsd | number · null | USDT traded in the last 24 hours. |
lifetime.raisedUsdt | number | All USDT the treasury has received, from the contract itself. |
treasuryThreshold.phase | 1 · 2 | Phase 1 is the treasury resistance period, selling closed. Phase 2 opens the market. |
sellEnabled | boolean | Whether selling is open on chain. False during Phase 1. |
tradingOpen | boolean | False if the ladder is paused. |
updatedAt | number | Milliseconds since epoch, when this snapshot was read. |
day24h.complete is
false and the numbers are null until the scan genuinely
spans 24 hours. Check that flag rather than assuming.
No hard rate limit. Responses are cached at the edge — 15 seconds for price and market, 30 for candles — so polling faster than that returns the same cached body and costs you nothing. Polling once every 15–30 seconds is plenty; the underlying chain state does not move faster than that in a meaningful way.
Errors return ok: false with an error string.
A 503 means the upstream chain read failed — retry shortly.
Never treat a missing field as zero.
Free to use, including commercially. Attribution is appreciated but not required.
The data is provided as-is with no warranty and no uptime guarantee, and it is
market information, not financial advice. Everything here is derived from public
on-chain state you can verify yourself — the contract addresses are in
/api/v1/market.