The euro-stablecoins data API now requires an active €49/month subscription and API key.Subscribe →
eurostablecoins.xyz
API · v1 · public reference

EUR stablecoin data, as JSON.

€49/month subscription + API key. Versioned. CORS-enabled. Supply, peg, activity, holders, CEX market data, and DEX market data for every tracked EUR stablecoin. Republish under CC BY 4.0 with attribution.
Endpoints
23
€49/month · API key
Base URL
https://www.eurostablecoins.xyz/api/v1
subscription + API key
Coins
45
tracked · MiCA + non-EU
Format
JSON
CORS-enabled · CC BY 4.0

Quick start

Subscribe (€49/month), then generate your personal API key from your account — the /api/v1 data endpoints require an active subscription and a key; there is no free API access. Send the key on every request as an Authorization: Bearer <key> or x-api-key header (never in a URL). Every endpoint returns JSON and is CORS-enabled.

cURL
curl -H "Authorization: Bearer $ESK_KEY" https://www.eurostablecoins.xyz/api/v1/overview
curl -H "x-api-key: $ESK_KEY" https://www.eurostablecoins.xyz/api/v1/supply/eurc
curl -H "Authorization: Bearer $ESK_KEY" "https://www.eurostablecoins.xyz/api/v1/history/peg/eurc?period=30d"

Example response

Illustrative example of the /api/v1/supply/{coin_id} response shape. Field names and types match the live endpoint; the amounts and recorded_at are sample values, not a live reading.

JSON
{
  "coin_id": "eurc",
  "ticker": "EURC",
  "name": "EURC",
  "issuer": "Circle",
  "total_supply": 208450000,
  "total_onchain_supply": null,
  "onchain_supply_by_chain": null,
  "circulating_supply": 208450000,
  "treasury_held": 0,
  "chain_breakdown": {
    "ethereum": 121300000,
    "base": 62400000,
    "solana": 18900000,
    "avalanche": 5850000
  },
  "currency": "EUR",
  "recorded_at": "2026-08-06T04:12:00.000Z",
  "source": "https://www.eurostablecoins.xyz"
}

Concepts

coin_id

Stable 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.

period

