eurostablecoins.xyz
API · v1 · public reference

EUR stablecoin data, as JSON.

Keyless. 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
public · keyless
Base URL
https://www.eurostablecoins.xyz/api/v1
no auth required
Coins
18
tracked · MiCA + non-EU
Format
JSON
CORS-enabled · CC BY 4.0

Quick start

No API key. No registration. Every endpoint is public and CORS-enabled.

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

JSONrecorded_at: 2026-07-01T11:31:27Z
{
  "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_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 · 30d · 90d · 1y · 2y · 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.

aeurdeuroeur0euraeuraueurceurcveureeurieurmeurodeuroeeuropeurqeurreurseurtheuro

Cache & 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.

DomainCDN cacheCollection cadence
Supply1 min s-maxage · 5 min staleEvery 4 hours (00:05, 04:05, 08:05, 12:05, 16:05, 20:05 UTC)
Peg1 min s-maxage · 5 min staleEvery 6 hours (00:35, 06:35, 12:35, 18:35 UTC)
Activity (mint/burn, transfer)1 min s-maxage · 5 min staleHourly at :30 UTC (including 08:30 UTC)
Holders1 min s-maxage · 5 min staleDaily at 10:00 UTC
CEX markets1 hr s-maxage · 2 hr staleDaily at 06:00 UTC
DEX markets1 hr s-maxage · 2 hr staleEvery 6 hours
/api/v1 root1 hr s-maxage · 2 hr stale

Endpoints

Meta
GET/v1Open ↗

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

Cache 1 hr CDN · 2 hr stale-while-revalidate
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
period_valuesstring[]Accepted ?period values: 7d, 30d, 90d, 1y, 2y, 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 1 min CDN · 5 min stale-while-revalidate
Response fields
coin_countintegerNumber of active tracked coins
total_circulating_eurnumberSum of all circulating supplies in EUR
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, circulating_supply, chain_count, market_share_pct }
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, then CDN-cached for 1 min. Maximum staleness is ~6 minutes.

GET/v1/coinsOpen ↗

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

Cache 1 min CDN · 5 min stale-while-revalidate
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 1 min CDN · 5 min stale-while-revalidate
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
market_statusstringmarket_traded · limited_trading · non_traded_utility · legacy_or_wind_down · unknown_or_unverified
chainsobject[]Per-chain: { chain, chain_type, chain_id, contract, decimals }
total_supplynumberTotal supply in EUR across all chains
circulating_supplynumbertotal_supply minus treasury_held
treasury_heldnumberEUR held in identified treasury/reserve wallets
chain_breakdownobject{ <chain>: { supply, circulating_supply } }
recorded_atstringISO 8601 snapshot time
sourcestring
supply_contextobjectOptional — present only when supply interpretation requires a caveat
Example
curl https://www.eurostablecoins.xyz/api/v1/coins/eurc
Supply
GET/v1/supplyOpen ↗

Latest supply snapshot for all active coins.

Cache 1 min CDN · 5 min stale-while-revalidate
Response fields
coin_countintegerNumber of coins returned
total_circulating_eurnumberSum of all circulating supplies in EUR
currencystring"EUR"
timestampstringISO 8601
sourcestring
coinsobject[]Per-coin: { coin_id, ticker, name, issuer, total_supply, circulating_supply, treasury_held, chain_breakdown, recorded_at }
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 1 min CDN · 5 min stale-while-revalidate
Path params
idrequiredCoin identifier
Response fields
coin_idstring
tickerstring
namestring
issuerstring
total_supplynumberEUR, all chains summed
circulating_supplynumbertotal_supply minus treasury_held
treasury_heldnumberEUR held in identified treasury/reserve wallets
chain_breakdownobject{ <chain>: { supply, circulating_supply } }
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 1 min CDN · 5 min stale-while-revalidate
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 1 min CDN · 5 min stale-while-revalidate
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_supplynumber
circulating_supplynumber
treasury_heldnumber
chain_breakdownobject{ <chain>: supply }
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 1 min CDN · 5 min stale-while-revalidate
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 1 min CDN · 5 min stale-while-revalidate
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 1 min CDN · 5 min stale-while-revalidate
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 1 min CDN · 5 min stale-while-revalidate
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 1 min CDN · 5 min stale-while-revalidate
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 1 min CDN · 5 min stale-while-revalidate
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 1 min CDN · 5 min stale-while-revalidate
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 1 min CDN · 5 min stale-while-revalidate
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 1 min CDN · 5 min stale-while-revalidate
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
sourcestringPipe-delimited source tags. 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 1 hr CDN · 2 hr stale-while-revalidate
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 1 hr CDN · 2 hr stale-while-revalidate
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"
lastnumberLast traded price in quote currency
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
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. CDN-cached 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 1 hr CDN · 2 hr stale-while-revalidate
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 1 hr CDN · 2 hr stale-while-revalidate
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. 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.

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 1 hr CDN · 2 hr stale-while-revalidate
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 1 hr CDN · 2 hr stale-while-revalidate
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

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.

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.

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.