Why this number now
On 11 November 2026, Glassnode reported that the supply of major stablecoins fell $14.2 billion over 30 days, the largest 30-day contraction since June 2022 (The Block, Cointelegraph, Crypto Briefing). Stablecoin supply only shrinks when holders redeem tokens with the issuer, so analysts read it as cash leaving the crypto market.
Outlets quoted different totals for the remaining supply: "just below $280 billion" in one, "$290 to $293 billion" in another. I wanted to see the raw series myself, and DefiLlama publishes it for free with no API key.
The script
It uses built-in fetch (Node 18+) and two public endpoints:
-
https://stablecoins.llama.fi/stablecoincharts/allreturns one point per day withtotalCirculatingUSD.peggedUSD. -
https://stablecoins.llama.fi/stablecoinsreturns every stablecoin withcirculatingandcirculatingPrevMonth.
// supply-change.mjs // Usage: node supply-change.mjs [days] const DAYS = Number(process.argv[2] || 30); const usd = (n) => `${n < 0 ? '-' : ''}$${(Math.abs(n) / 1e9).toFixed(2)}B`; // 1. Total supply of USD-pegged stablecoins, one point per day const chart = await (await fetch('https://stablecoins.llama.fi/stablecoincharts/all')).json(); const total = chart.map((d) => ({ day: new Date(Number(d.date) * 1000).toISOString().slice(0, 10), v: d.totalCirculatingUSD?.peggedUSD ?? 0, })); const now = total.at(-1); const then = total.at(-1 - DAYS); const pct = ((now.v / then.v - 1) * 100).toFixed(2); console.log(`Total: ${usd(then.v)} on ${then.day} -> ${usd(now.v)} on ${now.day} (${usd(now.v - then.v)}, ${pct}%)`); // 2. The six largest USD stablecoins: today vs a month ago const { peggedAssets } = await (await fetch('https://stablecoins.llama.fi/stablecoins?includePrices=false')).json(); const rows = peggedAssets .filter((a) => a.pegType === 'peggedUSD') .map((a) => ({ sym: a.symbol, now: a.circulating?.peggedUSD ?? 0, month: a.circulatingPrevMonth?.peggedUSD ?? 0 })) .sort((a, b) => b.now - a.now) .slice(0, 6); for (const r of rows) { const d = r.now - r.month; console.log(`${r.sym.padEnd(6)} ${usd(r.now).padStart(9)} ${d >= 0 ? '+' : ''}${usd(d)}`); } What it printed
I ran it at 01:50 UTC on 13 November 2026:
Total: $303.97B on 2026-10-14 -> $287.71B on 2026-11-13 (-$16.26B, -5.35%) USDT $175.48B -$8.43B USDC $69.45B -$3.69B USDS $5.38B -$1.58B USDe $4.90B +$0.14B DAI $4.66B -$0.08B USD1 $3.17B -$1.04B My window ends three days after Glassnode's and DefiLlama tracks more coins, so -$16.26B versus -$14.2B is expected. The direction matches, and USDT plus USDC make up about $12.1B of the drop, close to the "nearly $11 billion" The Block reported for those two.
Things that tripped me up
-
datein the chart endpoint is a Unix timestamp in seconds, as a string.Number(d.date) * 1000before building aDate. -
circulatingPrevMonthis a rolling value from DefiLlama's side, so it won't line up with the chart's day-30 point to the cent. Use the chart for the total and the per-coin fields for the breakdown. - Filter on
pegType === 'peggedUSD'. Without it, euro and gold tokens end up in your top six. - Different trackers include different coins. That explains most of the disagreement between published totals.
Ideas to extend it
- Run it daily from a cron job and alert when the 30-day change flips positive. Glassnode called that the first sign of new money coming in.
- Break USDT down by chain with the
chainCirculatingfield to see which networks lost the most.
Sources: Glassnode via The Block (11 Nov 2026), Cointelegraph (12 Nov 2026), Crypto Briefing (11 Nov 2026), DefiLlama stablecoin API.


