the public api
read-only, json, no key, cors open. lamport amounts are strings; sol and usd are numbers computed with the sol price at response time. the same routes feed every page here.
coins
get/api/xw/coinslive coins, newest first, each with the x account its creator fees are locked to.
- handle
- only coins naming this x account (any case, with or without the @)
- status
- comma-separated statuses; live by default
- limit
- up to 200
curl https://xwallet.fun/api/xw/coins?limit=5
{
"coins": [
{
"id": string, "mint": string, "name": string, "symbol": string,
"imageUri": string, "status": "live", "phase": "curve" | "amm",
"venue": string, "priceSol": number, "creatorFeeBps": number,
"marketCapUsd": number, "solUsd": number,
"createdAt": string, "updatedAt": string,
"recipient": { "id", "handle", "name", "avatarUrl", "wallet",
"signedIn": boolean }
}
]
}coin
get/api/xw/coin/{id}one coin by id or by mint: everything above, plus the description, the launcher, the launch transaction and the top 50 holders read live from the token accounts (empty when the rpc is slow).
- holders
- 0 skips the holder read
curl https://xwallet.fun/api/xw/coin/<id-or-mint>
{
"coin": {
...coin, "description": string, "launcherWallet": string,
"launchTx": string, "devBuyLamports": string,
"holders": [ { "address": string, "balance": string, "pct": number } ],
"totalSupply": string
}
}account
get/api/xw/accountone x account: its wallet once a coin named it, the creator fees waiting for that wallet on pump.fun (read live, every coin naming the account included), its coins, and the claims its owner sent from the site.
- handle
- required, with or without the @
curl "https://xwallet.fun/api/xw/account?handle=<handle>"
{
"handle": string, "name": string | null, "avatarUrl": string | null,
"wallet": string | null, "signedIn": boolean,
"toClaimLamports": string | null, "toClaimSol": number | null,
"toClaimUsd": number | null, // null: pump.fun could not be read right now
"coins": [ coin ],
"claims": [ { "id", "handle", "avatarUrl", "wallet", "lamports": string,
"sol": number, "usd": number, "signature": string, "at": string } ],
"claimedLamports": string, "claimedSol": number
}resolve an x handle
get/api/xw/recipients/resolvethe public profile behind a handle, as the launch form shows it. creates nothing; the wallet is made at launch.
- handle
- required, with or without the @
curl "https://xwallet.fun/api/xw/recipients/resolve?handle=<handle>"
{ "id": string, "handle": string, "name": string, "avatarUrl": string, "followers": number }
// 404 { "error": "x account not found" }stats
get/api/xw/statssite totals: live coins, distinct accounts named, sol claimed through the site and by how many accounts, time of the last claim.
curl https://xwallet.fun/api/xw/stats
{
"claimedLamports": string, "claimedSol": number, "claimedUsd": number,
"liveCoins": number, "recipients": number, "claimers": number,
"lastClaimAt": string | null, "solUsd": number
}verify it yourself
none of the above is needed to check a coin. open its fee sharing config on solscan (the creator its bonding curve records): it lists one shareholder, the named account's wallet, at 10000 bps, and its admin is revoked. that wallet's balance and history are public on solana. a claim is the pump.fun distribution xwallet sends when the owner asks; anyone can send that instruction, and it can only send to that wallet.
the signed-in routes (launch/prepare, launch/confirm, trade/prepare, claim, me) take a privy bearer token and serve the site itself; they are not a stable api.