Gram Forge

Grm API

Read-only access to the GRM token and Gram DNS domains on TON. No signup, no key, no CORS restrictions — call it from a script, a server or a browser tab.

Try it right now:

curl https://api.gram.su/v1/token
Base URL
https://api.gram.su
Auth
None required
Rate limit
120 req / min
Format
JSON, UTF-8

Token

GET/v1/token

Supply, holder count, mintability, price and market cap in one call.

GET/v1/price

Price in USD, 24h change, aggregate volume and liquidity across every pool.

GET/v1/pools

Each tracked pool separately: its own price, depth, volume and trade count.

Holders

Served from a local index of every GRM jetton wallet, refreshed continuously, so filtering and sorting are instant. Every address comes back in all three forms, and carries the holder's .gram name when they have one.

GET/v1/holders

The rich list. Sorted by balance, largest first.

limit
1-1000, default 50
cursor
next_cursor from the previous page. The fast way to walk the list.
offset
alternative to cursor, capped at 10 000 - see Conventions
min_balance
only holders with at least this many GRM
max_balance
only holders with at most this many GRM
with_domain
true to return only holders who own a .gram name
order
desc (default) or asc
Try it/v1/holders?min_balance=100000&limit=10

Gram DNS

Resolution follows TEP-81, read straight from the domain contract. Sale and auction state is detected automatically, so one call tells you whether a name is owned, listed, or still up for grabs.

GET/v1/dns

Browse or search the collection.

limit
1-500, default 50
offset
items to skip
q
substring match on the name
owner
filter by owner, any address form
on_sale
true to show only listed domains
sort
index (default), name, price or expiry
Try it/v1/dns?on_sale=true&sort=price&limit=10
GET/v1/dns/stats

Totals: domains, distinct owners, how many are listed, minted today, expiring within 30 days.

Try it/v1/dns/stats

Conventions

Worth knowing before you write against this.

Envelope. Success is { "ok": true, "data": … }; failure is { "ok": false, "error": "code", "message": "…" }. Status codes always agree with ok.

Three address forms, everywhere. Every address is returned as raw, bounceable and non_bounceable, so you never have to convert. Any of the three is accepted as input.

Paginate with the cursor. Offset paging makes the database walk every preceding row: at 200 000 holders, offset=199000 takes 170 ms while a cursor takes 0.3 ms and stays flat at any depth. Offset is capped at 10 000 for that reason — follow next_cursor instead.

Missing means null, never zero. When a figure can't be determined the field is null. A zero here is a real zero.

GRM is not GRAM. GRAM is the network's native coin, formerly Toncoin. GRM is this jetton, contract EQC47093oX5Xhb0xuk2lCr2RhS8rj-vul61u4W2UH5ORmG_O.

Domain status. owned — has an owner. on_sale — listed, with market and price attached. auction — unclaimed or mid-auction, and auction_url points at the bid page.

Caching. Every response carries a real Cache-Control. Respect it and you will not hit the rate limit: prices last ten seconds, holder pages thirty, domain images a year.

Higher limits. Send X-API-Key. Ask @nosint — free for ecosystem projects.

Domain response

What /v1/dns/{name} returns.

{
  "ok": true,
  "data": {
    "domain": "needmore.gram",
    "status": "owned",
    "contract": {
      "raw": "0:76046da8...e06e",
      "bounceable": "EQB2BG2o...blAU",
      "non_bounceable": "UQB2BG2o...bg3R"
    },
    "owner": { "raw": "0:...", "bounceable": "EQ...", "non_bounceable": "UQ..." },
    "balance_gram": 0.0521,
    "minted_at": "2026-03-04T11:22:19Z",
    "mint_price_gram": 3.5,
    "expires_at": "2027-03-04T11:22:19Z",
    "expires_in_days": 193,
    "records": {
      "wallet": { "raw": "0:...", "bounceable": "EQ...", "non_bounceable": "UQ..." },
      "site_adnl": null,
      "storage_bag": null,
      "next_resolver": null
    },
    "sale": null,
    "images": {
      "1024": "https://api.gram.su/v1/dns/needmore/image?size=1024",
      "512":  "https://api.gram.su/v1/dns/needmore/image?size=512",
      "256":  "https://api.gram.su/v1/dns/needmore/image?size=256"
    }
  }
}