Query parameter accepted by all /history/* endpoints. Values: 7d · 14d · 30d · 3m · 90d · 6m · 12m · 1y · 2y · all · max. Default: 30d. Alternatively use ?start=YYYY-MM-DD and optionally ?end=YYYY-MM-DD for a custom range.

chain

Chain 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 gap

Missing 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.

aeuraryzeeurbiteurblueurbreurdeurodforceeuxeeureneuretoroxeur0euraeuraueurbeurceurcveurdeureeurieurleurmeuro3eurodeuroeeuropeuroseurpaeurqeurreurseursmeurteurweurxtheuroibeurjeurmykoboeurcparrevolut-eurrseurtempoeurtterraeutveurwse

Cache & freshness

Authorized responses are Cache-Control: private, no-store — they are never shared or CDN-cached. The underlying data is cached server-side (separate from the collection cadence), so a request may return data that was collected earlier.

DomainHTTP cacheCollection cadence
Supplyprivate, no-storeEvery 4 hours (scheduled 00:05, 04:05, 08:05, 12:05, 16:05, 20:05 UTC; best-effort scheduler — recorded_at is authoritative)
Pegprivate, no-storeEvery 6 hours (00:35, 06:35, 12:35, 18:35 UTC)
Activity (mint/burn, transfer)private, no-storeDaily at 08:30 UTC
Holdersprivate, no-storeDaily at 10:00 UTC
CEX marketsprivate, no-storeDaily at 06:00 UTC
DEX marketsprivate, no-storeEvery 6 hours
/api/v1 rootprivate, no-store—

Endpoints

Meta
GET/v1Open ↗

API index — base info, endpoint list, valid coin IDs, collection cadence.

Cache Private · not shared/CDN-cached
Response fields
namestringAPI name
versionstring"v1"
base_urlstringhttps://www.eurostablecoins.xyz/api/v1
docs_pagestringLink to /docs
corsstring"enabled (Access-Control-Allow-Origin: *)"
cachestringCache policy description
endpointsobjectGrouped endpoint list (meta / supply / peg / activity / holders / markets)
valid_coin_idsstring[]All active coin_id values
history_period_valuesstring[]Accepted ?period values for /history/* endpoints: 7d, 14d, 30d, 3m, 90d, 6m, 12m, 1y, 2y, all, max
data_freshnessobjectCollection cadence per domain (supply, peg, activity, holders, dex)
licensestringAttribution note
contactobjectTelegram / Twitter / LinkedIn links
Example
curl https://www.eurostablecoins.xyz/api/v1
GET/v1/overviewOpen ↗

Aggregated market stats — total EUR supply, MiCA breakdown, HHI concentration, dominant coin.

Cache Private · not shared/CDN-cached
Response fields
coin_countintegerNumber of active tracked coins
aggregate_coin_countintegerCoins summed into total_circulating_eur (active minus aggregate-excluded)
total_excludes_coinsbooleantrue when one or more tracked coins are excluded from the headline aggregate
excluded_coinsobject[]Aggregate-excluded coins: [{ id, ticker, reason }] — visible in the universe but not summed into total_circulating_eur
total_circulating_eurnumberSum of circulating supplies in EUR (aggregate-excluded coins are NOT summed)
mica_licensed_countintegerCoins with full MiCA EMT licence
mica_breakdownobjectCount per status: { emi_licensed, credit_institution, under_review, not_regulated }
dominantobject{ coin_id, ticker, share, note } — coin with highest circulating supply
hhi_concentrationnumberHerfindahl–Hirschman Index (0–10 000); higher = more concentrated
coinsobject[]Per-coin: { coin_id, ticker, issuer, mica_status, total_supply, total_onchain_supply, onchain_supply_by_chain, circulating_supply, chain_count, market_share_pct, aggregate_excluded, aggregate_exclude_reason }. Methodology-unresolved coins have total_supply null and the amount in total_onchain_supply/onchain_supply_by_chain
data_as_ofstringISO 8601 timestamp of the most recent supply snapshot in this response
sourcestring
Example
curl https://www.eurostablecoins.xyz/api/v1/overview

Data is cached internally for up to 5 minutes via unstable_cache; the HTTP response is private and never shared/CDN-cached (Cache-Control: private, no-store).

GET/v1/coinsOpen ↗

Registry index — all active tracked coins with metadata and latest supply state.

Cache Private · not shared/CDN-cached
Response fields
coin_countintegerNumber of active coins returned
coinsobject[]Array of coin objects — includes market_status field; see /v1/coins/{id} for full per-coin field schema
timestampstringISO 8601
sourcestring
Example
curl https://www.eurostablecoins.xyz/api/v1/coins
GET/v1/coins/{id}Open ↗

Registry entry for one coin — metadata, chain list, and latest supply snapshot.

Cache Private · not shared/CDN-cached
Path params
idrequiredCoin identifier (see Coin IDs section)
Response fields
coin_idstringStable identifier, e.g. "eurc"
tickerstringToken ticker, e.g. "EURC"
namestringFull token name
issuerstringShort issuer name
issuer_fullstringLegal / full issuer name
websitestringIssuer website URL
mica_statusstringemi_licensed · credit_institution · under_review · not_regulated
mica_jurisdictionstringEU member state of authorisation (when licensed)
backing_typestring"fiat" for all current EUR stablecoins
tierintegerInternal coverage tier (1 = broadest)
sunsetbooleantrue if asset is deprecated / in wind-down / apparent shutdown
market_statusstringmarket_traded · limited_trading · non_traded_utility · residual_markets_only · legacy_or_wind_down · unknown_or_unverified
aggregate_excludedbooleantrue if the coin is excluded from the headline aggregate market supply (still listed here with its own supply)
aggregate_exclude_reasonstringReason the coin is excluded from the aggregate; null unless aggregate_excluded is true
operational_statusstringoperating · wind_down · apparent_shutdown (apparent_shutdown = issuer appears to have ceased operations without a confirmed legal closure; sunset stays false — e.g. EURS)
official_shutdown_confirmationbooleanfalse when an apparent shutdown is not legally/formally confirmed; null when not applicable
incidentobjectnull, or { kind, label, url, research_url } for an active incident (e.g. EURS apparent shutdown, EURR security incident)
chainsobject[]Per-chain: { chain, chain_type, chain_id, contract, decimals }
total_supplynumberTotal supply in EUR across all chains. null when the circulating methodology is unresolved — the amount is then in total_onchain_supply
total_onchain_supplynumberCombined raw on-chain amount for methodology-unresolved multi-chain coins (e.g. EURW). Not circulating and not summed into any aggregate; null for ordinary coins
onchain_supply_by_chainobject{ <chain>: number } — per-chain on-chain amounts for methodology-unresolved coins; null for ordinary coins (which use chain_breakdown)
circulating_supplynumbertotal_supply minus treasury_held; null when the circulating methodology is unresolved or the supply basis is raw/synthetic-nominal
nominal_supplynumberNominal on-chain quantity for collateralized-synthetic assets (e.g. a BitShares smartcoin) — explicitly NOT circulating euros; null otherwise
treasury_heldnumberEUR held in identified treasury/reserve wallets
chain_breakdownobject{ <chain>: number } — flat map of per-chain supply; null for methodology-unresolved coins (see onchain_supply_by_chain)
recorded_atstringISO 8601 snapshot time
sourcestring
supply_contextobjectOptional — present only when supply interpretation requires a caveat
provenanceobjectOptional — verified on-chain provenance (contract/proxy identity, authority model, source transports) for coins where it has been established (e.g. EURW); null otherwise
Example
curl https://www.eurostablecoins.xyz/api/v1/coins/eurc
Supply
GET/v1/supplyOpen ↗

Latest supply snapshot for all active coins.

Cache Private · not shared/CDN-cached
Response fields
coin_countintegerNumber of coins returned
aggregate_coin_countintegerCoins summed into total_circulating_eur (excludes aggregate-excluded coins)
total_circulating_eurnumberSum of circulating supplies in EUR — aggregate-excluded coins are NOT summed
total_excludes_coinsbooleantrue when one or more coins in coins[] are excluded from the headline total
excluded_coinsobject[]Aggregate-excluded coins: [{ coin_id, ticker, reason }] — present in coins[] but not summed
currencystring"EUR"
timestampstringISO 8601
sourcestring
coinsobject[]Per-coin: { coin_id, ticker, name, issuer, total_supply, total_onchain_supply, onchain_supply_by_chain, circulating_supply, treasury_held, chain_breakdown, aggregate_excluded, aggregate_exclude_reason, recorded_at }. For methodology-unresolved coins total_supply/chain_breakdown are null and the amount is in total_onchain_supply/onchain_supply_by_chain
Example
curl https://www.eurostablecoins.xyz/api/v1/supply
GET/v1/supply/{id}Open ↗

Latest supply snapshot for one coin, summed across all chains.

Cache Private · not shared/CDN-cached
Path params
idrequiredCoin identifier
Response fields
coin_idstring
tickerstring
namestring
issuerstring
total_supplynumberEUR, all chains summed. null when the circulating methodology is unresolved (see total_onchain_supply)
total_onchain_supplynumberCombined raw on-chain amount for methodology-unresolved multi-chain coins (e.g. EURW); not circulating, not aggregated; null for ordinary coins
onchain_supply_by_chainobject{ <chain>: number } — per-chain on-chain amounts for methodology-unresolved coins; null for ordinary coins
circulating_supplynumbertotal_supply minus treasury_held; null when the circulating methodology is unresolved or the supply basis is raw/synthetic-nominal
treasury_heldnumberEUR held in identified treasury/reserve wallets
chain_breakdownobject{ <chain>: number } — flat map of per-chain supply; null for methodology-unresolved coins (see onchain_supply_by_chain)
currencystring"EUR"
recorded_atstringISO 8601 snapshot time
sourcestring
supply_contextobjectOptional — present when supply interpretation requires a caveat
Example
curl https://www.eurostablecoins.xyz/api/v1/supply/eurc
GET/v1/supply/{id}/{chain}Open ↗

Latest supply for one coin on one specific chain.

Cache Private · not shared/CDN-cached
Path params
idrequiredCoin identifier
chainrequiredChain key — must be a chain on which this coin is deployed (e.g. ethereum, polygon, solana)
Response fields
coin_idstring
tickerstring
chainstringChain key as passed in path
chain_namestringHuman-readable chain name
chain_typestringevm · solana · xrpl · stellar · algorand · cosmos
chain_idintegerEVM chain ID; null for non-EVM chains
contractstringToken contract / mint / issuer address
decimalsintegerToken decimals
supplynumberSupply on this chain in EUR
currencystring"EUR"
recorded_atstringISO 8601 snapshot time
sourcestring
notestringOptional — present when supply is zero; explains why
Example
curl https://www.eurostablecoins.xyz/api/v1/supply/eurs/ethereum
GET/v1/history/supply/{id}Open ↗

Daily supply history for one coin — total, circulating, treasury, per-chain breakdown.

Cache Private · not shared/CDN-cached
Path params
idrequiredCoin identifier
Query params
periodoptional7d · 30d · 90d · 1y · 2y · max (default: 30d)
startoptionalYYYY-MM-DD start date (alternative to period)
endoptionalYYYY-MM-DD end date (default: today; used with start)
Response fields
coin_idstring
tickerstring
periodstringEffective period value, or "custom"
pointsintegerNumber of data points in series
earlieststringYYYY-MM-DD
lateststringYYYY-MM-DD
seriesobject[]Daily rows — see series fields below
sourcestring
series[] item fields
datestringYYYY-MM-DD
total_supplynumbernull for methodology-unresolved coins (see total_onchain_supply)
total_onchain_supplynumberCombined on-chain amount for methodology-unresolved coins; null for ordinary coins
onchain_supply_by_chainobject{ <chain>: supply } for methodology-unresolved coins; null for ordinary coins
circulating_supplynumbernull when the circulating methodology is unresolved or the supply basis is raw/synthetic-nominal
treasury_heldnumber
chain_breakdownobject{ <chain>: supply }; null for methodology-unresolved coins
Example
curl "https://www.eurostablecoins.xyz/api/v1/history/supply/eurc?period=30d"

History depth varies by coin. Coverage gaps are real omissions, not zeros.

GET/v1/history/supply/{id}/{chain}Open ↗

Daily supply history for one coin on one specific chain.

Cache Private · not shared/CDN-cached
Path params
idrequiredCoin identifier
chainrequiredChain key
Query params
periodoptional7d · 30d · 90d · 1y · 2y · max
Response fields
coin_idstring
tickerstring
chainstring
chain_namestring
chain_typestring
contractstring
periodstring
pointsinteger
earlieststringYYYY-MM-DD
lateststringYYYY-MM-DD
seriesobject[]{ date: string, supply: number }
sourcestring
Example
curl "https://www.eurostablecoins.xyz/api/v1/history/supply/eurc/ethereum?period=30d"
Peg
GET/v1/pegOpen ↗

Latest peg metrics for all coins with a tracked price source.

Cache Private · not shared/CDN-cached
Response fields
coin_countintegerCoins with a price source (not all tracked coins)
coinsobject[]Per-coin peg object — see /v1/peg/{id} for field schema
data_as_ofstringYYYY-MM-DD date of the most recent observation across returned coins
sourcestring
Example
curl https://www.eurostablecoins.xyz/api/v1/peg

Coins without an independent price source are omitted.

GET/v1/peg/{id}Open ↗

Latest peg metrics for one coin — EUR price, deviation, rolling averages, depeg events, score.

Cache Private · not shared/CDN-cached
Path params
idrequiredCoin identifier
Response fields
coin_idstring
tickerstring
current_price_eurnumberLatest observed EUR price
deviation_bpsnumberDeviation from 1.00 EUR in basis points (100 bps = 1%)
avg_deviation_bps_7dnumber7-day rolling average absolute deviation (bps)
avg_deviation_bps_30dnumber30-day rolling average absolute deviation (bps)
max_deviation_bps_7dnumberMax absolute deviation in past 7 days (bps)
max_deviation_bps_30dnumberMax absolute deviation in past 30 days (bps)
time_in_band_10bps_30dintegerPercentage of past 30 days with deviation ≤10 bps (0–100; 100 = always in band)
time_in_band_50bps_30dintegerPercentage of past 30 days with deviation ≤50 bps (0–100; 100 = always in band)
depeg_events_30dintegerDays in past 30 where deviation exceeded 100 bps
peg_score_100numberComposite peg quality score (0–100; 100 = perfectly pegged)
price_sourcestringPrice source identifier
datestringYYYY-MM-DD date of latest observation
sourcestring
Example
curl https://www.eurostablecoins.xyz/api/v1/peg/eurc

Returns 404 if the coin has no tracked price source.

GET/v1/history/peg/{id}Open ↗

Daily peg history — EUR price and rolling deviation metrics per day.

Cache Private · not shared/CDN-cached
Path params
idrequiredCoin identifier
Query params
periodoptional7d · 30d · 90d · 1y · 2y · max
Response fields
coin_idstring
tickerstring
periodstring
pointsinteger
earlieststringYYYY-MM-DD
lateststringYYYY-MM-DD
seriesobject[]Daily rows — see series fields below
sourcestring
series[] item fields
datestringYYYY-MM-DD
price_eurnumber
deviation_bpsnumber
avg_deviation_bps_7dnumber
avg_deviation_bps_30dnumber
max_deviation_bps_7dnumber
max_deviation_bps_30dnumber
time_in_band_10bps_30dinteger
time_in_band_50bps_30dinteger
depeg_events_30dinteger
peg_score_100number
Example
curl "https://www.eurostablecoins.xyz/api/v1/history/peg/eurc?period=90d"
Activity
GET/v1/history/mint-burn/{id}Open ↗

Daily mint and burn history — volumes and transaction counts.

Cache Private · not shared/CDN-cached
Path params
idrequiredCoin identifier
Query params
periodoptional7d · 30d · 90d · 1y · 2y · max
Response fields
coin_idstring
tickerstring
periodstring
pointsinteger
earlieststringYYYY-MM-DD
lateststringYYYY-MM-DD
seriesobject[]Daily rows — see series fields below
sourcestring
series[] item fields
datestringYYYY-MM-DD
mintednumberEUR minted that day
burnednumberEUR burned that day
net_issuancenumberminted − burned
mint_tx_countinteger
burn_tx_countinteger
methodstringCollection method identifier
confidencestringData confidence level
Example
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.

GET/v1/transfer-volumeOpen ↗

Validated peer-transfer volume for every tracked coin, with market totals, coverage and quality metadata.

Cache Private · not shared/CDN-cached
Query params
periodoptional7d · 14d · 30d · 3m · 6m · 12m · all
Response fields
market_volumenumberGross peer-transfer volume in EUR
daily_averagenumberAverage over calendar days in the selected window
coverageobjectCovered and expected canonical deployments
coinsobject[]All tracked coins, including unavailable rows
seriesobject[]Daily aggregate market series
Example
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.

GET/v1/transfer-volume/{id}Open ↗

Peer-transfer volume summary and daily series for one coin.

Cache Private · not shared/CDN-cached
Path params
idrequiredCoin identifier
Query params
periodoptional7d · 14d · 30d · 3m · 6m · 12m · all
Response fields
volumenumberValidated period peer-transfer volume
daily_averagenumberCalendar-day average
transfer_countintegerPeer transfers in covered data
coverageobjectCovered and missing canonical chains
qualityobjectExcluded row counts and reasons
seriesobject[]Validated daily rows
Example
curl "https://www.eurostablecoins.xyz/api/v1/transfer-volume/eurc?period=30d"

Unavailable or partial coverage is returned explicitly, never converted to zero coverage.

GET/v1/history/transfer-volume/{id}Open ↗

Daily peer-to-peer transfer volume and active address counts (mint/burn excluded).

Cache Private · not shared/CDN-cached
Path params
idrequiredCoin identifier
Query params
periodoptional7d · 14d · 30d · 3m · 6m · 12m · all
Response fields
coin_idstring
tickerstring
periodstring
pointsinteger
earlieststringYYYY-MM-DD
lateststringYYYY-MM-DD
seriesobject[]Daily rows — see series fields below
sourcestring
series[] item fields
datestringYYYY-MM-DD
transfer_volumenumberEUR volume of peer-to-peer transfers
transfer_countinteger
active_addressesintegerUnique sender or receiver addresses
largest_transfernumberLargest single transfer in EUR
methodstringCollection method identifier
confidencestring
Example
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.

Holders
GET/v1/holders/{id}Open ↗

Latest holder count snapshot for one coin — unique addresses with a positive balance, summed across all chains.

Cache Private · not shared/CDN-cached
Path params
idrequiredCoin identifier
Response fields
coin_idstring
tickerstring
total_holdersintegerUnique addresses with a positive balance, summed across all chains
active_holders_30dnullAlways null — deprecated; removed due to unreliable cross-chain measurement
chain_breakdownobject{ <chain>: { total: N } } — stale: true if previous count was preserved; partial: true if enumeration was capped
sourcestring'+'-delimited source tags (e.g. evm_ethereum+evm_base). Suffix _stale = preserved value; _partial = XRPL page cap reached (floor count)
recorded_atstringISO 8601 snapshot time
notestringStatic note about absence of historical backfill
Example
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.

Markets
GET/v1/marketsOpen ↗

Top-level markets overview — CEX and DEX summary counts, data timestamps, and endpoint directory.

Cache Private · not shared/CDN-cached
Response fields
generated_atstringISO 8601 timestamp of the most recently collected data
endpointsobjectEndpoint paths for cex, cex_by_coin, dex, dex_by_coin, combined
cexobjectCEX summary: coins_covered, pairs_count, generated_at, source, cadence, note
dexobjectDEX summary: pairs_count, coins_covered, chains_covered, generated_at, sources, cadence
Example
curl https://www.eurostablecoins.xyz/api/v1/markets
GET/v1/markets/cexOpen ↗

All direct CEX market data across all tracked coins — exchange, symbol, price, bid/ask, spread, 24h volume.

Cache Private · not shared/CDN-cached
Response fields
generated_atstringISO 8601 time the snapshot was collected
fallback_usedbooleantrue if response came from the committed static fallback rather than the live DB snapshot
sourcestring"direct_exchange_api"
notestringReminder that prices are in each pair's native quote currency
pairs_countintegerTotal CEX trading pairs returned
coins_coveredintegerDistinct coins with at least one CEX pair
marketsobject[]Array of CEX market objects — see markets[] fields below
markets[] item fields
coin_idstring
exchange_idstringCCXT exchange identifier, e.g. "kraken"
exchange_namestringDisplay name, e.g. "Kraken"
symbolstringTrading pair symbol, e.g. "EURC/USD"
basestringBase currency, e.g. "EURC"
quotestringQuote currency, e.g. "USD"
lastnumberRaw last traded price in the pair's native quote currency (transparency only — use eur_price as the coin price)
bidnumberBest bid in quote currency
asknumberBest ask in quote currency
spread_bpsnumberBid/ask spread in basis points — (ask−bid)/mid × 10 000
base_volume_24hnumber24h volume in base currency
quote_volume_24hnumber24h volume in quote currency
eur_pricenumberOrientation-normalised EUR price for the coin; null when not derivable from the pair (coin is the quote side, e.g. BTC/EURC, or a non-EUR quote). Use this — not last — as the coin price.
price_orientationstringeur_quoted · usd_quoted · inverse_eur · quote_side — which side the coin is on and how eur_price was derived
price_reliablebooleanWhether eur_price is safe to present as the coin price (passes the plausibility band)
source_typestring"direct_exchange_api"
stalebooleantrue if this venue was not refreshed in the last collection run
fetched_atstringISO 8601 timestamp of when this row was last fetched
Example
curl https://www.eurostablecoins.xyz/api/v1/markets/cex

CEX data is collected daily at 06:00 UTC via CCXT direct exchange APIs. Cached server-side for 1 hour. Prices and volumes are in each pair's native quote currency — not USD-normalised.

GET/v1/markets/cex/{id}Open ↗

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.

Cache Private · not shared/CDN-cached
Path params
idrequiredCoin identifier (see Coin IDs section)
Response fields
coin_idstring
tickerstring
generated_atstringISO 8601 time the snapshot was collected
fallback_usedboolean
sourcestring"direct_exchange_api"
markets_countintegerNumber of CEX markets for this coin
marketsobject[]CEX market rows — same fields as /v1/markets/cex markets[] items
notestringOptional — present when markets_count is 0
Example
curl https://www.eurostablecoins.xyz/api/v1/markets/cex/eurc
GET/v1/markets/dexOpen ↗

Latest DEX pool snapshots — price, liquidity, 24h volume, and tx counts across all tracked EUR stablecoin pairs.

Cache Private · not shared/CDN-cached
Response fields
generated_atstringISO 8601 time this response was generated
sourcesstring[]Data source names (e.g. DexScreener, GeckoTerminal)
fallback_live_fetchbooleantrue if response was produced by a live fetch rather than a stored snapshot
pairs_countintegerTotal DEX pairs returned
coins_coveredintegerDistinct coins with at least one DEX pair
chains_coveredintegerDistinct chains covered
pairsobject[]Array of DEX pool objects — see pairs[] fields below
pairs[] item fields
coin_idstring
tickerstring
chainstringChain key
dex_idstringDEX identifier (e.g. "uniswap_v3")
dex_labelstringHuman-readable DEX name
pair_labelstringTrading pair (e.g. "EURC/USDC")
pool_addressstringOn-chain pool contract address
price_usdnumberCurrent price in USD
liquidity_usdnumberTotal pool liquidity in USD
volume_24h_usdnumber24-hour trading volume in USD
txns_24hinteger24-hour transaction count
pool_classstringcore_pool · indexed_pool · low_liquidity_pool · stale_pool
sourcestringSource name for this pool
source_urlstringDirect link to pool on source explorer
warning_flagsstring[]Data quality warnings, if any
Example
curl https://www.eurostablecoins.xyz/api/v1/markets/dex

DEX data is collected every 6 hours. Cached server-side 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.

GET/v1/markets/dex/{id}Open ↗

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.

Cache Private · not shared/CDN-cached
Path params
idrequiredCoin identifier (see Coin IDs section)
Response fields
coin_idstring
tickerstring
generated_atstringISO 8601 time the snapshot was collected
sourcesstring[]Data source names
fallback_live_fetchboolean
pairs_countintegerNumber of DEX pairs for this coin
pairsobject[]DEX pair rows — same fields as /v1/markets/dex pairs[] items
notestringOptional — present when pairs_count is 0
Example
curl https://www.eurostablecoins.xyz/api/v1/markets/dex/eurc
GET/v1/markets/{id}Open ↗

Combined CEX and DEX market data for one coin in a single response.

Cache Private · not shared/CDN-cached
Path params
idrequiredCoin identifier (see Coin IDs section)
Response fields
coin_idstring
tickerstring
cexobject{ markets_count, generated_at, fallback_used, source, cadence, markets[] }
dexobject{ pairs_count, generated_at, sources, fallback_live_fetch, cadence, pairs[] }
Example
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

Data-route errors return JSON with an error string; the paid gate returns { error: { code, message } } — 401 (API_KEY_REQUIRED / INVALID / REVOKED / EXPIRED), 403 SUBSCRIPTION_REQUIRED, 429 RATE_LIMITED (with Retry-After), or 503 when authorization can't complete; a key in the URL or conflicting credentials return 400. The per-key rate limit is 120 requests/minute (fair use); authorized responses and the 429 carry X-RateLimit-Limit and X-RateLimit-Remaining, plus X-RateLimit-Reset (delta-seconds until the window resets; 0 when a reset is imminent). Reset is omitted when the limiter cannot read a truthful expiry, and all three may be absent if limiter state is briefly unavailable (fail-open) — in which case Retry-After on a 429 is a conservative fallback, not a measured reset. These are the widely-used de-facto headers, not an RFC. Authorized responses are Cache-Control: private, no-store — cache the underlying data in your client, never the authorized response, and never share a key. The /api/v1 data endpoints require an active €49/month subscription and API key on every request; requests without a valid key return 401. Use is subject to the API Terms of Use.

StatusMeaning
200Success — snapshot or series returned.
400Bad request — invalid query parameter (e.g. unrecognised period value or malformed date).
404Unknown coin — the coin_id does not resolve to an active tracked coin. Also returned by /peg/{id} when the coin has no price source.
500Server error — unexpected failure. Retrying usually succeeds.

Versioning & deprecation

The current contract is /api/v1, versioned in the URL path. It is stable: no /api/v1 endpoint is deprecated or scheduled for retirement today.

  • Additive changes — new endpoints, new response fields, or new optional query parameters — ship in place within v1. Treat unknown fields leniently and match coins by coin_id, not array position, so an additive change never breaks your client.
  • Breaking changes — removing or renaming a field, changing a type, or altering documented semantics — would ship under a new version path (e.g. /api/v2), so /api/v1 keeps working alongside it. There is no in-place breaking change to v1.
  • How a retirement would be signalled — if a future version ever supersedes v1, affected responses would carry the standard Deprecation (RFC 9745) and Sunset (RFC 8594) headers — which state the deprecation and retirement dates — and the successor and migration steps would be published on this page (a Link header would carry the successor URL). These headers are absent today because nothing is deprecated.

Any specific notice period or migration window would be published here before a change takes effect; this policy does not itself promise a fixed notice period. The machine-readable spec is versioned alongside the API at /api/v1/openapi.json.

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 cached server-side. The freshness cadence table above shows the worst-case staleness per domain.

·

Treasury subtraction — circulating_supply subtracts only publicly identifiable treasury wallets. For ordinary coins where no wallets are identified, circulating_supply equals total_supply.

·

Unresolved circulating methodology — for a few coins the circulating basis is undefined (an unreconciled multi-chain on-chain total, or a collateralized-synthetic nominal). These return circulating_supply: null. For multi-chain totals (e.g. EURW) the combined amount is exposed under total_onchain_supply / onchain_supply_by_chain with total_supply null, and is never summed into the headline aggregate.