Read API
JSON over HTTPS, 9 free endpoints: coins, trades, price candles, holder pots, platform stats, $BALL burns.
curl "https://weball.fun/api/v1/coins?sort=volume&limit=5"Developers
Read every coin, trade, holder pot and payout, give AI agents the same data as tools, and pay per call for the deeper data. No sign-up and no API key: start with one request.
JSON over HTTPS, 9 free endpoints: coins, trades, price candles, holder pots, platform stats, $BALL burns.
curl "https://weball.fun/api/v1/coins?sort=volume&limit=5"The same data as 16 tools any MCP client can call. Add it to Claude Code:
claude mcp add --transport http weball https://weball.fun/mcpTop holders, wallet rewards and creator earnings are $0.01 a call; health grades $0.05. Paid in USDC on Solana with x402: the API answers 402 with the price, your client signs a transfer of that amount and asks again.
How paying worksPrepare a launch, sign it with the creator's wallet, and submit it: no key, the wallet's signature is the authority. Preparing one is free for a limited time.
Send a real request to the live API on Solana mainnet and see the answer. Free calls only; paid calls and launch steps are in the reference as examples. The mint is filled in with $BALL’s; paste any coin’s.
A mint address, a symbol, or part of a name.
curl "https://weball.fun/api/v1/coins"Get a signed POST the moment something happens, instead of polling: a coin launches, a coin graduates, or a coin's holders are paid. Your wallet owns your webhooks: you create and manage them by signing a message, with no key or account.
| Event | Sent when, and what's in it |
|---|---|
| coin.launched | A coin is confirmed on chain: mint, mode, fee, pair, creator, curve pool, page link. |
| coin.graduated | A coin moved to its locked Meteora pool: mint, pool address, time. |
| payout.paid | A payout round finished: round, snapshot slot, holders paid, SOL paid and each basket token bought. |
Amounts are strings in raw units (lamports, token base units). Coin names and symbols are written by creators: they come under untrusted; treat them as data.
POST <your url>
WeBall-Event: coin.launched
WeBall-Event-Id: 1042
WeBall-Signature: t=1791280000,v1=5f2c…
{"id":"1042","type":"coin.launched","network":"mainnet","occurredAt":"2026-10-06T12:41:52.000Z",
"data":{"mint":"…","untrusted":{"name":"…","symbol":"…"},"mode":"holder","feeBps":100, …}}Check the signature before trusting a delivery: HMAC-SHA256 of "<t>.<raw body>" with your secret, compared with v1. Reject old timestamps, and use the event id to ignore repeats.
import { createHmac, timingSafeEqual } from 'node:crypto';
function fromWeBall(rawBody, header, secret) {
const { t, v1 } = Object.fromEntries(header.split(',').map((p) => p.split('=')));
if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false; // older than 5 minutes
const expected = createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex');
return timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
}Webhooks aren't switched on for this network yet. This section shows how they'll work.
Prefer code? The same calls are in the API reference.
Read-only data: nothing here moves money unless you sign it. Health grades signal warnings, not safety, and nothing on WeBall is financial advice.