Public API · v1 · no key required

Heaven Terminal API

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…

Quick start

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

Endpoints

GET/api/v1/price

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"
}
GET/api/v1/market

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.

GET/api/v1/candles?tf=60&limit=200

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 }
GET/api/v1/ticker

The market keyed by pair, in the shape price aggregators generally expect.

Where the price comes from

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 booksource: "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
}
Parse the string, not the number. 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.

Integration contract

Four things worth agreeing before anyone charges money against this.

QuestionOur 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.

Sending a holder to buy

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.

GET/api/v1/purchases?address=0x…

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".

Fields

FieldTypeMeaning
pricenumberBest ask on the ladder — what a buyer pays right now, in USDT.
bestBidnumberHighest standing USDT bid. The floor a seller would fill against.
day24h.completebooleanRead this before the 24h numbers. When false, the other day24h fields are null.
day24h.volumeUsdnumber · nullUSDT traded in the last 24 hours.
lifetime.raisedUsdtnumberAll USDT the treasury has received, from the contract itself.
treasuryThreshold.phase1 · 2Phase 1 is the treasury resistance period, selling closed. Phase 2 opens the market.
sellEnabledbooleanWhether selling is open on chain. False during Phase 1.
tradingOpenbooleanFalse if the ladder is paused.
updatedAtnumberMilliseconds since epoch, when this snapshot was read.
On the 24-hour figures. A full day of on-chain history has to be earned by scanning, and BNB Chain's free tier does not hand it over cheaply. Rather than publish a partial figure dressed up as a day, day24h.complete is false and the numbers are null until the scan genuinely spans 24 hours. Check that flag rather than assuming.

Rate limits & caching

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.

Terms

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.