walletx

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/coins

live coins with the x account each one sends its fees to, sorted by sol sent, then newest.

handle
only coins naming this x account (any case, with or without the @)
status
comma-separated statuses; live and finishing by default
limit
up to 200
curl https://walletx.fun/api/xw/coins?limit=5
{
  "coins": [
    {
      "id": string, "mint": string, "name": string, "symbol": string,
      "imageUri": string, "status": "live", "phase": "curve" | "amm",
      "venue": string, "sharingConfig": string,
      "priceSol": number, "creatorFeeBps": number, "recipientBps": 10000,
      "marketCapUsd": number,
      "paidLamports": string, "paidSol": number, "paidUsd": number,
      "solUsd": number, "createdAt": string, "updatedAt": string,
      "recipient": { "id", "handle", "name", "avatarUrl", "wallet", "claimed": boolean }
    }
  ]
}

coin

get/api/xw/coin/{id}

one coin by id or by mint: everything above, plus the description, the launcher, the launch transaction, the last 50 payouts 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://walletx.fun/api/xw/coin/<id-or-mint>
{
  "coin": {
    ...coin, "description": string, "launcherWallet": string,
    "launchTx": string, "devBuyLamports": string,
    "payouts": [ payout ],
    "holders": [ { "address": string, "balance": string, "pct": number } ],
    "totalSupply": string
  }
}

payouts

get/api/xw/payouts

payout receipts, newest first. each row is one distribute that reached an x account's wallet, with its transaction signature.

handle
only payouts to this x account
mint
only payouts from this coin
limit
up to 500, 50 by default
curl "https://walletx.fun/api/xw/payouts?handle=<handle>&limit=20"
{
  "payouts": [ { "coinId", "mint", "symbol", "handle", "avatarUrl",
                 "wallet", "lamports": string, "usd": number,
                 "signature": string, "at": string } ],
  "totalLamports": string, "totalUsd": number
}

resolve an x handle

get/api/xw/recipients/resolve

the 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://walletx.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/stats

site totals: sol and usd sent to x accounts across live coins, live coins, distinct accounts reached, time of the last payout.

curl https://walletx.fun/api/xw/stats
{
  "paidLamports": string, "paidSol": number, "paidUsd": number,
  "liveCoins": number, "recipients": number, "lastPayoutAt": string | null,
  "solUsd": number, "recipientBps": 10000
}

verify it yourself

none of the above is needed to check a coin. the fee sharing config on each coin page is a pump.fun program account: open it on solscan and you see its single shareholder and that the admin is revoked. the recipient wallet's balance and history are public on solana. the keeper's distributes are ordinary transactions signed by the operator wallet, each with an walletx: memo.

the signed-in routes (launch/prepare, launch/confirm, trade/prepare, me) take a privy bearer token and serve the site itself; they are not a stable api.