STATS
Showing last good dataCounters unavailable
Build with Mudwater Stats

One request. The checked counts.

Use GET /api/stats in your own bot or community tool. No API key or wallet connection is needed. Access is free within the published limits and may pause when its daily budget is used.

Start here

Fetch once, save the response, and reuse it across your chats. Wait at least 5 minutes between checks. The endpoint accepts no query parameters.

const response = await fetch("https://mudwater.cards/api/stats");
if (!response.ok) {
  // On 429 or 503, wait the Retry-After seconds before retrying.
  throw new Error("Stats are not ready. Keep the last dated result.");
}
const stats = await response.json();
const card = stats.cards.find(card => card.number === 49);
console.log(card.population, stats.updatedAt);
const reports = stats.reportedPulls;
if (reports) {
  console.log(reports.oneOfOnes, reports.numberedSerials.prestige);
}
// Never describe partial last24h figures as complete daily totals.

Know what you are quoting

FieldMeaning
updatedAtThe population count time in UTC, not the time you requested it.
cards[].populationCurrent recorded base and foil copies on Solana. Total is base plus foil. These are not lifetime openings.
coverage.populationThe count method, as-of time and whether the count is older than an hour. A saved snapshot is labelled separately.
last24hA sample of verified ten-card openings within the rolling 24-hour window. Coverage is partial, or unavailable. It is never a full daily total.
notablePullsUp to 10 Prestige or Legendary cards in those checked openings, newest first. A flag says when more were left out.
mostPulledThe most frequent card within the checked opening sample. Ties use the lower card number.
totalsPopulation and separately dated collection counters. Verified packsOpened and cardsOpened use a complete sealed-supply check, or stay null when that check is unavailable. packsIssued and packsSealed retain their loose-token meanings.
reportedPullsOfficial 1/1 and numbered-serial reports, separate from measured populations. oneOfOnes holds Legendary 1/1 reports. numberedSerials.prestige holds Prestige /5 reports. Each group has its own run size, report count, format counts and source links. See 1/1 and serial reports.

Null means unknown or unsupported, never zero. Measured serialized populations stay null. Physical populations and First Pull promos are outside this endpoint. Official physical pull reports are available separately in reportedPulls. Pack tokens retired can include redemptions, so they are not labelled pack rips.

Legendary 1/1s and numbered Prestige /5 serials are counted separately. Dedicated serialized packs are a separate product, with no report totals supplied here. Report counts describe the curated list, not every card pulled. A status of none_reported means no official report is recorded for that group, not zero pulls. Each report keeps its reportedAt and checkedOn dates; updatedAt still dates the population count. A card marked not_named has no card field. An unknown serial is omitted too. Each group returns at most 10 reports, newest first; its reportsTruncated flag marks a longer list while its summary counts still cover the full list.

Check each section's time and coverage before posting. Missing recent history returns null, including notablePulls. An available sample with no matching openings can return zero, which means zero in that sample only. Openings with unknown times are counted separately and left out of the rolling window.

Request limits

Each network address gets up to 12 requests per minute and 600 per UTC day. IPv6 addresses share a limit within their network prefix. The service also has a shared budget of 120 requests per minute and 3,000 per UTC day. People sharing a network share a client budget.

GET and HEAD count towards the same limits. HTTP 429 means a quota was reached. HTTP 503 means the service is unavailable, including when it cannot safely check limits. Both return Retry-After in seconds. HTTP 400 means the request included unsupported query parameters.

Responses allow cross-origin reads without credentials. X-RateLimit-Remaining is the smallest remaining allowance across the applicable limits. Responses are not cached by the browser or shared edge; the data behind them is saved and reused. Requests never trigger a new collection scan.

Freshness and fair use

Counts and opening details are saved separately. A background collector can record new verified openings from its activation date without relying on page visits. It does not reconstruct earlier history. Coverage stays partial, and the first day covers only the time since collection began.

For accumulated opening details, from and through describe the 24-hour window at the last saved check. Read those dates together with stale before posting. During a delay or outage, the last checked values keep their original dates. Requests to this endpoint never start a refresh.

Schema version 1 can gain additional fields. Ignore fields you do not use. Credit Mudwater Stats and link to the relevant card or report. Please do not rotate addresses to bypass limits.

Need help integrating? DM @santi_ on X