EUR stablecoin data, as JSON.
Quick start
No API key. No registration. Every endpoint is public and CORS-enabled.
curl https://www.eurostablecoins.xyz/api/v1/overview curl https://www.eurostablecoins.xyz/api/v1/supply/eurc curl "https://www.eurostablecoins.xyz/api/v1/history/peg/eurc?period=30d"
Live response
Response from /api/v1/supply/eurc at page render time.
{
"coin_id": "eurc",
"ticker": "EURC",
"name": "EURC",
"issuer": "Circle",
"total_supply": 441008160.27,
"circulating_supply": 380819944.61,
"treasury_held": 60188215.66,
"chain_breakdown": {
"base": 55190804.09,
"solana": 105019311.961023,
"stellar": 3642952.0759435,
"ethereum": 272124848.77,
"avalanche": 4620672.041566,
"worldchain": 409571.33
},
"currency": "EUR",
"recorded_at": "2026-07-01T11:31:27.272+00:00",
"source": "https://www.eurostablecoins.xyz",
"coverage": {
"domain": "supply",
"basis": "coin_level",
"chain_level_applicable": false,
"read_flag": null,
"read_flag_enabled": false
}
}Concepts
coin_idStable lowercase identifier for a coin. Examples: eurc, eurs, euri, deuro, heuro. Same as the URL slug on coin detail pages. Valid values are listed in the Coin IDs section below and returned by /api/v1.
periodQuery parameter accepted by all /history/* endpoints. Values: 7d · 30d · 90d · 1y · 2y · max. Default: 30d. Alternatively use ?start=YYYY-MM-DD and optionally ?end=YYYY-MM-DD for a custom range.
chainChain key for /supply/{id}/{chain} and /history/supply/{id}/{chain}. Valid values depend on which chains a given coin is deployed on. Common keys: ethereum, polygon, arbitrum, base, optimism, avalanche, gnosis, solana, xrpl, stellar, algorand.
coverage gapMissing rows in a series response are real omissions — they are not zeros. Activity history depth and peg coverage vary by coin. A coin absent from /v1/peg has no tracked public price source.
Coin IDs
All active coin_id values. Use these wherever {id} appears in a path. The machine-readable list is always current at /api/v1 under valid_coin_ids.
aeurdeuroeur0euraeuraueurceurcveureeurieurmeurodeuroeeuropeurqeurreurseurtheuroCache & freshness
All endpoints include Cache-Control headers. The CDN cache is separate from the collection cadence — a request may hit a cached response even after new data is collected.
| Domain | CDN cache | Collection cadence |
|---|---|---|
| Supply | 1 min s-maxage · 5 min stale | Every 4 hours (00:05, 04:05, 08:05, 12:05, 16:05, 20:05 UTC) |
| Peg | 1 min s-maxage · 5 min stale | Every 6 hours (00:35, 06:35, 12:35, 18:35 UTC) |
| Activity (mint/burn, transfer) | 1 min s-maxage · 5 min stale | Hourly at :30 UTC (including 08:30 UTC) |
| Holders | 1 min s-maxage · 5 min stale | Daily at 10:00 UTC |
| CEX markets | 1 hr s-maxage · 2 hr stale | Daily at 06:00 UTC |
| DEX markets | 1 hr s-maxage · 2 hr stale | Every 6 hours |
| /api/v1 root | 1 hr s-maxage · 2 hr stale | — |
Endpoints
API index — base info, endpoint list, valid coin IDs, collection cadence.
| name | string | API name |
| version | string | "v1" |
| base_url | string | https://www.eurostablecoins.xyz/api/v1 |
| docs_page | string | Link to /docs |
| cors | string | "enabled (Access-Control-Allow-Origin: *)" |
| cache | string | Cache policy description |
| endpoints | object | Grouped endpoint list (meta / supply / peg / activity / holders / markets) |
| valid_coin_ids | string[] | All active coin_id values |
| period_values | string[] | Accepted ?period values: 7d, 30d, 90d, 1y, 2y, max |
| data_freshness | object | Collection cadence per domain (supply, peg, activity, holders, dex) |
| license | string | Attribution note |
| contact | object | Telegram / Twitter / LinkedIn links |
curl https://www.eurostablecoins.xyz/api/v1
Aggregated market stats — total EUR supply, MiCA breakdown, HHI concentration, dominant coin.
| coin_count | integer | Number of active tracked coins |
| total_circulating_eur | number | Sum of all circulating supplies in EUR |
| mica_licensed_count | integer | Coins with full MiCA EMT licence |
| mica_breakdown | object | Count per status: { emi_licensed, credit_institution, under_review, not_regulated } |
| dominant | object | { coin_id, ticker, share, note } — coin with highest circulating supply |
| hhi_concentration | number | Herfindahl–Hirschman Index (0–10 000); higher = more concentrated |
| coins | object[] | Per-coin: { coin_id, ticker, issuer, mica_status, total_supply, circulating_supply, chain_count, market_share_pct } |
| data_as_of | string | ISO 8601 timestamp of the most recent supply snapshot in this response |
| source | string |
curl https://www.eurostablecoins.xyz/api/v1/overview
Data is cached internally for up to 5 minutes via unstable_cache, then CDN-cached for 1 min. Maximum staleness is ~6 minutes.
Registry index — all active tracked coins with metadata and latest supply state.
| coin_count | integer | Number of active coins returned |
| coins | object[] | Array of coin objects — includes market_status field; see /v1/coins/{id} for full per-coin field schema |
| timestamp | string | ISO 8601 |
| source | string |
curl https://www.eurostablecoins.xyz/api/v1/coins
Registry entry for one coin — metadata, chain list, and latest supply snapshot.
| id | required | Coin identifier (see Coin IDs section) |
| coin_id | string | Stable identifier, e.g. "eurc" |
| ticker | string | Token ticker, e.g. "EURC" |
| name | string | Full token name |
| issuer | string | Short issuer name |
| issuer_full | string | Legal / full issuer name |
| website | string | Issuer website URL |
| mica_status | string | emi_licensed · credit_institution · under_review · not_regulated |
| mica_jurisdiction | string | EU member state of authorisation (when licensed) |
| backing_type | string | "fiat" for all current EUR stablecoins |
| tier | integer | Internal coverage tier (1 = broadest) |
| sunset | boolean | true if asset is deprecated / in wind-down |
| market_status | string | market_traded · limited_trading · non_traded_utility · legacy_or_wind_down · unknown_or_unverified |
| chains | object[] | Per-chain: { chain, chain_type, chain_id, contract, decimals } |
| total_supply | number | Total supply in EUR across all chains |
| circulating_supply | number | total_supply minus treasury_held |
| treasury_held | number | EUR held in identified treasury/reserve wallets |
| chain_breakdown | object | { <chain>: { supply, circulating_supply } } |
| recorded_at | string | ISO 8601 snapshot time |
| source | string | |
| supply_context | object | Optional — present only when supply interpretation requires a caveat |
curl https://www.eurostablecoins.xyz/api/v1/coins/eurc
Latest supply snapshot for all active coins.
| coin_count | integer | Number of coins returned |
| total_circulating_eur | number | Sum of all circulating supplies in EUR |
| currency | string | "EUR" |
| timestamp | string | ISO 8601 |
| source | string | |
| coins | object[] | Per-coin: { coin_id, ticker, name, issuer, total_supply, circulating_supply, treasury_held, chain_breakdown, recorded_at } |
curl https://www.eurostablecoins.xyz/api/v1/supply
Latest supply snapshot for one coin, summed across all chains.
| id | required | Coin identifier |
| coin_id | string | |
| ticker | string | |
| name | string | |
| issuer | string | |
| total_supply | number | EUR, all chains summed |
| circulating_supply | number | total_supply minus treasury_held |
| treasury_held | number | EUR held in identified treasury/reserve wallets |
| chain_breakdown | object | { <chain>: { supply, circulating_supply } } |
| currency | string | "EUR" |
| recorded_at | string | ISO 8601 snapshot time |
| source | string | |
| supply_context | object | Optional — present when supply interpretation requires a caveat |
curl https://www.eurostablecoins.xyz/api/v1/supply/eurc
Latest supply for one coin on one specific chain.
| id | required | Coin identifier |
| chain | required | Chain key — must be a chain on which this coin is deployed (e.g. ethereum, polygon, solana) |
| coin_id | string | |
| ticker | string | |
| chain | string | Chain key as passed in path |
| chain_name | string | Human-readable chain name |
| chain_type | string | evm · solana · xrpl · stellar · algorand · cosmos |
| chain_id | integer | EVM chain ID; null for non-EVM chains |
| contract | string | Token contract / mint / issuer address |
| decimals | integer | Token decimals |
| supply | number | Supply on this chain in EUR |
| currency | string | "EUR" |
| recorded_at | string | ISO 8601 snapshot time |
| source | string | |
| note | string | Optional — present when supply is zero; explains why |
curl https://www.eurostablecoins.xyz/api/v1/supply/eurs/ethereum
Daily supply history for one coin — total, circulating, treasury, per-chain breakdown.
| id | required | Coin identifier |
| period | optional | 7d · 30d · 90d · 1y · 2y · max (default: 30d) |
| start | optional | YYYY-MM-DD start date (alternative to period) |
| end | optional | YYYY-MM-DD end date (default: today; used with start) |
| coin_id | string | |
| ticker | string | |
| period | string | Effective period value, or "custom" |
| points | integer | Number of data points in series |
| earliest | string | YYYY-MM-DD |
| latest | string | YYYY-MM-DD |
| series | object[] | Daily rows — see series fields below |
| source | string |
| date | string | YYYY-MM-DD |
| total_supply | number | |
| circulating_supply | number | |
| treasury_held | number | |
| chain_breakdown | object | { <chain>: supply } |
curl "https://www.eurostablecoins.xyz/api/v1/history/supply/eurc?period=30d"
History depth varies by coin. Coverage gaps are real omissions, not zeros.
Daily supply history for one coin on one specific chain.
| id | required | Coin identifier |
| chain | required | Chain key |
| period | optional | 7d · 30d · 90d · 1y · 2y · max |
| coin_id | string | |
| ticker | string | |
| chain | string | |
| chain_name | string | |
| chain_type | string | |
| contract | string | |
| period | string | |
| points | integer | |
| earliest | string | YYYY-MM-DD |
| latest | string | YYYY-MM-DD |
| series | object[] | { date: string, supply: number } |
| source | string |
curl "https://www.eurostablecoins.xyz/api/v1/history/supply/eurc/ethereum?period=30d"
Latest peg metrics for all coins with a tracked price source.
| coin_count | integer | Coins with a price source (not all tracked coins) |
| coins | object[] | Per-coin peg object — see /v1/peg/{id} for field schema |
| data_as_of | string | YYYY-MM-DD date of the most recent observation across returned coins |
| source | string |
curl https://www.eurostablecoins.xyz/api/v1/peg
Coins without an independent price source are omitted.
Latest peg metrics for one coin — EUR price, deviation, rolling averages, depeg events, score.
| id | required | Coin identifier |
| coin_id | string | |
| ticker | string | |
| current_price_eur | number | Latest observed EUR price |
| deviation_bps | number | Deviation from 1.00 EUR in basis points (100 bps = 1%) |
| avg_deviation_bps_7d | number | 7-day rolling average absolute deviation (bps) |
| avg_deviation_bps_30d | number | 30-day rolling average absolute deviation (bps) |
| max_deviation_bps_7d | number | Max absolute deviation in past 7 days (bps) |
| max_deviation_bps_30d | number | Max absolute deviation in past 30 days (bps) |
| time_in_band_10bps_30d | integer | Percentage of past 30 days with deviation ≤10 bps (0–100; 100 = always in band) |
| time_in_band_50bps_30d | integer | Percentage of past 30 days with deviation ≤50 bps (0–100; 100 = always in band) |
| depeg_events_30d | integer | Days in past 30 where deviation exceeded 100 bps |
| peg_score_100 | number | Composite peg quality score (0–100; 100 = perfectly pegged) |
| price_source | string | Price source identifier |
| date | string | YYYY-MM-DD date of latest observation |
| source | string |
curl https://www.eurostablecoins.xyz/api/v1/peg/eurc
Returns 404 if the coin has no tracked price source.
Daily peg history — EUR price and rolling deviation metrics per day.
| id | required | Coin identifier |
| period | optional | 7d · 30d · 90d · 1y · 2y · max |
| coin_id | string | |
| ticker | string | |
| period | string | |
| points | integer | |
| earliest | string | YYYY-MM-DD |
| latest | string | YYYY-MM-DD |
| series | object[] | Daily rows — see series fields below |
| source | string |
| date | string | YYYY-MM-DD |
| price_eur | number | |
| deviation_bps | number | |
| avg_deviation_bps_7d | number | |
| avg_deviation_bps_30d | number | |
| max_deviation_bps_7d | number | |
| max_deviation_bps_30d | number | |
| time_in_band_10bps_30d | integer | |
| time_in_band_50bps_30d | integer | |
| depeg_events_30d | integer | |
| peg_score_100 | number |
curl "https://www.eurostablecoins.xyz/api/v1/history/peg/eurc?period=90d"
Daily mint and burn history — volumes and transaction counts.
| id | required | Coin identifier |
| period | optional | 7d · 30d · 90d · 1y · 2y · max |
| coin_id | string | |
| ticker | string | |
| period | string | |
| points | integer | |
| earliest | string | YYYY-MM-DD |
| latest | string | YYYY-MM-DD |
| series | object[] | Daily rows — see series fields below |
| source | string |
| date | string | YYYY-MM-DD |
| minted | number | EUR minted that day |
| burned | number | EUR burned that day |
| net_issuance | number | minted − burned |
| mint_tx_count | integer | |
| burn_tx_count | integer | |
| method | string | Collection method identifier |
| confidence | string | Data confidence level |
curl "https://www.eurostablecoins.xyz/api/v1/history/mint-burn/eurc?period=30d"
Coverage varies by coin. Some assets have partial history; others have no mint/burn data.
Validated peer-transfer volume for every tracked coin, with market totals, coverage and quality metadata.
| period | optional | 7d · 14d · 30d · 3m · 6m · 12m · all |
| market_volume | number | Gross peer-transfer volume in EUR |
| daily_average | number | Average over calendar days in the selected window |
| coverage | object | Covered and expected canonical deployments |
| coins | object[] | All tracked coins, including unavailable rows |
| series | object[] | Daily aggregate market series |
curl "https://www.eurostablecoins.xyz/api/v1/transfer-volume?period=30d"
Mint, burn and self-transfers are excluded. Mathematically inconsistent and non-canonical rolling-window rows are rejected.
Peer-transfer volume summary and daily series for one coin.
| id | required | Coin identifier |
| period | optional | 7d · 14d · 30d · 3m · 6m · 12m · all |
| volume | number | Validated period peer-transfer volume |
| daily_average | number | Calendar-day average |
| transfer_count | integer | Peer transfers in covered data |
| coverage | object | Covered and missing canonical chains |
| quality | object | Excluded row counts and reasons |
| series | object[] | Validated daily rows |
curl "https://www.eurostablecoins.xyz/api/v1/transfer-volume/eurc?period=30d"
Unavailable or partial coverage is returned explicitly, never converted to zero coverage.
Daily peer-to-peer transfer volume and active address counts (mint/burn excluded).
| id | required | Coin identifier |
| period | optional | 7d · 14d · 30d · 3m · 6m · 12m · all |
| coin_id | string | |
| ticker | string | |
| period | string | |
| points | integer | |
| earliest | string | YYYY-MM-DD |
| latest | string | YYYY-MM-DD |
| series | object[] | Daily rows — see series fields below |
| source | string |
| date | string | YYYY-MM-DD |
| transfer_volume | number | EUR volume of peer-to-peer transfers |
| transfer_count | integer | |
| active_addresses | integer | Unique sender or receiver addresses |
| largest_transfer | number | Largest single transfer in EUR |
| method | string | Collection method identifier |
| confidence | string |
curl "https://www.eurostablecoins.xyz/api/v1/history/transfer-volume/eurc?period=30d"
Transfers are reconstructed from on-chain Transfer events. Mint/burn transfers are excluded. Coverage varies by coin and chain.
Latest holder count snapshot for one coin — unique addresses with a positive balance, summed across all chains.
| id | required | Coin identifier |
| coin_id | string | |
| ticker | string | |
| total_holders | integer | Unique addresses with a positive balance, summed across all chains |
| active_holders_30d | null | Always null — deprecated; removed due to unreliable cross-chain measurement |
| chain_breakdown | object | { <chain>: { total: N } } — stale: true if previous count was preserved; partial: true if enumeration was capped |
| source | string | Pipe-delimited source tags. Suffix _stale = preserved value; _partial = XRPL page cap reached (floor count) |
| recorded_at | string | ISO 8601 snapshot time |
| note | string | Static note about absence of historical backfill |
curl https://www.eurostablecoins.xyz/api/v1/holders/eurc
No historical holder series is published. Snapshot cadence is daily. The source field encodes data quality per chain.
Top-level markets overview — CEX and DEX summary counts, data timestamps, and endpoint directory.
| generated_at | string | ISO 8601 timestamp of the most recently collected data |
| endpoints | object | Endpoint paths for cex, cex_by_coin, dex, dex_by_coin, combined |
| cex | object | CEX summary: coins_covered, pairs_count, generated_at, source, cadence, note |
| dex | object | DEX summary: pairs_count, coins_covered, chains_covered, generated_at, sources, cadence |
curl https://www.eurostablecoins.xyz/api/v1/markets
All direct CEX market data across all tracked coins — exchange, symbol, price, bid/ask, spread, 24h volume.
| generated_at | string | ISO 8601 time the snapshot was collected |
| fallback_used | boolean | true if response came from the committed static fallback rather than the live DB snapshot |
| source | string | "direct_exchange_api" |
| note | string | Reminder that prices are in each pair's native quote currency |
| pairs_count | integer | Total CEX trading pairs returned |
| coins_covered | integer | Distinct coins with at least one CEX pair |
| markets | object[] | Array of CEX market objects — see markets[] fields below |
| coin_id | string | |
| exchange_id | string | CCXT exchange identifier, e.g. "kraken" |
| exchange_name | string | Display name, e.g. "Kraken" |
| symbol | string | Trading pair symbol, e.g. "EURC/USD" |
| base | string | Base currency, e.g. "EURC" |
| quote | string | Quote currency, e.g. "USD" |
| last | number | Last traded price in quote currency |
| bid | number | Best bid in quote currency |
| ask | number | Best ask in quote currency |
| spread_bps | number | Bid/ask spread in basis points — (ask−bid)/mid × 10 000 |
| base_volume_24h | number | 24h volume in base currency |
| quote_volume_24h | number | 24h volume in quote currency |
| source_type | string | "direct_exchange_api" |
| stale | boolean | true if this venue was not refreshed in the last collection run |
| fetched_at | string | ISO 8601 timestamp of when this row was last fetched |
curl https://www.eurostablecoins.xyz/api/v1/markets/cex
CEX data is collected daily at 06:00 UTC via CCXT direct exchange APIs. CDN-cached for 1 hour. Prices and volumes are in each pair's native quote currency — not USD-normalised.
Direct CEX market data for one coin. Returns 404 for unknown coins. Returns an empty markets array with a note if the coin is tracked but has no CEX coverage.
| id | required | Coin identifier (see Coin IDs section) |
| coin_id | string | |
| ticker | string | |
| generated_at | string | ISO 8601 time the snapshot was collected |
| fallback_used | boolean | |
| source | string | "direct_exchange_api" |
| markets_count | integer | Number of CEX markets for this coin |
| markets | object[] | CEX market rows — same fields as /v1/markets/cex markets[] items |
| note | string | Optional — present when markets_count is 0 |
curl https://www.eurostablecoins.xyz/api/v1/markets/cex/eurc
Latest DEX pool snapshots — price, liquidity, 24h volume, and tx counts across all tracked EUR stablecoin pairs.
| generated_at | string | ISO 8601 time this response was generated |
| sources | string[] | Data source names (e.g. DexScreener, GeckoTerminal) |
| fallback_live_fetch | boolean | true if response was produced by a live fetch rather than a stored snapshot |
| pairs_count | integer | Total DEX pairs returned |
| coins_covered | integer | Distinct coins with at least one DEX pair |
| chains_covered | integer | Distinct chains covered |
| pairs | object[] | Array of DEX pool objects — see pairs[] fields below |
| coin_id | string | |
| ticker | string | |
| chain | string | Chain key |
| dex_id | string | DEX identifier (e.g. "uniswap_v3") |
| dex_label | string | Human-readable DEX name |
| pair_label | string | Trading pair (e.g. "EURC/USDC") |
| pool_address | string | On-chain pool contract address |
| price_usd | number | Current price in USD |
| liquidity_usd | number | Total pool liquidity in USD |
| volume_24h_usd | number | 24-hour trading volume in USD |
| txns_24h | integer | 24-hour transaction count |
| pool_class | string | core_pool · indexed_pool · low_liquidity_pool · stale_pool |
| source | string | Source name for this pool |
| source_url | string | Direct link to pool on source explorer |
| warning_flags | string[] | Data quality warnings, if any |
curl https://www.eurostablecoins.xyz/api/v1/markets/dex
DEX data is collected every 6 hours. CDN-cached for 1 hour. If the stored snapshot is stale the API falls back to a live fetch (fallback_live_fetch: true), which increases response time.
DEX pool data for one coin. Returns 404 for unknown coins. Returns an empty pairs array with a note if the coin has no DEX coverage.
| id | required | Coin identifier (see Coin IDs section) |
| coin_id | string | |
| ticker | string | |
| generated_at | string | ISO 8601 time the snapshot was collected |
| sources | string[] | Data source names |
| fallback_live_fetch | boolean | |
| pairs_count | integer | Number of DEX pairs for this coin |
| pairs | object[] | DEX pair rows — same fields as /v1/markets/dex pairs[] items |
| note | string | Optional — present when pairs_count is 0 |
curl https://www.eurostablecoins.xyz/api/v1/markets/dex/eurc
Combined CEX and DEX market data for one coin in a single response.
| id | required | Coin identifier (see Coin IDs section) |
| coin_id | string | |
| ticker | string | |
| cex | object | { markets_count, generated_at, fallback_used, source, cadence, markets[] } |
| dex | object | { pairs_count, generated_at, sources, fallback_live_fetch, cadence, pairs[] } |
curl https://www.eurostablecoins.xyz/api/v1/markets/eurc
Combines /v1/markets/cex/{id} and /v1/markets/dex/{id} in one call. CEX and DEX keys are always present; inner arrays are empty when no coverage exists for that type.
Attribution
All data is published under CC BY 4.0. An attribution header is requested — not enforced — so we can build a citation map.
Header format: X-Attribution: <app-name>/<version> (<contact>)
If you publish a derived dataset, cite as: “Source: Euro Stablecoins, accessed YYYY-MM-DD.”
Errors
Error responses return JSON with at least an error string field. No API key required; fair-use access. There is no formal rate limit and 429 is never returned. Heavy users should cache responses and use the stale-while-revalidate window.
| Status | Meaning |
|---|---|
| 200 | Success — snapshot or series returned. |
| 400 | Bad request — invalid query parameter (e.g. unrecognised period value or malformed date). |
| 404 | Unknown coin — the coin_id does not resolve to an active tracked coin. Also returned by /peg/{id} when the coin has no price source. |
| 500 | Server error — unexpected failure. Retrying usually succeeds. |
Known limitations
No holder history — /v1/holders/{id} returns only the latest daily snapshot. There is no backfilled time series.
Peg coverage is a subset — coins not tracked by a public price feed are absent from /v1/peg and /v1/history/peg. A 404 response does not indicate a problem with the coin.
Activity coverage varies — not all coins have mint/burn or transfer history. Early periods may be sparse. A missing row is a real gap, not a zero.
XRPL holder counts may be floor estimates — if EURS pagination on XRPL reaches the page cap, the source field includes _partial and the count is a lower bound.
Snapshots are not real-time — data is collected on cron cadence and CDN-cached. The freshness cadence table above shows the worst-case staleness per domain.
Treasury subtraction — circulating_supply subtracts only publicly identifiable treasury wallets. For coins where no wallets are identified, circulating_supply equals total_supply.