Vältgeist · API Reference valtgeist.trade

Exit API

What you can actually get out — not what it's quoted at

Every price API reports a value for long-tail Solana tokens. For pre-graduation pump.fun tokens that number carries no information about what you could sell for, and no major aggregator reports a liquidity figure at all. This endpoint returns the number they don't.

The problem, measured

Live mainnet, 2026-08-05, SOL at $73.78:

TokenReal SOL in curveMax extractableQuoted FDV
97SQTYNCTvn…0.0000$0.00$2,071
CULyTVCXuL1…0.0000$0.00$2,066
E1jfGSeMdiL…2.9567$218$2,481
DB9LwPdLVKZ…35.5926$2,626$2,138

A token you can extract $2,626 from and one you can extract $0.00 from both display an FDV of about $2,100. That is not a bug in any data provider — FDV is price × a fixed 1B supply on a curve whose price barely moves early, so it is near-constant by construction. It is a real number that answers a different question than the one holders are asking.

Scope, stated plainly. This prices pump.fun bonding curves, where the gap is widest and no aggregator routes at all. Tokens that graduate move to an AMM and are reported as graduated rather than guessed at. On AMM pools aggregators do publish reserves, and the gap there is slippage-at-size (roughly 1–10% depending on your fraction of the pool) — real, but far smaller than the pre-graduation gap.

Authentication

Pass your key as X-API-Key. Keys are created in the cockpit and shown once — we store only a SHA-256 hash and cannot recover the original.

curl -H "X-API-Key: vg_live_..." \
  "https://gpihbdjxlacmzjjlkyuu.supabase.co/functions/v1/exit-api?mint=<MINT>"

GET — a single mint

ParameterDescription
mintThe token mint address.
amount_tokensOptional. Raw token amount (with decimals) to quote a sale for.

POST — up to 100 mints

curl -X POST -H "X-API-Key: vg_live_..." -H "Content-Type: application/json" \
  -d '{"mints":["<MINT_A>","<MINT_B>"],"amount_tokens":10000000000000}' \
  "https://gpihbdjxlacmzjjlkyuu.supabase.co/functions/v1/exit-api"

Response

{
  "as_of": 1785928245,
  "sol_usd": 73.94,
  "sol_usd_as_of": 1785928245,
  "sol_usd_source": "jup",
  "count": 1,
  "results": [{
    "mint": "7Sv7D2PjjRkx…",
    "curve": "47W6jBqSrRFG…",
    "class": "illiquid",
    "exit_ceiling_sol": 0.03450551,
    "exit_ceiling_usd": 2.5513,
    "graduated": false,
    "sell_quote": {
      "amount_tokens": 10000000000000,
      "proceeds_sol": 0.03450551,
      "proceeds_usd": 2.5513,
      "fee_pct": 1
    },
    "basis": "real_sol_reserves is a hard upper bound on extractable SOL"
  }]
}

The two numbers

exit_ceiling_sol is a hard bound, not an estimate. It is the SOL physically sitting in the curve, so no seller can extract more than it — ever. A bound is worth more than a forecast: you can verify it yourself against the chain, and it cannot be wrong.

sell_quote.proceeds_sol is what selling your size actually yields, priced through the constant-product curve (selling moves the price against you) less the 1% fee, then capped by the bound. Quoted price × quantity is the figure this replaces.

The FX rate travels with the numbers. sol_usd, sol_usd_source and sol_usd_as_of are always returned, so you can see exactly what rate produced the USD figures and how old it is. If no rate is available the USD fields come back null rather than omitted — a missing conversion should be visible, not silent.

Classes

classMeaning
tradeableA real exit exists at meaningful size (≥ 0.5 SOL of real reserves).
illiquidA curve exists but holds less than that. Quoted value is close to fiction.
untradedNothing ever entered the curve. Not a 0% return — no market formed.
graduatedLeft the curve for an AMM. Not priced here, by design.
no_curveNo pump.fun bonding curve at this mint. Distinct from graduated.
unknownWe could not read it. Never treat as "no liquidity" — see below.
invalidNot a valid address. Rejected without an RPC call.
unknown is not zero. If an upstream read fails we say so rather than returning a confident 0. Collapsing "we could not ask" into "there is no liquidity" would report an outage as a valuation — the precise failure this product exists to correct. One malformed mint in a batch is isolated as invalid and never affects the others.

GET — exit history

A bonding curve keeps no past. Current liquidity anyone can read off-chain in one call; what it was six hours ago is gone the moment it changes. We have been sampling continuously, so this is the one part of the API that cannot be reconstructed after the fact — and the reason it sits on the plans that include it.

curl -H "X-API-Key: $KEY" \
  "https://gpihbdjxlacmzjjlkyuu.supabase.co/functions/v1/exit-api?history=1&mint=<MINT>&limit=500"
FieldMeaning
tsUnix seconds of the sample.
classClassification at that moment (see Classes above).
ceiling_solExtractable ceiling in SOL at that moment.
age_sSeconds since the mint was created.

limit defaults to 500 and caps at 2,000, oldest first. Sampling is adaptive — dense while a token is young or moving, sparse once it is cold — so points are not evenly spaced; always read ts rather than assuming a fixed interval.

An empty series means we have no record, not that the token had no liquidity. Only mints that were ever tradeable or graduated are retained, so a token that never held an exit simply is not here. The response repeats this in its basis field, because reading absence as a zero is the same mistake this endpoint exists to correct.

Tiers

TierCalls / monthBatchHistory
Free1,0005
Trial1,00010
Standard25,00050
Pro150,000100included
Node1,000,000100included

The free tier needs a verified Telegram account and nothing else — get a key at app.valtgeist.trade. Your limits follow your subscription, not the key: upgrading or cancelling takes effect on your next request, and a lapsed plan drops a key to the free limits rather than breaking it.

Exceeding your monthly quota returns 429; a batch above your tier's limit returns 413. There is no delay tier — every plan gets the same live data. A delayed liquidity number is worse than useless, since it is exactly the failure mode this endpoint corrects.

Errors

StatusMeaning
401Missing or invalid key.
400No mints supplied.
403History requested on a plan that does not include it.
413Batch larger than your tier allows.
429Monthly quota exhausted.
Figures on this page are measurements from live mainnet on the date stated, not projections. Nothing here is financial advice. Terms · Privacy