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.
Live mainnet, 2026-08-05, SOL at $73.78:
| Token | Real SOL in curve | Max extractable | Quoted 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.
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.
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>"
| Parameter | Description |
|---|---|
| mint | The token mint address. |
| amount_tokens | Optional. Raw token amount (with decimals) to quote a sale for. |
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"
{
"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"
}]
}
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.
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.
| class | Meaning |
|---|---|
| tradeable | A real exit exists at meaningful size (≥ 0.5 SOL of real reserves). |
| illiquid | A curve exists but holds less than that. Quoted value is close to fiction. |
| untraded | Nothing ever entered the curve. Not a 0% return — no market formed. |
| graduated | Left the curve for an AMM. Not priced here, by design. |
| no_curve | No pump.fun bonding curve at this mint. Distinct from graduated. |
| unknown | We could not read it. Never treat as "no liquidity" — see below. |
| invalid | Not 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.
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"
| Field | Meaning |
|---|---|
| ts | Unix seconds of the sample. |
| class | Classification at that moment (see Classes above). |
| ceiling_sol | Extractable ceiling in SOL at that moment. |
| age_s | Seconds 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.
basis field,
because reading absence as a zero is the same mistake this endpoint exists to correct.
| Tier | Calls / month | Batch | History |
|---|---|---|---|
| Free | 1,000 | 5 | — |
| Trial | 1,000 | 10 | — |
| Standard | 25,000 | 50 | — |
| Pro | 150,000 | 100 | included |
| Node | 1,000,000 | 100 | included |
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.
| Status | Meaning |
|---|---|
| 401 | Missing or invalid key. |
| 400 | No mints supplied. |
| 403 | History requested on a plan that does not include it. |
| 413 | Batch larger than your tier allows. |
| 429 | Monthly quota exhausted. |