Every trade, battle, and payout on WaveWarZ happens on Solana mainnet — it's already public. This API just makes it easy to query without running your own RPC indexer. Built for AI agents, dashboards, bots, and anyone who wants live WaveWarZ data in JSON. Free, read-only, no API key.
https://wavewarz.infoFormat: JSONCORS: open (*)Cache: 30–60sNo API key, no auth header, no rate-limit token — just call the endpoint.
curl https://wavewarz.info/api/public/stats/api/public/statsPlatform-wide totals: volume, live battle, artist payouts, trader claims, battle counts. The same numbers shown on the wavewarz.info homepage.
Example request
curl https://wavewarz.info/api/public/statsExample response (trimmed)
{
"updatedAt": "2026-07-18T11:32:05.023Z",
"solPriceUsd": 74.95,
"volume": { "totalSol": 41230.9, "totalUsd": 3090257.4, "last24hSol": 812.3, "last7dSol": 5104.1 },
"liveBattle": null,
"artistPayouts": { "totalSol": 412.3, "totalUsd": 30902.5, "note": "..." },
"traderClaims": { "totalSol": 8210.1, "totalUsd": ..., "withdrawalCount": 3140, "note": "..." },
"battles": { "total": 1904, "mainEvents": 88, "mainBattles": 264, "quickBattles": 1580, "communityBattles": 60 }
}/api/public/battlesFlat, paginated feed of every battle — Main Events, Quick Battles, and Community Battles. Filter by type or fetch the single currently-live battle.
| Param | Type | Description |
|---|---|---|
| type | string | "main" | "quick" | "community" — omit for all types |
| live | boolean | "true" to return only the currently live battle (if any) |
| limit | number | default 50, max 200 |
| offset | number | default 0, for pagination |
Example request
curl "https://wavewarz.info/api/public/battles?type=quick&limit=5"Example response (trimmed)
{
"updatedAt": "2026-07-18T11:32:08.026Z",
"count": 5,
"battles": [
{
"battleId": 1784343368,
"type": "quick",
"live": false,
"winnerDecided": false,
"winnerSide": null,
"artist1": { "name": "STILL DEGEN", "wallet": "HqHj...vvS", "musicLink": "https://audius.co/...", "profilePictureUrl": null, "twitterHandle": null, "albumArtUrl": "https://...", "poolSol": 0.0004, "volumeSol": 0.0393 },
"artist2": { "name": "I'm a Giant", "wallet": "JtcZ...7X", "musicLink": "https://audius.co/...", "profilePictureUrl": null, "twitterHandle": null, "albumArtUrl": "https://...", "poolSol": 0.0131, "volumeSol": 0.0246 },
"factors": { "pollWinner": "artist2", "pollVotesArtist1": 1, "pollVotesArtist2": 4, "djWavyWinner": null, "djWavyReasoning": null },
"imageUrl": "https://...",
"createdAt": "2026-07-18T02:56:21.761769+00:00",
"endsAt": "2026-07-18T03:05:02.761Z",
"url": "https://wavewarz.info/battles/1784343368"
}
]
}/api/public/battles/:idFull detail for a single battle by battle_id, including computed artist earnings once a winner is decided (1% trading fee + settlement bonus split, per the immutable fee schedule). "factors" holds the breakdown behind the winner: for Quick Battles, the Poll (with vote counts) + Charts (larger pool — see artist1/artist2 poolSol) + DJ Wavy (AI judge) picks, 2 of 3 wins; for Main/Community Events, the Human Judge + X Poll + SOL vote picks entered through the admin judging panel. Any factor can be null if it hasn't been recorded yet (or was a tie) — winnerSide is always the authoritative final result.
Example request
curl https://wavewarz.info/api/public/battles/1784343368Example response (trimmed)
{
"battleId": 1784343368,
"type": "quick",
"live": false,
"winnerDecided": true,
"winnerSide": "artist1",
"factors": { "pollWinner": "artist1", "pollVotesArtist1": 5, "pollVotesArtist2": 2, "djWavyWinner": "artist1", "djWavyReasoning": "Stronger hook and better mix clarity in the second verse." },
"artist1": { "name": "STILL DEGEN", "wallet": "...", "musicLink": "...", "poolSol": 1.2, "volumeSol": 3.4, "profilePictureUrl": null, "twitterHandle": "r3plic4nt206", "albumArtUrl": "https://..." },
"artist2": { "name": "I'm a Giant", "wallet": "...", "musicLink": "...", "poolSol": 0.6, "volumeSol": 1.1, "profilePictureUrl": null, "twitterHandle": null, "albumArtUrl": "https://..." },
"artistEarnings": {
"artist1": { "tradingFeesSol": 0.034, "settlementBonusSol": 0.03, "totalSol": 0.064 },
"artist2": { "tradingFeesSol": 0.011, "settlementBonusSol": 0.012, "totalSol": 0.023 }
},
"battleDurationSeconds": 521,
"streamLink": null,
"url": "https://wavewarz.info/battles/1784343368"
}/api/public/eventsMain Events grouped from individual rounds. A Main Event is typically 3 rounds (each its own battle_id from /api/public/battles) between the same two artists. Each round's winner is decided 2-of-3 (Human Judge + X Poll + SOL/Chart vote, entered by the WaveWarZ team through the admin judging panel). The EVENT winner is best-of-3: whoever wins the majority of rounds. Use this endpoint for the real event result — don't infer it from a single round's pool or volume.
| Param | Type | Description |
|---|---|---|
| subtype | string | "standard" | "charity" | "spotlight" | "prediction" — omit for all |
| live | boolean | "true" to return only events with a round currently live |
| limit | number | default 50, max 200 |
Example request
curl "https://wavewarz.info/api/public/events?limit=1"Example response (trimmed)
{
"updatedAt": "2026-07-18T17:04:14.215Z",
"count": 1,
"events": [
{
"eventId": "event-1783899858",
"eventSubtype": "standard",
"live": false,
"artist1": { "name": "R3plic4nT", "wallet": "HEB2...hVt", "profilePictureUrl": null, "twitterHandle": "r3plic4nt206" },
"artist2": { "name": "Stormi", "wallet": "2J32...8bXp", "profilePictureUrl": null, "twitterHandle": "Stormiunleashed" },
"roundsWon": { "artist1": 0, "artist2": 3 },
"winnerSide": "artist2",
"totalVolumeSol": 3.5622,
"imageUrl": "https://...",
"startedAt": "2026-07-12T23:44:53.15946+00:00",
"endsAt": "2026-07-13T00:46:57.808Z",
"rounds": [
{ "battleId": 1783899858, "roundNumber": 1, "winnerSide": "artist2", "artist1PoolSol": 0.0712, "artist2PoolSol": 0.3546, "artist1VolumeSol": 0.3655, "artist2VolumeSol": 0.36, "live": false, "url": "https://wavewarz.info/battles/1783899858", "humanJudgeWinner": "artist2", "xPollWinner": "artist1", "solVoteWinner": "artist2", "judgedAt": "2026-07-13T00:50:12.000Z" }
]
}
]
}/api/public/leaderboards/artistsMain Event artist rankings — wins/losses/draws counted per event (not per round), plus volume and automatic on-chain earnings. Same source of truth as the Artists leaderboard page.
| Param | Type | Description |
|---|---|---|
| limit | number | default 100, max 500 |
Example request
curl "https://wavewarz.info/api/public/leaderboards/artists?limit=10"Example response (trimmed)
{
"updatedAt": "2026-07-18T11:32:05.023Z",
"count": 51,
"artists": [
{
"wallet": "23oq...GmG",
"name": "Geek Myth",
"wins": 3, "losses": 0, "draws": 0,
"totalVolumeSol": "39.3387", "totalVolumeUsd": "$2,949.22",
"totalEarningsSol": "0.4752", "totalEarningsUsd": "$35.63",
"winRate": 100, "battles": 3,
"pfpUrl": null, "twitterHandle": "GeEkMyTh_ETH"
}
]
}/api/public/leaderboards/tradersTrader rankings by total SOL volume, with win rate and net P&L. Net P&L includes both mid-battle sells and real settlement claims (claimShares), parsed directly from on-chain vault transactions — not just recorded trade rows.
| Param | Type | Description |
|---|---|---|
| limit | number | default 100, max 500 |
Example request
curl "https://wavewarz.info/api/public/leaderboards/traders?limit=10"Example response (trimmed)
{
"updatedAt": "2026-07-18T11:32:06.854Z",
"solPriceUsd": 74.95,
"count": 130,
"traders": [
{
"wallet": "B97z...TSA",
"totalVolumeSol": 46.85, "totalVolumeSolFmt": "46.8508", "totalVolumeUsd": "$3,511.47",
"tradeCount": 448, "battleCount": 102,
"wins": 69, "losses": 16, "winRate": 81.18,
"netPnlSol": 2.398, "netPnlFmt": "2.3983", "netPnlUsd": "$179.76", "netPnlPositive": true
}
]
}/api/public/leaderboards/songsQuick Battle song rankings, one row per unique Audius track (keyed by permalink, not the hand-typed battle title) aggregated across every battle it has appeared in.
| Param | Type | Description |
|---|---|---|
| limit | number | default 100, max 500 |
| sort | string | "volume" (default) | "battles" | "winRate" |
Example request
curl "https://wavewarz.info/api/public/leaderboards/songs?sort=battles&limit=10"Example response (trimmed)
{
"updatedAt": "2026-07-18T11:32:07.820Z",
"count": 797,
"songs": [
{
"songTitle": "Fuck yo feelingZ",
"artistName": "GodclouD",
"musicLink": "https://audius.co/GodclouD/fuck-yo-feelingz",
"genre": "Electronic",
"artUrl": "https://...",
"battles": 22, "wins": 16, "losses": 6, "winRate": 73,
"totalVolumeSol": 8.6312, "totalUniqueTraders": 30,
"lastPlayed": "2026-07-17T01:50:56.696344+00:00"
}
]
}solPriceUsd where provided to convert to USD.now < created_at + battle_duration — pure timer math, not a database status flag (status text is inconsistently cased across historical rows).battle_id, from /api/public/battles) with a Main Event (best-of-3 rounds, from /api/public/events) — an individual round's winner and the overall event winner are frequently different artists.artist1 / artist2 fields hold song titles, not artist names — check musicLink for the Audius track and the song leaderboard's artistName field for the actual performer.netPnlSol in the trader leaderboard already accounts for real on-chain claims, not just recorded buy/sell rows.Cache-Control header) — safe to poll every 30s from a live UI.Questions or want a new field/endpoint added? Reach out to the WaveWarZ team on X.