Skip to Content
Token Supply API

Token Supply API

Public REST endpoints that serve CLAIM token supply data for indexers such as CoinGecko, CoinMarketCap, DeFiLlama, and any third-party aggregator.

Endpoints

All endpoints are unauthenticated, return JSON, and are safe to poll at any frequency. Responses are cached for 5 minutes (max supply: 24 hours).

GET /api/supply/total

Returns the current total supply of CLAIM (all minted tokens minus any burned).

GET https://claimru.sh/api/supply/total

Response:

{ "result": "14349000.00" }

GET /api/supply/circulating

Returns the circulating supply: total supply minus CLAIM locked in veCLAIM.

GET https://claimru.sh/api/supply/circulating

Response:

{ "result": "12000000.00" }

GET /api/supply/max

Returns null — CLAIM has no hard-coded max supply. Supply starts at 0 and is minted continuously by MineCore with a decaying emission schedule.

GET https://claimru.sh/api/supply/max

Response:

{ "result": null }

Bare response format (?format=bare)

All three endpoints accept the ?format=bare query parameter. When set, they return the decimal value as text/plain instead of the JSON wrapper — required by CoinMarketCap-style submissions that expect a bare numeric body. CoinGecko continues to use the default JSON shape.

GET https://claimru.sh/api/supply/total?format=bare

Returns:

14349000.00
GET https://claimru.sh/api/supply/circulating?format=bare

Returns:

12000000.00
GET https://claimru.sh/api/supply/max?format=bare

Returns the literal four-character string null (since CLAIM has no max supply). CoinMarketCap-style submissions should typically omit the max-supply URL entirely and use the “unlimited” form toggle instead; this endpoint exists for parity.

On error, bare-format responses return HTTP 502 with an empty body and the original error code in the x-supply-error response header.

Error responses

On failure (RPC unreachable, contracts not deployed, or RPC returns a malformed uint256), all endpoints return HTTP 502 with result: null and an error code:

{ "result": null, "error": "SUPPLY_NO_RPC_URL" }
{ "result": null, "error": "SUPPLY_RPC_INVALID_UINT256" }

SUPPLY_RPC_INVALID_UINT256 is emitted when the upstream RPC returns anything other than a strict 0x + 64 hex characters payload for an eth_call view. The endpoints fail closed on that case rather than caching 0 as a “valid” supply read.

Supply methodology

Formula

totalSupply = ClaimToken.totalSupply() lockedSupply = VeClaimNFT.totalLockedClaim() circulatingSupply = totalSupply - lockedSupply

Both values are read from Base mainnet via eth_call against the latest block.

Onchain sources

MetricContractSolidity selector
Total supplyClaimTokentotalSupply()0x18160ddd
Locked supplyVeClaimNFTtotalLockedClaim()0x0ff566a7

Contract addresses are loaded from deployments/<network>.json.

Why exclude locked tokens?

CoinGecko’s official supply methodology  states:

Locked Tokens: Tokens that are locked via smart contracts or other time-based lockups are excluded.

This matches the Aerodrome (AERO) precedent on Base: CoinGecko shows AERO circulating supply as totalSupply - veAERO locked balance. As of April 2026, AERO total supply is ~1.875B with ~954M locked in the Voting Escrow contract, producing a circulating supply of ~921M — which matches the CoinGecko listing exactly.

CLAIM follows the same ve-tokenomics model, so the same formula applies.

Implementation details

ComponentRole
/api/supply/totalServer-side handler: total supply via eth_call to ClaimToken.totalSupply() (0x18160ddd); 5-min cache-control.
/api/supply/circulatingServer-side handler: circulating supply via eth_call to both ClaimToken.totalSupply() and VeClaimNFT.totalLockedClaim() (0x0ff566a7); 5-min cache-control.
/api/supply/maxServer-side handler: returns static { "result": null } (no hard-coded max supply); 24-hour cache-control.
Default response contractJSON shaped as { result: string | null, error?: string }. Wei is converted to a fixed-point decimal string (18 decimals truncated to 2).
?format=bare response contracttext/plain body: the decimal string on success, the literal null for max, or an empty body on 502 (with the error code in the x-supply-error header).
deployments/<network>.jsonSource for ClaimToken and VeClaimNFT addresses used by the handlers.