DeFiLlama Stablecoins
Circulating supply of each stablecoin over time, from DeFiLlama.
defillama_stablecoins — the dataset name to pass to the Obscura API.
What one row means
One stablecoin's circulating supply as reported by DeFiLlama's live `stablecoins.llama.fi/stablecoins` endpoint at the moment of a given day's scrape — a daily snapshot of one stablecoin's outstanding supply in its peg currency's units (usually USD), not a historical time series pulled from the source (the source itself has no history parameter).
One row per (stablecoin_id, captured_date).
Point-in-time availability
Every Obscura dataset carries available_date: the calendar day the publisher made the row
available, day-of, with no session rounding. It is the one column a backtest filters on, and it means the
same thing on every dataset in the catalog.
For defillama_stablecoins: snapshot: available_date = captured_date, a STORED GENERATED column (migration 000205). WHY THAT IS THE DAY IT BECAME AVAILABLE: /stablecoins is a live-state API with no historical endpoint at all, so a reading exists only because we asked, and the day we asked is the day it was obtainable — there is no publisher release to be early or late against. EVIDENCE captured_date is the capture day: it is Utc::now().date_naive() on a live run and BronzeObject::captured_day() on a bronze replay. Generated rather than collector-written so that a replay of an old capture cannot restamp it with today's clock.
Refresh cadence
Obscura refreshes defillama_stablecoins daily — the most frequent scheduled job that re-collects or re-exports it. This is Obscura's own pipeline cadence, not the upstream publisher's release schedule; when a row became public is recorded per row in available_date.
Schema — 12 columns
The full public column list for defillama_stablecoins, with the meaning of every field. The same
schema is served unauthenticated at https://api.obscura.trade/v1/catalog/defillama_stablecoins.
| Column | Type | Description |
|---|---|---|
| stablecoin_id | text · not null | DeFiLlama's internal numeric-string id for the stablecoin (field `id` in the `peggedAssets` array, e.g. "1" for Tether), stable across days and used as half of the composite primary key. Not an ISO/ticker identifier — it is DeFiLlama's own catalog id and only resolvable via their API. |
| captured_date | date · not null | UTC calendar day the collector CONTACTED DeFiLlama — `Utc::now().date_naive()` on a live run, the bronze object's own capture day on a replay — forming the other half of the composite primary key. Because the source is a live-state API with no historical endpoint, the day we asked is the day this reading was obtainable, which is why `available_date` is generated directly from this column and there is no separate event date to conform. |
| name | text | Stablecoin's display name from DeFiLlama (`name` field in `peggedAssets`, e.g. "Tether", "USD Coin", "Sky Dollar"). Nullable because parse_stablecoins only requires `id`; a coin missing a name field still ingests with name=NULL. |
| symbol | text | Stablecoin's ticker/symbol as reported by DeFiLlama (e.g. "USDT", "USDC", "USDS") — not validated against any exchange listing, just the source's own symbol field. Nullable, same reason as name. |
| peg_type | text | DeFiLlama's peg-currency classification (e.g. "peggedUSD", "peggedEUR"), from the `pegType` field. Used both as a dimension for filtering by peg currency and as the key into the source's nested `circulating` object to select which currency's circulating figure to store — so a mismatch or missing pegType causes circulating to come back NULL rather than defaulting to USD. |
| circulating | double precision | Current circulating supply of the stablecoin, denominated in its peg currency's units (almost always USD given DeFiLlama's dataset skews to USD-pegged coins) at scrape time. Sourced from `peggedAssets[].circulating.<pegType>`, NOT a fixed key — the collector looks up the sub-field matching each coin's own pegType. Nullable if the source omits a circulating figure for that peg type. Rows below `args.min_circulating` (a task arg, default 0) are filtered out entirely before upsert, so this table can silently exclude dust stablecoins depending on task configuration. |
| gecko_id | text | CoinGecko slug for the stablecoin (`gecko_id` field in `peggedAssets`, e.g. "tether"). The only stable *external* identifier DeFiLlama exposes — our `stablecoin_id` is DeFiLlama-private, so this is the canonical join key to any CoinGecko-keyed price/market dataset. Nullable if the source omits it for a coin. |
| price | double precision | The coin's actual market price (`price` field in `peggedAssets`, e.g. 0.999), still returned even with `includePrices=false` (that flag only trims the nested per-chain price detail). The direct de-peg signal — deviation from 1.0 — which circulating supply alone cannot reveal. Nullable if absent. |
| peg_mechanism | text | Backing-model classification (`pegMechanism` field in `peggedAssets`, e.g. "fiat-backed", "crypto-backed", "algorithmic"). The key stablecoin risk classifier and a recurring category dimension; not derivable from anything else we store. Nullable if absent. |
| deprecated | boolean | Status flag marking a delisted/retired stablecoin (`deprecated` field in `peggedAssets`, true on a handful of coins). A lifecycle status a consumer filters on; NULL/false when the source treats the coin as active. |
| yield_bearing | boolean | Attribute flag marking a yield-bearing stablecoin (`yieldBearing` field in `peggedAssets`, true on a handful of coins). A category/attribute dimension distinguishing yield-bearing from plain stablecoins; NULL/false otherwise. |
| available_date | date | PUBLIC-availability date = captured_date. STORED GENERATED column (migration 000205), read-only; the point-in-time column to filter and join on. It is the day the collector polled DeFiLlama, because a live-state API with no historical endpoint makes that the only day this circulating-supply reading could have been obtained. |
Access defillama_stablecoins
Two delivery paths, one identifier. Both require an Obscura account and an active subscription; the catalog entry and the schema above are public.
import obscura
client = obscura.Client("obs_live_…")
df = client.query(
dataset="defillama_stablecoins",
symbols=["NVDA", "AAPL"],
start="2024-01-01",
)
Create a free account Browse all 95 datasets
Frequently asked questions
What is in the defillama_stablecoins dataset?
Circulating supply of each stablecoin over time, from DeFiLlama. One stablecoin's circulating supply as reported by DeFiLlama's live `stablecoins.llama.fi/stablecoins` endpoint at the moment of a given day's scrape — a daily snapshot of one stablecoin's outstanding supply in its peg currency's units (usually USD), not a historical time series pulled from the source (the source itself has no history parameter).
How do I avoid look-ahead bias with defillama_stablecoins?
Filter on defillama_stablecoins.available_date, the day the publisher made the row public. For this dataset that date is derived as follows — snapshot: available_date = captured_date, a STORED GENERATED column (migration 000205). WHY THAT IS THE DAY IT BECAME AVAILABLE: /stablecoins is a live-state API with no historical endpoint at all, so a reading exists only because we asked, and the day we asked is the day it was obtainable — there is no publisher release to be early or late against. EVIDENCE captured_date is the capture day: it is Utc::now().date_naive() on a live run and BronzeObject::captured_day() on a bronze replay. Generated rather than collector-written so that a replay of an old capture cannot restamp it with today's clock. A query of the form WHERE available_date <= '<as-of date>' never sees a row before it existed.
In what formats can I get defillama_stablecoins?
As a Parquet bulk export (POST https://api.obscura.trade/v1/download) or as JSON from the typed query API (POST https://api.obscura.trade/v1/query), both with dataset="defillama_stablecoins". The column schema is public at https://api.obscura.trade/v1/catalog/defillama_stablecoins.
Can I filter defillama_stablecoins by company or symbol?
Yes. defillama_stablecoins carries symbol, the column the API's symbols filter resolves against.
How often is defillama_stablecoins updated?
Obscura refreshes defillama_stablecoins on a daily schedule — that is the most frequent scheduled job that re-collects or re-exports the table. It is Obscura's own pipeline cadence, not the upstream publisher's release schedule; when the publisher makes a row available is described by the availability rule above, and is recorded per row in available_date.