API Reference
Assets
Canonical assets, listings, prices, and history.
- GET
/v1/Map venue-listed assets to stable IDs and Canton instrument identitiesassets/ map - GET
/v1/Get ranked latest asset market dataassets/ listings/ latest - GET
/v1/Get descriptive token metadata for stable asset IDsassets/ info - GET
/v1/Get one asset by stable IDassets/ {asset_id} - GET
/v1/Get latest aggregate quotes for stable asset IDsassets/ quotes/ latest - GET
/v1/Get historical quote snapshotsassets/ quotes/ historical - GET
/v1/Get aggregate asset OHLCV candlesassets/ ohlcv/ historical - GET
/v1/Get price, FDV, market-cap, and volume series for one assetassets/ {asset_id}/ market-chart - GET
/v1/Get the reported total supply history of one assetassets/ {asset_id}/ supply/ historical - GET
/v1/Get market pairs with current price, volume, and liquidityassets/ market-pairs/ latest - GET
/v1/List registry configurations for an assetassets/ {asset_id}/ registry-configurations
Every endpoint here authenticates with X-API-Key, answers in the standard envelope and fails with the standard error body.
Map venue-listed assets to stable IDs and Canton instrument identities
https://api.cantoncap.cc/v1/assets/mapIncludes assets listed in a trading market on a supported venue visible to the caller. Registry-only instruments are excluded, including when listing_status=all. A USD price or order book is not required.
Parameters
networkenumqueryoptionalCanton network to read.
listing_statusenumqueryoptionalListing status to return; all returns every status.
symbolstringqueryoptionalTicker symbol to match, case-insensitive. An ambiguous symbol returns every match.
instrument_adminstringqueryoptionalCanton instrument administrator to match exactly.
instrument_idstringqueryoptionalCanton instrument ID to match exactly.
limitintegerqueryoptionalMaximum page size, bounded by the caller's plan.
cursorstringqueryoptionalOpaque continuation cursor from the previous response.
If-None-MatchstringheaderoptionalReturn 304 when this entity tag matches the current representation.
Request
curl -s "https://api.cantoncap.cc/v1/assets/map?symbol=CC" \
-H "X-API-Key: $CANTONCAP_API_KEY"Response
200 Asset collection. 304 when If-None-Match matches.
{
"status": {
"timestamp": "2026-10-11T14:00:00.000Z",
"elapsed_ms": 18,
"error_code": 0,
"error_message": null,
"request_id": "req_7Hk2pQ9xLm"
},
"data": [
{
"asset_id": "ast_515c3eaa72bd4a8b9403297879d78ef6",
"network": "mainnet",
"instrument_admin": "DSO::1220b1431ef217342db44d516bb9befde802be7d8899637d290895fa58880f19accc",
"instrument_id": "Amulet",
"name": "Canton Coin",
"symbol": "CC",
"status": "active"
}
],
"pagination": {
"next_cursor": "eyJ2IjoxLCJvIjoyNX0"
}
}dataarray of objects7 child fields
asset_idstringStable opaque CantonCap asset ID, prefixed
ast_.networkenumCanton network the record belongs to.
instrument_adminstringCanton party that administers the instrument. With
instrument_idit is the instrument's Canton identity.instrument_idstringInstrument identifier under its administrator.
namestringnullableDisplay name. Null when none is published.
symbolstringnullableTicker symbol. Null when none is published.
statusenumLifecycle status of the record.
paginationobjectPresent on cursor-paginated collections.
1 child field
next_cursorstringnullableOpaque cursor for the next page, or null on the last page.
Headers
X-RateLimit-LimitRequests allowed in the current one-minute window.X-RateLimit-RemainingRequests left in the window.X-RateLimit-ResetUnix time, in seconds, when the window resets.ETagEntity tag of this representation. Send it back in If-None-Match.
Errors
| Status | Code | When |
|---|---|---|
| 400 | invalid_request | Request validation failedA parameter is malformed, out of bounds or not one of its allowed values. |
| 400 | invalid_request | Invalid cursorThe cursor is malformed or belongs to a different query. Some endpoints name it more precisely, such as Invalid historical range or cursor. |
| 401 | unauthenticated | A valid API key is requiredX-API-Key is missing or unknown. |
| 403 | forbidden | The API key does not resolve to an active planThe key expired, was suspended or has not started. |
| 403 | quota_exceeded | The requested page exceeds the API plan limitAn explicit limit is above the plan's page size. |
| 429 | rate_limited | The request rate limit was exceededThe key's one-minute window is used up. Retry after Retry-After seconds. |
Get ranked latest asset market data
https://api.cantoncap.cc/v1/assets/listings/latestParameters
networkenumqueryoptionalCanton network to read.
convertstringqueryoptionalOne ISO-style quote currency code, or a comma-delimited set where the operation explicitly documents a bounded collection.
sortenumqueryoptionalField to sort the listing by.
sort_direnumqueryoptionalSort direction.
limitintegerqueryoptionalMaximum page size, bounded by the caller's plan.
cursorstringqueryoptionalOpaque continuation cursor from the previous response.
If-None-MatchstringheaderoptionalReturn 304 when this entity tag matches the current representation.
Request
curl -s "https://api.cantoncap.cc/v1/assets/listings/latest?convert=USD&sort=fdv&limit=25" \
-H "X-API-Key: $CANTONCAP_API_KEY"Response
200 Ranked asset listings with prices keyed by currency. 304 when If-None-Match matches.
{
"status": {
"timestamp": "2026-10-11T14:00:00.000Z",
"elapsed_ms": 18,
"error_code": 0,
"error_message": null,
"request_id": "req_7Hk2pQ9xLm"
},
"data": [
{
"asset_id": "ast_515c3eaa72bd4a8b9403297879d78ef6",
"quotes": {
"USD": {
"price": "0.1584",
"market_cap": null,
"fdv": "715482911.36",
"volume_24h": "1840221.55",
"volume": {
"method": "trades",
"coverage": "complete",
"change_24h_pct": "7.31"
},
"price_changes_pct": {
"1h": "0.21",
"24h": "-1.84",
"7d": "4.12",
"30d": null
},
"last_updated_at": "2026-10-11T14:00:00.000Z"
}
},
"position": 1,
"rank": 1,
"name": "Canton Coin",
"symbol": "CC",
"status": "active",
"liquidity": {
"liquidity_usd": "4120334.10",
"bid_depth_usd": "182400.55",
"ask_depth_usd": "176920.30"
},
"liquidity_to_fdv_ratio": "0.005758709342091255",
"liquidity_to_fdv_coverage": {
"completeness": "complete",
"eligible_pool_count": 3,
"included_pool_count": 3
},
"volume_24h_to_fdv_ratio": "0.002571986212208561",
"volume_24h_to_fdv_coverage": {
"window": "24h",
"method": "trades",
"completeness": "complete"
},
"liquidity_score": 82.4,
"liquidity_score_methodology": "asset-top-three-liquidity-v1",
"liquidity_score_updated_at": "2026-10-11T13:55:00.000Z"
}
],
"pagination": {
"next_cursor": "eyJ2IjoxLCJvIjoyNX0"
},
"sort": {
"field": "fdv",
"direction": "desc",
"convert": "USD"
}
}dataarray of objects51 child fields
asset_idstringStable opaque CantonCap asset ID, prefixed
ast_.quotesmapQuotes keyed by conversion currency code, such as
USD. A currency without an observation is omitted, never substituted.27 child fields
pricedecimal stringReference price in the conversion currency, as an exact decimal string.
market_capdecimal stringnullableNull for every asset today: no reviewed circulating-supply methodology exists. FDV is never substituted for it.
fdvdecimal stringnullableFully diluted valuation: price times the reported total supply. Null when the supply is missing, stale or withheld; unavailable is never zero.
volume_24hdecimal stringnullableRolling 24-hour volume in the conversion currency. Null when unavailable.
volumeobjectnullableHow the 24-hour volume was measured, with its coverage. Null when no measurement was selected.
20 child fields
selection_methodenumnullableoptionalActual selected method. The legacy method field keeps its reported/trades enum.
methodology_versionstringoptionalinterpretationenumoptionalCompleteness applies to the measurement's own window, not the current wall clock. A zero is a value, not unavailable activity.
coverage_detailobjectoptionalCounts come from the selected evidence, never ticker nulls. Null means the detail was not recorded. Missing activity has no native or USD volume; unvalued activity has native volume but no selected USD. Partial and incomplete-time counts concern included markets and may overlap. Retained is null when retention status was not established. No restricted market identities are exposed.
12 child fields
unitenumwindowenumRolling window the values cover.
starts_atdate-timenullableStart of the window the snapshot covers.
ends_atdate-timenullablecovered_secondsnumbernullableSeconds of the window the observations cover.
retainedbooleannullableeligible_market_countintegernullableincluded_market_countintegernullablemissing_activity_market_countintegernullableunvalued_market_countintegernullablepartial_market_countintegernullableincomplete_time_market_countintegernullable
methodenumnullablereported(the venue's own aggregate) ortrades(observed trades); null when nothing was selected.coverageenumCoverage of the selected 24-hour volume measurement. It describes observations, not the venue.
change_24h_pctdecimal stringnullable24-hour change of the volume, in percentage points:
"1.5"means 1.5%.as_ofdate-timeoptionalMeasurement time of this volume, independent of the quote price update time.
price_changes_pctmapPrice change per window, keyed by
1h,24h,7dand30d, in percentage points:"1.5"means +1.5%. A window without data is null.last_updated_atdate-timeTime of the latest represented update. For calculated asset prices it is the stored calculation time. Decide acceptable age from it.
positionintegerOne-based position within this snapshot and requested sort; not a market-cap rank.
rankintegernullableCanonical one-based coin rank over the whole listing snapshot, from FDV, pool liquidity and rolling 24-hour volume; the same whatever sort, page or display currency is requested. Null for snapshots written before ranks existed.
namestringnullableDisplay name. Null when none is published.
symbolstringnullableTicker symbol. Null when none is published.
statusenumLifecycle status of the record.
liquidityobjectLiquidity of the asset's markets, in USD and outside any conversion.
3 child fields
liquidity_usddecimal stringnullablePool liquidity in USD: the value locked in the asset's eligible AMM pools.
bid_depth_usddecimal stringnullableExecutable bid depth of the asset's order books, in USD.
ask_depth_usddecimal stringnullableExecutable ask depth of the asset's order books, in USD.
liquidity_to_fdv_ratiodecimal stringnullableAggregate AMM pool liquidity USD divided by FDV USD: a raw ratio, 0.025 displays as 2.5%, exact to 18 fractional digits, not capped at 1. Pool depth only (each eligible pool once per asset); order-book depth and executable capacity are excluded. Identical in every display currency. Null when the asset has no pools, no pool is valued, or FDV is missing, stale, revoked or zero; a measured zero pool liquidity with a positive FDV is 0.
liquidity_to_fdv_coverageobjectPool coverage behind liquidity_to_fdv_ratio: partial when an eligible pool has no valuation, unknown when the asset has no pools. Order-book measurements do not affect it.
3 child fields
completenessenumcomplete,partialorunknown.eligible_pool_countintegerincluded_pool_countinteger
volume_24h_to_fdv_ratiodecimal stringnullableBest available rolling 24-hour volume USD divided by FDV USD: a raw ratio, 0.12 displays as 12%, exact to 18 fractional digits, not capped at 1. The numerator is the listing's selected volume measurement (reported or observed trades, never their sum) over the eligible market population, pools and order books alike. Identical in every display currency. Null when volume is unavailable or FDV is missing, stale, revoked or zero; a measured zero volume with a positive FDV is 0.
volume_24h_to_fdv_coverageobjectThe volume measurement behind volume_24h_to_fdv_ratio: its rolling window, the selected method and that measurement's coverage, so a ratio over partial coverage is distinguishable.
3 child fields
windowenumRolling window the values cover.
methodenumnullablecompletenessenumcomplete,partialorunknown.
liquidity_scorenumbernullableoptionalArithmetic mean of an asset's top three market liquidity scores.
liquidity_score_methodologyenumoptionalMethodology version of the liquidity score.
liquidity_score_updated_atdate-timenullableoptionalOldest contributing market measurement time; null when unavailable. Listings retain their browse snapshot value.
paginationobjectPresent on cursor-paginated collections.
1 child field
next_cursorstringnullableOpaque cursor for the next page, or null on the last page.
sortobjectThe sort this collection is in: field, direction and primary currency, stated once.
3 child fields
fieldenumField the collection is sorted by.
directionenumSort direction.
convertstringCurrency the sort is evaluated in.
Headers
X-RateLimit-LimitRequests allowed in the current one-minute window.X-RateLimit-RemainingRequests left in the window.X-RateLimit-ResetUnix time, in seconds, when the window resets.ETagEntity tag of this representation. Send it back in If-None-Match.Cache-Controlprivate, no-cache: shared caches must not store the answer.VaryX-API-Key: the answer varies by key.
Errors
| Status | Code | When |
|---|---|---|
| 400 | invalid_request | Request validation failedA parameter is malformed, out of bounds or not one of its allowed values. |
| 400 | invalid_request | Invalid cursorThe cursor is malformed or belongs to a different query. Some endpoints name it more precisely, such as Invalid historical range or cursor. |
| 401 | unauthenticated | A valid API key is requiredX-API-Key is missing or unknown. |
| 403 | forbidden | The API key does not resolve to an active planThe key expired, was suspended or has not started. |
| 403 | quota_exceeded | The requested page exceeds the API plan limitAn explicit limit is above the plan's page size. |
| 429 | rate_limited | The request rate limit was exceededThe key's one-minute window is used up. Retry after Retry-After seconds. |
Get descriptive token metadata for stable asset IDs
https://api.cantoncap.cc/v1/assets/infoParameters
includeenumqueryoptionalregistry adds the asset's registry configurations to the response.
idsstringqueryrequiredOne to 100 distinct stable CantonCap asset IDs, comma-separated. Unknown and unpublished IDs are omitted without revealing private records.
If-None-MatchstringheaderoptionalReturn 304 when this entity tag matches the current representation.
Request
curl -s "https://api.cantoncap.cc/v1/assets/info?ids=ast_515c3eaa72bd4a8b9403297879d78ef6,ast_2d9c41e0b7a64f1e9c3b5a8d7e6f1c20" \
-H "X-API-Key: $CANTONCAP_API_KEY"Response
200 Asset collection. 304 when If-None-Match matches.
{
"status": {
"timestamp": "2026-10-11T14:00:00.000Z",
"elapsed_ms": 18,
"error_code": 0,
"error_message": null,
"request_id": "req_7Hk2pQ9xLm"
},
"data": [
{
"asset_id": "ast_515c3eaa72bd4a8b9403297879d78ef6",
"network": "mainnet",
"instrument_admin": "DSO::1220b1431ef217342db44d516bb9befde802be7d8899637d290895fa58880f19accc",
"instrument_id": "Amulet",
"name": "Canton Coin",
"symbol": "CC",
"status": "active",
"aliases": [
"Amulet"
],
"decimals": 10,
"total_supply": "4517356203.5",
"total_supply_as_of": "2026-10-11T12:00:00.000Z",
"token_standard_apis": {
"registry-v1": "https://registry.example.com/api/v1"
},
"description": "The native utility token of the Canton Network.",
"website_url": "https://www.example.com",
"logo_url": "https://assets.example.com/logo.png",
"last_updated_at": "2026-10-11T14:00:00.000Z",
"registry": {
"configuration_count": 1,
"url": "https://www.example.com"
},
"issuers": [
{
"issuer_id": "iss_6b2d8f4a1c3e4b5d9f7a2c4e6b8d0f13",
"legal_name": "Example Issuer Ltd.",
"brand_name": "Example Issuer",
"verification_status": "domain_verified",
"relationship": "issuer"
}
],
"documentation_url": "https://docs.example.com",
"social_links": [
{
"label": "Website",
"url": "https://www.example.com"
}
],
"categories": [
"infrastructure"
],
"liquidity_score": 82.4,
"liquidity_score_methodology": "asset-top-three-liquidity-v1",
"liquidity_score_updated_at": "2026-10-11T13:55:00.000Z"
}
]
}dataarray of objects61 child fields
asset_idstringStable opaque CantonCap asset ID, prefixed
ast_.networkenumCanton network the record belongs to.
instrument_adminstringCanton party that administers the instrument. With
instrument_idit is the instrument's Canton identity.instrument_idstringInstrument identifier under its administrator.
namestringnullableDisplay name. Null when none is published.
symbolstringnullableTicker symbol. Null when none is published.
statusenumLifecycle status of the record.
aliasesarray of stringsOther names or symbols the asset is known by.
decimalsintegernullableDecimal places the instrument uses. Null when unknown.
total_supplydecimal stringnullableoptionalReported total supply in instrument units; null when unavailable.
total_supply_as_ofdate-timenullableoptionalSource timestamp for the reported total supply.
token_standard_apismapdescriptionstringnullableApproved description. Null when none is published.
website_urlURI stringnullableOfficial website. Null when none is published.
logo_urlURI stringnullableLogo image URL. Null when none is published.
last_updated_atdate-timeTime of the latest represented update. For calculated asset prices it is the stored calculation time. Decide acceptable age from it.
registryobjectnullableHow many registry configurations exist and the URL that lists them.
2 child fields
configuration_countintegerurlstring
registry_configurationsobjectnullableoptionalRegistry configurations, present when requested with
include=registry.27 child fields
source_urlURI stringlast_checked_atstringconfiguration_countintegercompletebooleanTrue once the period has ended. A complete period can still be corrected later.
configurationsarray of objects22 child fields
configuration_idstringoperatorstringproviderstringregistrarstringdefault_identifierobject3 child fields
sourcestringschemestringidstring
additional_identifiersarray of objects3 child fields
sourcestringschemestringidstring
issuer_requirementsarray of objects4 child fields
issuerstringrequired_claimsarray of objects2 child fields
propertystringvaluestringThe measured value as an exact decimal string. Null when unavailable; never zero for unknown.
holder_requirementsarray of objects4 child fields
issuerstringrequired_claimsarray of objects2 child fields
propertystringvaluestringThe measured value as an exact decimal string. Null when unavailable; never zero for unknown.
issuersarray of objectsIssuers linked to the asset, with the relationship and verification status.
5 child fields
issuer_idstringStable opaque CantonCap issuer ID, prefixed
iss_.legal_namestringnullableRegistered legal name. Null when not published.
brand_namestringnullableBrand name. Null when not published.
verification_statusenumHow the issuer's identity was verified.
relationshipstringHow the issuer relates to the asset.
documentation_urlURI stringnullableOfficial documentation. Null when none is published.
social_linksarray of objectsoptionalOfficial social profiles, each a label and a URL.
2 child fields
labelstringurlURI string
categoriesarray of stringsCategory labels.
liquidity_scorenumbernullableoptionalArithmetic mean of an asset's top three market liquidity scores.
liquidity_score_methodologyenumoptionalMethodology version of the liquidity score.
liquidity_score_updated_atdate-timenullableoptionalOldest contributing market measurement time; null when unavailable. Listings retain their browse snapshot value.
Headers
X-RateLimit-LimitRequests allowed in the current one-minute window.X-RateLimit-RemainingRequests left in the window.X-RateLimit-ResetUnix time, in seconds, when the window resets.ETagEntity tag of this representation. Send it back in If-None-Match.
Errors
| Status | Code | When |
|---|---|---|
| 400 | invalid_request | Request validation failedA parameter is malformed, out of bounds or not one of its allowed values. |
| 401 | unauthenticated | A valid API key is requiredX-API-Key is missing or unknown. |
| 403 | forbidden | The API key does not resolve to an active planThe key expired, was suspended or has not started. |
| 429 | rate_limited | The request rate limit was exceededThe key's one-minute window is used up. Retry after Retry-After seconds. |
Get one asset by stable ID
https://api.cantoncap.cc/v1/assets/{asset_id}Parameters
asset_idstringpathrequiredStable opaque CantonCap asset ID.
includeenumqueryoptionalregistry adds the asset's registry configurations to the response.
If-None-MatchstringheaderoptionalReturn 304 when this entity tag matches the current representation.
Request
curl -s "https://api.cantoncap.cc/v1/assets/ast_515c3eaa72bd4a8b9403297879d78ef6" \
-H "X-API-Key: $CANTONCAP_API_KEY"Response
200 Asset detail. 304 when If-None-Match matches.
{
"status": {
"timestamp": "2026-10-11T14:00:00.000Z",
"elapsed_ms": 18,
"error_code": 0,
"error_message": null,
"request_id": "req_7Hk2pQ9xLm"
},
"data": {
"asset_id": "ast_515c3eaa72bd4a8b9403297879d78ef6",
"network": "mainnet",
"instrument_admin": "DSO::1220b1431ef217342db44d516bb9befde802be7d8899637d290895fa58880f19accc",
"instrument_id": "Amulet",
"name": "Canton Coin",
"symbol": "CC",
"status": "active",
"aliases": [
"Amulet"
],
"decimals": 10,
"total_supply": "4517356203.5",
"total_supply_as_of": "2026-10-11T12:00:00.000Z",
"token_standard_apis": {
"registry-v1": "https://registry.example.com/api/v1"
},
"description": "The native utility token of the Canton Network.",
"website_url": "https://www.example.com",
"logo_url": "https://assets.example.com/logo.png",
"last_updated_at": "2026-10-11T14:00:00.000Z",
"registry": {
"configuration_count": 1,
"url": "https://www.example.com"
},
"issuers": [
{
"issuer_id": "iss_6b2d8f4a1c3e4b5d9f7a2c4e6b8d0f13",
"legal_name": "Example Issuer Ltd.",
"brand_name": "Example Issuer",
"verification_status": "domain_verified",
"relationship": "issuer"
}
],
"documentation_url": "https://docs.example.com",
"social_links": [
{
"label": "Website",
"url": "https://www.example.com"
}
],
"categories": [
"infrastructure"
],
"liquidity_score": 82.4,
"liquidity_score_methodology": "asset-top-three-liquidity-v1",
"liquidity_score_updated_at": "2026-10-11T13:55:00.000Z"
}
}dataobject61 child fields
asset_idstringStable opaque CantonCap asset ID, prefixed
ast_.networkenumCanton network the record belongs to.
instrument_adminstringCanton party that administers the instrument. With
instrument_idit is the instrument's Canton identity.instrument_idstringInstrument identifier under its administrator.
namestringnullableDisplay name. Null when none is published.
symbolstringnullableTicker symbol. Null when none is published.
statusenumLifecycle status of the record.
aliasesarray of stringsOther names or symbols the asset is known by.
decimalsintegernullableDecimal places the instrument uses. Null when unknown.
total_supplydecimal stringnullableoptionalReported total supply in instrument units; null when unavailable.
total_supply_as_ofdate-timenullableoptionalSource timestamp for the reported total supply.
token_standard_apismapdescriptionstringnullableApproved description. Null when none is published.
website_urlURI stringnullableOfficial website. Null when none is published.
logo_urlURI stringnullableLogo image URL. Null when none is published.
last_updated_atdate-timeTime of the latest represented update. For calculated asset prices it is the stored calculation time. Decide acceptable age from it.
registryobjectnullableHow many registry configurations exist and the URL that lists them.
2 child fields
configuration_countintegerurlstring
registry_configurationsobjectnullableoptionalRegistry configurations, present when requested with
include=registry.27 child fields
source_urlURI stringlast_checked_atstringconfiguration_countintegercompletebooleanTrue once the period has ended. A complete period can still be corrected later.
configurationsarray of objects22 child fields
configuration_idstringoperatorstringproviderstringregistrarstringdefault_identifierobject3 child fields
sourcestringschemestringidstring
additional_identifiersarray of objects3 child fields
sourcestringschemestringidstring
issuer_requirementsarray of objects4 child fields
issuerstringrequired_claimsarray of objects2 child fields
propertystringvaluestringThe measured value as an exact decimal string. Null when unavailable; never zero for unknown.
holder_requirementsarray of objects4 child fields
issuerstringrequired_claimsarray of objects2 child fields
propertystringvaluestringThe measured value as an exact decimal string. Null when unavailable; never zero for unknown.
issuersarray of objectsIssuers linked to the asset, with the relationship and verification status.
5 child fields
issuer_idstringStable opaque CantonCap issuer ID, prefixed
iss_.legal_namestringnullableRegistered legal name. Null when not published.
brand_namestringnullableBrand name. Null when not published.
verification_statusenumHow the issuer's identity was verified.
relationshipstringHow the issuer relates to the asset.
documentation_urlURI stringnullableOfficial documentation. Null when none is published.
social_linksarray of objectsoptionalOfficial social profiles, each a label and a URL.
2 child fields
labelstringurlURI string
categoriesarray of stringsCategory labels.
liquidity_scorenumbernullableoptionalArithmetic mean of an asset's top three market liquidity scores.
liquidity_score_methodologyenumoptionalMethodology version of the liquidity score.
liquidity_score_updated_atdate-timenullableoptionalOldest contributing market measurement time; null when unavailable. Listings retain their browse snapshot value.
Headers
X-RateLimit-LimitRequests allowed in the current one-minute window.X-RateLimit-RemainingRequests left in the window.X-RateLimit-ResetUnix time, in seconds, when the window resets.ETagEntity tag of this representation. Send it back in If-None-Match.
Errors
| Status | Code | When |
|---|---|---|
| 400 | invalid_request | Request validation failedA parameter is malformed, out of bounds or not one of its allowed values. |
| 401 | unauthenticated | A valid API key is requiredX-API-Key is missing or unknown. |
| 403 | forbidden | The API key does not resolve to an active planThe key expired, was suspended or has not started. |
| 404 | not_found | Asset not foundThe asset does not exist or is not published. |
| 429 | rate_limited | The request rate limit was exceededThe key's one-minute window is used up. Retry after Retry-After seconds. |
Get latest aggregate quotes for stable asset IDs
https://api.cantoncap.cc/v1/assets/quotes/latestParameters
idsstringqueryrequiredOne to 100 distinct stable CantonCap asset IDs, comma-separated. Unknown and unpublished IDs are omitted without revealing private records.
convertstringqueryoptionalOne ISO-style quote currency code, or a comma-delimited set where the operation explicitly documents a bounded collection.
price_change_periodsstringqueryoptionalWindows to include in price_changes_pct, comma-separated.
If-None-MatchstringheaderoptionalReturn 304 when this entity tag matches the current representation.
Request
curl -s "https://api.cantoncap.cc/v1/assets/quotes/latest?ids=ast_515c3eaa72bd4a8b9403297879d78ef6,ast_2d9c41e0b7a64f1e9c3b5a8d7e6f1c20&convert=USD" \
-H "X-API-Key: $CANTONCAP_API_KEY"Response
200 Asset quote collection. 304 when If-None-Match matches.
{
"status": {
"timestamp": "2026-10-11T14:00:00.000Z",
"elapsed_ms": 18,
"error_code": 0,
"error_message": null,
"request_id": "req_7Hk2pQ9xLm"
},
"data": [
{
"asset_id": "ast_515c3eaa72bd4a8b9403297879d78ef6",
"quotes": {
"USD": {
"price": "0.1584",
"market_cap": null,
"fdv": "715482911.36",
"volume_24h": "1840221.55",
"volume": {
"method": "trades",
"coverage": "complete",
"change_24h_pct": "7.31"
},
"price_changes_pct": {
"1h": "0.21",
"24h": "-1.84",
"7d": "4.12",
"30d": null
},
"last_updated_at": "2026-10-11T14:00:00.000Z"
}
}
}
]
}dataarray of objects29 child fields
asset_idstringStable opaque CantonCap asset ID, prefixed
ast_.quotesmapQuotes keyed by conversion currency code, such as
USD. A currency without an observation is omitted, never substituted.27 child fields
pricedecimal stringReference price in the conversion currency, as an exact decimal string.
market_capdecimal stringnullableNull for every asset today: no reviewed circulating-supply methodology exists. FDV is never substituted for it.
fdvdecimal stringnullableFully diluted valuation: price times the reported total supply. Null when the supply is missing, stale or withheld; unavailable is never zero.
volume_24hdecimal stringnullableRolling 24-hour volume in the conversion currency. Null when unavailable.
volumeobjectnullableHow the 24-hour volume was measured, with its coverage. Null when no measurement was selected.
20 child fields
selection_methodenumnullableoptionalActual selected method. The legacy method field keeps its reported/trades enum.
methodology_versionstringoptionalinterpretationenumoptionalCompleteness applies to the measurement's own window, not the current wall clock. A zero is a value, not unavailable activity.
coverage_detailobjectoptionalCounts come from the selected evidence, never ticker nulls. Null means the detail was not recorded. Missing activity has no native or USD volume; unvalued activity has native volume but no selected USD. Partial and incomplete-time counts concern included markets and may overlap. Retained is null when retention status was not established. No restricted market identities are exposed.
12 child fields
unitenumwindowenumRolling window the values cover.
starts_atdate-timenullableStart of the window the snapshot covers.
ends_atdate-timenullablecovered_secondsnumbernullableSeconds of the window the observations cover.
retainedbooleannullableeligible_market_countintegernullableincluded_market_countintegernullablemissing_activity_market_countintegernullableunvalued_market_countintegernullablepartial_market_countintegernullableincomplete_time_market_countintegernullable
methodenumnullablereported(the venue's own aggregate) ortrades(observed trades); null when nothing was selected.coverageenumCoverage of the selected 24-hour volume measurement. It describes observations, not the venue.
change_24h_pctdecimal stringnullable24-hour change of the volume, in percentage points:
"1.5"means 1.5%.as_ofdate-timeoptionalMeasurement time of this volume, independent of the quote price update time.
price_changes_pctmapPrice change per window, keyed by
1h,24h,7dand30d, in percentage points:"1.5"means +1.5%. A window without data is null.last_updated_atdate-timeTime of the latest represented update. For calculated asset prices it is the stored calculation time. Decide acceptable age from it.
Headers
X-RateLimit-LimitRequests allowed in the current one-minute window.X-RateLimit-RemainingRequests left in the window.X-RateLimit-ResetUnix time, in seconds, when the window resets.ETagEntity tag of this representation. Send it back in If-None-Match.Cache-Controlprivate, no-cache: shared caches must not store the answer.VaryX-API-Key: the answer varies by key.
Errors
| Status | Code | When |
|---|---|---|
| 400 | invalid_request | Request validation failedA parameter is malformed, out of bounds or not one of its allowed values. |
| 401 | unauthenticated | A valid API key is requiredX-API-Key is missing or unknown. |
| 403 | forbidden | The API key does not resolve to an active planThe key expired, was suspended or has not started. |
| 429 | rate_limited | The request rate limit was exceededThe key's one-minute window is used up. Retry after Retry-After seconds. |
Get historical quote snapshots
https://api.cantoncap.cc/v1/assets/quotes/historicalNewest-first sampled reference-price history of one to 100 assets in one quote currency. Each point is the latest eligible quote calculated in one UTC interval; intervals without a quote are omitted, never filled. A point's timestamp is the instant its quote was calculated: its price and fdv are both valued at that instant, and interval, time_start (inclusive) and time_end (exclusive) apply to it.
fdv is the exact decimal product of the point's price and the registry total supply known when the quote was calculated: the latest approved observation that applied and had been observed by timestamp, provided its as-of time lies within the supply freshness window (24 hours by default, stored with the calculation) before timestamp. Supply observed later, corrections included, never revalues a past point; a new quote uses it. fdv is null when that supply was missing or stale, when the quote predates FDV calculation, or when the supply's registrar no longer publishes it to the caller; unavailable is never zero, and a valid zero supply gives an fdv of zero. market_cap is null: no reviewed circulating-supply methodology exists.
Every page re-applies current publication controls. A revoked quote is omitted; a withdrawn supply nulls fdv without hiding the price. A continuation cursor pins the query and the quotes retained before its first page, so later quotes never enter that traversal and pages never duplicate, omit or reorder points; a new query sees them. Use a cursor only with the query that returned it. limit bounds the points of all requested series together. A range spans at most 31 days, further bounded by plan history depth.
Parameters
idsstringqueryrequiredOne to 100 distinct stable CantonCap asset IDs, comma-separated. Unknown and unpublished IDs are omitted without revealing private records.
convertstringqueryoptionalOne ISO-style quote currency code, or a comma-delimited set where the operation explicitly documents a bounded collection.
intervalenumqueryoptionalUTC-aligned candle duration or historical quote sampling interval. Results are newest first; missing buckets are omitted. Quote sampling selects the latest eligible measurement in each interval.
time_startdate-timequeryoptionalInclusive UTC range start; defaults to 24 hours before time_end. At most 31 days per request, further bounded by plan history depth.
time_enddate-timequeryoptionalExclusive UTC range end; defaults to request time and is pinned by continuation cursors.
limitintegerqueryoptionalMaximum page size, bounded by the caller's plan.
cursorstringqueryoptionalOpaque continuation cursor from the previous response.
Request
curl -s "https://api.cantoncap.cc/v1/assets/quotes/historical?ids=ast_515c3eaa72bd4a8b9403297879d78ef6&convert=USD&interval=1h&time_start=2026-10-10T00:00:00Z&time_end=2026-10-11T00:00:00Z" \
-H "X-API-Key: $CANTONCAP_API_KEY"Response
200 Asset quote collection.
{
"status": {
"timestamp": "2026-10-11T14:00:00.000Z",
"elapsed_ms": 18,
"error_code": 0,
"error_message": null,
"request_id": "req_7Hk2pQ9xLm"
},
"data": [
{
"asset_id": "ast_515c3eaa72bd4a8b9403297879d78ef6",
"convert": "USD",
"interval": "1h",
"points": [
{
"timestamp": "2026-10-11T13:59:12.000Z",
"price": "0.1584",
"market_cap": null,
"fdv": "715482911.36",
"volume_24h": "1840221.55",
"last_updated_at": "2026-10-11T14:00:00.000Z"
}
]
}
],
"pagination": {
"next_cursor": "eyJ2IjoxLCJvIjoyNX0"
}
}dataarray of objects10 child fields
asset_idstringStable opaque CantonCap asset ID, prefixed
ast_.convertstringConversion currency of the values.
intervalenumSampling interval of the series.
pointsarray of objectsPoints, newest first. Empty intervals are omitted, never filled.
6 child fields
timestampdate-timeUTC instant the sampled quote was calculated. Its price and FDV are valued at this instant, and the sampling interval and time range apply to it.
pricedecimal stringExact reference price in the requested currency at
timestamp.market_capdecimal stringnullableNull for every asset today: no reviewed circulating-supply methodology exists. FDV is never substituted for it.
fdvdecimal stringnullableFully diluted valuation: price times the reported total supply. Null when the supply is missing, stale or withheld; unavailable is never zero.
volume_24hdecimal stringnullableRolling 24-hour volume in the conversion currency. Null when unavailable.
last_updated_atdate-timeWhen the sampled quote was recorded.
paginationobjectPresent on cursor-paginated collections.
1 child field
next_cursorstringnullableOpaque cursor for the next page, or null on the last page.
Headers
X-RateLimit-LimitRequests allowed in the current one-minute window.X-RateLimit-RemainingRequests left in the window.X-RateLimit-ResetUnix time, in seconds, when the window resets.ETagEntity tag of this representation. Send it back in If-None-Match.Cache-Controlprivate, no-cache: shared caches must not store the answer.VaryX-API-Key: the answer varies by key.
Errors
| Status | Code | When |
|---|---|---|
| 400 | invalid_request | Request validation failedA parameter is malformed, out of bounds or not one of its allowed values. |
| 400 | invalid_request | Invalid cursorThe cursor is malformed or belongs to a different query. Some endpoints name it more precisely, such as Invalid historical range or cursor. |
| 401 | unauthenticated | A valid API key is requiredX-API-Key is missing or unknown. |
| 403 | forbidden | The API key does not resolve to an active planThe key expired, was suspended or has not started. |
| 403 | quota_exceeded | The requested page exceeds the API plan limitAn explicit limit is above the plan's page size. |
| 403 | quota_exceeded | The requested history exceeds the API plan limitThe range reaches further back than the plan's history depth. |
| 422 | unsupported_capability | The historical request exceeds the supported input boundThe range and ID list together read more observations than one request supports. |
| 429 | rate_limited | The request rate limit was exceededThe key's one-minute window is used up. Retry after Retry-After seconds. |
Get aggregate asset OHLCV candles
https://api.cantoncap.cc/v1/assets/ohlcv/historicalClosed CantonCap bars built by background workers from reference-price observations and served from storage; no candle is calculated at request time. OHLC prices are in convert; volume and volume_usd are always the USD notional of the asset's observed public trades across its markets, with volume_coverage separating a verified zero from a partial subtotal or an unavailable measurement. A projection that is not yet published, is behind the requested range or was invalidated by a publication-policy change returns a retryable 503 source_unavailable. Cursors from earlier releases return 400 invalid_request.
Parameters
idsstringqueryrequiredOne to 100 distinct stable CantonCap asset IDs, comma-separated. Unknown and unpublished IDs are omitted without revealing private records.
convertstringqueryoptionalOne ISO-style quote currency code, or a comma-delimited set where the operation explicitly documents a bounded collection.
intervalenumqueryoptionalUTC-aligned candle duration or historical quote sampling interval. Results are newest first; missing buckets are omitted. Quote sampling selects the latest eligible measurement in each interval.
time_startdate-timequeryoptionalInclusive UTC range start; defaults to 24 hours before time_end. At most 31 days per request, further bounded by plan history depth.
time_enddate-timequeryoptionalExclusive UTC range end; defaults to request time and is pinned by continuation cursors.
limitintegerqueryoptionalMaximum page size, bounded by the caller's plan.
cursorstringqueryoptionalOpaque continuation cursor from the previous response.
Request
curl -s "https://api.cantoncap.cc/v1/assets/ohlcv/historical?ids=ast_515c3eaa72bd4a8b9403297879d78ef6&convert=USD&interval=1h&limit=24" \
-H "X-API-Key: $CANTONCAP_API_KEY"Response
200 Candle collection.
{
"status": {
"timestamp": "2026-10-11T14:00:00.000Z",
"elapsed_ms": 18,
"error_code": 0,
"error_message": null,
"request_id": "req_7Hk2pQ9xLm"
},
"data": [
{
"last_updated_at": "2026-10-11T14:00:00.000Z",
"asset_id": "ast_515c3eaa72bd4a8b9403297879d78ef6",
"convert": "USD",
"interval": "1h",
"open_time": "2026-10-11T13:00:00.000Z",
"close_time": "2026-10-11T14:00:00.000Z",
"open": "0.1561",
"high": "0.1602",
"low": "0.1549",
"close": "0.1584",
"volume": "1840221.55",
"volume_usd": "1840221.55",
"volume_coverage": "complete",
"trade_count": 1284,
"volume_method": "observed_trades",
"complete": true
}
],
"pagination": {
"next_cursor": "eyJ2IjoxLCJvIjoyNX0"
}
}dataarray of objects16 child fields
last_updated_atdate-timeTime of the latest represented update. For calculated asset prices it is the stored calculation time. Decide acceptable age from it.
asset_idstringStable opaque CantonCap asset ID, prefixed
ast_.convertstringConversion currency of the values.
intervalenumSampling interval of the series.
open_timedate-timeStart of the period, inclusive, UTC.
close_timedate-timeEnd of the period, exclusive, UTC.
opendecimal stringFirst price in the period.
highdecimal stringHighest price in the period.
lowdecimal stringLowest price in the period.
closedecimal stringLast price in the period.
volumedecimal stringnullableUSD notional of the asset's observed public trades in the window, whatever
convertis; the same value as volume_usd. Null when no eligible USD measurement exists.volume_usddecimal stringnullableoptionalExact USD notional of the asset's observed public trades across its markets in the window. Each distinct trade is valued once, at its own execution time, with a CCXT-anchored USD reference observed by then and at most 180 seconds older; a trade without an eligible conversion is excluded and reported through volume_coverage. Venue-reported totals are never added. Null when no eligible USD measurement exists.
volume_coverageenumoptionalcomplete: eligible collection windows cover the whole interval for every eligible market and every observed trade was valued, so a zero is verified trading absence. partial: a covered subtotal, because a market lacks full interval coverage or a trade had no eligible USD conversion. unavailable: volume_usd is null.
trade_countintegernullableDistinct eligible trades across the asset's covered markets in the window, including trades excluded from volume_usd for lack of a conversion.
volume_methodenumobserved_trades when the asset has at least one market with public trade evidence; none otherwise.
completebooleanTrue once the period has ended. A complete period can still be corrected later.
paginationobjectPresent on cursor-paginated collections.
1 child field
next_cursorstringnullableOpaque cursor for the next page, or null on the last page.
Headers
X-RateLimit-LimitRequests allowed in the current one-minute window.X-RateLimit-RemainingRequests left in the window.X-RateLimit-ResetUnix time, in seconds, when the window resets.Cache-Controlprivate, no-cache: shared caches must not store the answer.VaryX-API-Key: the answer varies by key.
Errors
| Status | Code | When |
|---|---|---|
| 400 | invalid_request | Request validation failedA parameter is malformed, out of bounds or not one of its allowed values. |
| 400 | invalid_request | Invalid cursorThe cursor is malformed or belongs to a different query. Some endpoints name it more precisely, such as Invalid historical range or cursor. |
| 401 | unauthenticated | A valid API key is requiredX-API-Key is missing or unknown. |
| 403 | forbidden | The API key does not resolve to an active planThe key expired, was suspended or has not started. |
| 403 | quota_exceeded | The requested page exceeds the API plan limitAn explicit limit is above the plan's page size. |
| 403 | quota_exceeded | The requested history exceeds the API plan limitThe range reaches further back than the plan's history depth. |
| 429 | rate_limited | The request rate limit was exceededThe key's one-minute window is used up. Retry after Retry-After seconds. |
| 503 | source_unavailable | Stored candles are temporarily unavailableThe candle projection is not yet published, is behind the range, or was invalidated. Retryable. |
Get price, FDV, market-cap, and volume series for one asset
https://api.cantoncap.cc/v1/assets/{asset_id}/market-chartNewest-first chart series of one asset, sampled from the same quotes as GET /v1/assets/quotes/historical: for the same asset, currency, interval, range and page size, every page holds the same points with the same timestamp, price, market_cap and fdv, and volume is that endpoint's volume_24h (rolling 24-hour volume, not interval volume). A point's timestamp is the instant its quote was calculated, when its price and fdv are valued. fdv follows the same rules: the exact product of price and the total supply known at timestamp, null when that supply was missing, stale, not calculated or is no longer published to the caller, and never revalued by later observations. market_cap is null. last_updated_at is the newest point's timestamp on the page.
Every page re-applies current publication controls, and a continuation cursor pins the query and the quotes retained before its first page. A request with no published point on the requested page returns 404 without saying why: an unknown or unpublished asset, a range without quotes, or a continuation whose remaining quotes were withdrawn. A range spans at most 31 days, further bounded by plan history depth.
Parameters
asset_idstringpathrequiredStable opaque CantonCap asset ID.
convertstringqueryoptionalOne ISO-style quote currency code, or a comma-delimited set where the operation explicitly documents a bounded collection.
intervalenumqueryoptionalUTC-aligned candle duration or historical quote sampling interval. Results are newest first; missing buckets are omitted. Quote sampling selects the latest eligible measurement in each interval.
time_startdate-timequeryoptionalInclusive UTC range start; defaults to 24 hours before time_end. At most 31 days per request, further bounded by plan history depth.
time_enddate-timequeryoptionalExclusive UTC range end; defaults to request time and is pinned by continuation cursors.
limitintegerqueryoptionalMaximum page size, bounded by the caller's plan.
cursorstringqueryoptionalOpaque continuation cursor from the previous response.
Request
curl -s "https://api.cantoncap.cc/v1/assets/ast_515c3eaa72bd4a8b9403297879d78ef6/market-chart?convert=USD&interval=1h" \
-H "X-API-Key: $CANTONCAP_API_KEY"Response
200 Chart-ready asset series.
{
"status": {
"timestamp": "2026-10-11T14:00:00.000Z",
"elapsed_ms": 18,
"error_code": 0,
"error_message": null,
"request_id": "req_7Hk2pQ9xLm"
},
"data": {
"asset_id": "ast_515c3eaa72bd4a8b9403297879d78ef6",
"convert": "USD",
"points": [
{
"timestamp": "2026-10-11T13:59:12.000Z",
"price": "0.1584",
"market_cap": null,
"fdv": "715482911.36",
"volume": "1840221.55"
}
],
"last_updated_at": "2026-10-11T14:00:00.000Z"
},
"pagination": {
"next_cursor": "eyJ2IjoxLCJvIjoyNX0"
}
}dataobject9 child fields
asset_idstringStable opaque CantonCap asset ID, prefixed
ast_.convertstringConversion currency of the values.
pointsarray of objectsPoints, newest first. Empty intervals are omitted, never filled.
5 child fields
timestampdate-timeUTC instant the sampled quote was calculated; price and FDV are valued at it.
pricedecimal stringnullablePrice as an exact decimal string.
market_capdecimal stringnullableNull for every asset today: no reviewed circulating-supply methodology exists. FDV is never substituted for it.
fdvdecimal stringnullableFully diluted valuation: price times the reported total supply. Null when the supply is missing, stale or withheld; unavailable is never zero.
volumedecimal stringnullable
last_updated_atstringnullableThe newest point's
timestampon this page.
paginationobjectPresent on cursor-paginated collections.
1 child field
next_cursorstringnullableOpaque cursor for the next page, or null on the last page.
Headers
X-RateLimit-LimitRequests allowed in the current one-minute window.X-RateLimit-RemainingRequests left in the window.X-RateLimit-ResetUnix time, in seconds, when the window resets.Cache-Controlprivate, no-cache: shared caches must not store the answer.VaryX-API-Key: the answer varies by key.
Errors
| Status | Code | When |
|---|---|---|
| 400 | invalid_request | Request validation failedA parameter is malformed, out of bounds or not one of its allowed values. |
| 400 | invalid_request | Invalid cursorThe cursor is malformed or belongs to a different query. Some endpoints name it more precisely, such as Invalid historical range or cursor. |
| 401 | unauthenticated | A valid API key is requiredX-API-Key is missing or unknown. |
| 403 | forbidden | The API key does not resolve to an active planThe key expired, was suspended or has not started. |
| 403 | quota_exceeded | The requested page exceeds the API plan limitAn explicit limit is above the plan's page size. |
| 403 | quota_exceeded | The requested history exceeds the API plan limitThe range reaches further back than the plan's history depth. |
| 404 | not_found | Market chart not foundNo published point on the requested page: an unknown asset, a range without quotes, or a continuation whose quotes were withdrawn. |
| 422 | unsupported_capability | The historical request exceeds the supported input boundThe range reads more observations than one request supports. |
| 429 | rate_limited | The request rate limit was exceededThe key's one-minute window is used up. Retry after Retry-After seconds. |
Get the reported total supply history of one asset
https://api.cantoncap.cc/v1/assets/{asset_id}/supply/historicalNewest-first sampled history of the total supply that the Digital Asset registry reports for one asset. Each point contains only supply, the exact retained decimal, and timestamp, the UTC instant at which the registry reports that supply applies (its as-of time). Ingestion times, provenance and freshness evidence stay internal.
Intervals are UTC and epoch-aligned, and 7d/1w intervals start on Monday 00:00 UTC. An interval contains the timestamps from its start, inclusive, to its end, exclusive; time_start is inclusive and time_end exclusive on the same timestamp. Each interval with at least one eligible observation returns the observation with the latest timestamp. When several observations report the same timestamp, the most recently retained revision (a correction or replay) is returned, and identical observation times fall back to retention order, so results are deterministic. Supply changes inside one interval are represented by its last value only; request a smaller interval to see more of them.
Intervals without an eligible observation are omitted: no zero, carried-forward or interpolated value is invented. An empty points array means no eligible observation in the range, not a zero supply; repeated unchanged observations appear as one point per interval with the same supply. This is not a complete mint/burn history, circulating supply or maximum supply. An observation whose as-of time is later than its own observation time is not published. A point reports the latest retained revision of its as-of time, not what was known at that time.
Only registry observations of an active asset approved under the registrar's current publication policy are published, with the asset's own publication. The asset must be published to the caller, otherwise the response is 404 without revealing whether it exists. Every page re-applies the current policy, so a revocation or opt-out withdraws points on the next page. A continuation cursor pins the asset, interval, range and observation boundary of its first page: observations, corrections and late observations retained afterwards never enter that traversal, so pages never duplicate, omit or reorder the selected history. A range spans at most 31 days; a request reading more than 100,000 eligible observations is rejected as unsupported.
Parameters
asset_idstringpathrequiredStable opaque CantonCap asset ID.
intervalenumqueryoptionalUTC-aligned sampling interval of the supply as-of timestamp. Results are newest first; intervals without an eligible observation are omitted.
time_startdate-timequeryoptionalInclusive UTC start of the supply as-of range; defaults to 24 hours before time_end. At most 31 days per request, further bounded by plan history depth.
time_enddate-timequeryoptionalExclusive UTC end of the supply as-of range; defaults to request time and is pinned by continuation cursors.
limitintegerqueryoptionalMaximum number of points per page, bounded by the caller's plan.
cursorstringqueryoptionalOpaque continuation cursor from the previous response. It must be used with the same asset, interval and range.
Request
curl -s "https://api.cantoncap.cc/v1/assets/ast_515c3eaa72bd4a8b9403297879d78ef6/supply/historical?interval=1d&time_start=2026-10-01T00:00:00Z&time_end=2026-10-11T00:00:00Z" \
-H "X-API-Key: $CANTONCAP_API_KEY"Response
200 Sampled reported total-supply history of one asset.
{
"status": {
"timestamp": "2026-10-11T14:00:00.000Z",
"elapsed_ms": 18,
"error_code": 0,
"error_message": null,
"request_id": "req_7Hk2pQ9xLm"
},
"data": {
"asset_id": "ast_515c3eaa72bd4a8b9403297879d78ef6",
"interval": "1h",
"points": [
{
"supply": "4517356203.5",
"timestamp": "2026-10-11T13:59:12.000Z"
}
]
},
"pagination": {
"next_cursor": "eyJ2IjoxLCJvIjoyNX0"
}
}dataobject5 child fields
asset_idstringStable opaque CantonCap asset ID, prefixed
ast_.intervalenumSampling interval of the series.
pointsarray of objectsNewest first, one point per populated interval; empty intervals are omitted.
2 child fields
supplydecimal stringExact reported total supply as retained; never rounded, rescaled or interpolated.
timestampdate-timeUTC instant at which the source reports that this supply applies (the retained supply as-of time).
paginationobjectPresent on cursor-paginated collections.
1 child field
next_cursorstringnullableOpaque cursor for the next page, or null on the last page.
Headers
X-RateLimit-LimitRequests allowed in the current one-minute window.X-RateLimit-RemainingRequests left in the window.X-RateLimit-ResetUnix time, in seconds, when the window resets.Cache-Controlprivate, no-cache: shared caches must not store the answer.VaryX-API-Key: the answer varies by key.
Errors
| Status | Code | When |
|---|---|---|
| 400 | invalid_request | Request validation failedA parameter is malformed, out of bounds or not one of its allowed values. |
| 400 | invalid_request | Invalid cursorThe cursor is malformed or belongs to a different query. Some endpoints name it more precisely, such as Invalid historical range or cursor. |
| 401 | unauthenticated | A valid API key is requiredX-API-Key is missing or unknown. |
| 403 | forbidden | The API key does not resolve to an active planThe key expired, was suspended or has not started. |
| 403 | quota_exceeded | The requested page exceeds the API plan limitAn explicit limit is above the plan's page size. |
| 403 | quota_exceeded | The requested history exceeds the API plan limitThe range reaches further back than the plan's history depth. |
| 404 | not_found | Asset not foundThe asset does not exist or is not published. |
| 422 | unsupported_capability | The historical request exceeds the supported input boundThe range reads more than 100,000 eligible observations. |
| 429 | rate_limited | The request rate limit was exceededThe key's one-minute window is used up. Retry after Retry-After seconds. |
Get market pairs with current price, volume, and liquidity
https://api.cantoncap.cc/v1/assets/market-pairs/latestParameters
idsstringqueryrequiredOne to 100 distinct stable CantonCap asset IDs, comma-separated. Unknown and unpublished IDs are omitted without revealing private records.
venue_idenumqueryoptionalOnly markets or pools of this venue.
orientationenumqueryoptionalmarket returns each pair in the venue market's orientation. requested returns each pair from the requested assets' side, like a reversed order on a DEX pair feed - a pair whose quote is one of ids, and whose base is not, comes back inverted (orientation inverted) with base and quote swapped, ticker.price as 1 / price, base and quote volumes swapped, and bid and ask depth swapped. USD volume, liquidity, spread, score and activity_24h are the market's either way.
networkenumqueryoptionalCanton network to read.
modelenumqueryoptionalOnly markets of this market model.
categoryenumqueryoptionalOnly markets of this display category.
quote_asset_idstringqueryoptionalOnly markets quoted in this asset.
limitintegerqueryoptionalMaximum page size, bounded by the caller's plan.
cursorstringqueryoptionalOpaque continuation cursor from the previous response.
If-None-MatchstringheaderoptionalReturn 304 when this entity tag matches the current representation.
Request
curl -s "https://api.cantoncap.cc/v1/assets/market-pairs/latest?ids=ast_515c3eaa72bd4a8b9403297879d78ef6&limit=20" \
-H "X-API-Key: $CANTONCAP_API_KEY"Response
200 Market collection. 304 when If-None-Match matches.
{
"status": {
"timestamp": "2026-10-11T14:00:00.000Z",
"elapsed_ms": 18,
"error_code": 0,
"error_message": null,
"request_id": "req_7Hk2pQ9xLm"
},
"data": [
{
"market_category": "orderbook",
"market_id": "mkt_4c2e9a7f1b3d4e5a9c8b7d6e5f4a3b21",
"venue": {
"venue_id": "temple",
"name": "Canton Coin"
},
"network": "mainnet",
"orientation": "market",
"base_asset": {
"asset_id": "ast_515c3eaa72bd4a8b9403297879d78ef6",
"name": "Canton Coin",
"symbol": "CC"
},
"quote_asset": {
"asset_id": "ast_515c3eaa72bd4a8b9403297879d78ef6",
"name": "Canton Coin",
"symbol": "CC"
},
"market_model": "order_book",
"status": "active",
"pool_ids": [
"pool_3e7c1a9b5d2f4c6e8a0b1d3f5e7c9a12"
],
"ticker": {
"price": "0.1584",
"price_usd": "1.25",
"price_origin": "venue_book",
"volume_base_24h": "8342210.4",
"volume_quote_24h": "1320455.18",
"volume_usd_24h": "1320455.18",
"last_updated_at": "2026-10-11T14:00:00.000Z"
},
"liquidity": {
"model": "order_book",
"liquidity_score": 82.4,
"liquidity_score_methodology": "execution-impact-v1",
"liquidity_score_updated_at": "2026-10-11T13:55:00.000Z",
"bid_depth_2pct_usd": "182400.55",
"ask_depth_2pct_usd": "176920.30",
"spread_bps": "18.9",
"depth_origin": "native_order_book",
"last_updated_at": "2026-10-11T14:00:00.000Z"
},
"last_updated_at": "2026-10-11T14:00:00.000Z"
}
],
"pagination": {
"next_cursor": "eyJ2IjoxLCJvIjoyNX0"
}
}dataarray of objects146 child fields
activity_24hobjectnullableoptionalSelected public 24-hour activity, using the same current selection as /v1/activity/market/{market_id}?window=24h&limit=1. Each measurement keeps its own as_of, methods and coverage, including retained older values. volume_usd is in USD; base and quote quantities keep their asset units. Ticker measurements remain separate source fields. Null means no eligible activity snapshot; a snapshot may itself have unknown or partial measurements. Older servers omit this field.
105 child fields
entity_kindenumKind of entity the activity describes.
entity_idstringID of the entity the activity describes.
networkenumCanton network the record belongs to.
windowenumRolling window the values cover.
as_ofstringEnd of the window the snapshot covers.
starts_atstringStart of the window the snapshot covers.
methodology_versionstringmarketsarray of objectsMarkets included in the snapshot.
5 child fields
market_idstringStable opaque CantonCap market ID, prefixed
mkt_.venue_idstringStable CantonCap venue ID, such as
templeorcantex.networkenumCanton network the record belongs to.
base_asset_idstringAsset ID of the base asset.
quote_asset_idstringAsset ID of the quote asset.
measurementsobjectEach measurement with its own value, coverage and methods.
91 child fields
volume_baseobject12 child fields
market_coverageobjectoptionalFor selected USD volume only: counts over the same eligible market population and measurement window. Older snapshots omit it. Native quantities are never relabelled as USD.
6 child fields
eligible_market_countintegerincluded_market_countintegermissing_activity_market_countintegerunvalued_market_countintegerpartial_market_countintegerincomplete_time_market_countinteger
valuedecimal stringnullableThe measured value as an exact decimal string. Null when unavailable; never zero for unknown.
completenessenumcomplete,partialorunknown.covered_secondsnumberSeconds of the window the observations cover.
methodsarray of stringsMethods behind the value.
as_ofstringoptionalEnd of the window this value covers. Equals the snapshot as_of, except in a current read (no time_start or time_end, limit 1): when the newest snapshot has no value for this measurement, the latest usable value is kept with its own earlier as_of, coverage and methods. It is the window total at that time, not a complete current window.
volume_quoteobject12 child fields
market_coverageobjectoptionalFor selected USD volume only: counts over the same eligible market population and measurement window. Older snapshots omit it. Native quantities are never relabelled as USD.
6 child fields
eligible_market_countintegerincluded_market_countintegermissing_activity_market_countintegerunvalued_market_countintegerpartial_market_countintegerincomplete_time_market_countinteger
valuedecimal stringnullableThe measured value as an exact decimal string. Null when unavailable; never zero for unknown.
completenessenumcomplete,partialorunknown.covered_secondsnumberSeconds of the window the observations cover.
methodsarray of stringsMethods behind the value.
as_ofstringoptionalEnd of the window this value covers. Equals the snapshot as_of, except in a current read (no time_start or time_end, limit 1): when the newest snapshot has no value for this measurement, the latest usable value is kept with its own earlier as_of, coverage and methods. It is the window total at that time, not a complete current window.
volume_nativeobject12 child fields
market_coverageobjectoptionalFor selected USD volume only: counts over the same eligible market population and measurement window. Older snapshots omit it. Native quantities are never relabelled as USD.
6 child fields
eligible_market_countintegerincluded_market_countintegermissing_activity_market_countintegerunvalued_market_countintegerpartial_market_countintegerincomplete_time_market_countinteger
valuedecimal stringnullableThe measured value as an exact decimal string. Null when unavailable; never zero for unknown.
completenessenumcomplete,partialorunknown.covered_secondsnumberSeconds of the window the observations cover.
methodsarray of stringsMethods behind the value.
as_ofstringoptionalEnd of the window this value covers. Equals the snapshot as_of, except in a current read (no time_start or time_end, limit 1): when the newest snapshot has no value for this measurement, the latest usable value is kept with its own earlier as_of, coverage and methods. It is the window total at that time, not a complete current window.
volume_usd_reportedobject12 child fields
market_coverageobjectoptionalFor selected USD volume only: counts over the same eligible market population and measurement window. Older snapshots omit it. Native quantities are never relabelled as USD.
6 child fields
eligible_market_countintegerincluded_market_countintegermissing_activity_market_countintegerunvalued_market_countintegerpartial_market_countintegerincomplete_time_market_countinteger
valuedecimal stringnullableUSD volume as the venues report it.
completenessenumcomplete,partialorunknown.covered_secondsnumberSeconds of the window the observations cover.
methodsarray of stringsMethods behind the value.
as_ofstringoptionalEnd of the window this value covers. Equals the snapshot as_of, except in a current read (no time_start or time_end, limit 1): when the newest snapshot has no value for this measurement, the latest usable value is kept with its own earlier as_of, coverage and methods. It is the window total at that time, not a complete current window.
volume_usd_derivedobject12 child fields
market_coverageobjectoptionalFor selected USD volume only: counts over the same eligible market population and measurement window. Older snapshots omit it. Native quantities are never relabelled as USD.
6 child fields
eligible_market_countintegerincluded_market_countintegermissing_activity_market_countintegerunvalued_market_countintegerpartial_market_countintegerincomplete_time_market_countinteger
valuedecimal stringnullableUSD volume derived with CCXT exchange prices, kept separate from the reported figure.
completenessenumcomplete,partialorunknown.covered_secondsnumberSeconds of the window the observations cover.
methodsarray of stringsMethods behind the value.
as_ofstringoptionalEnd of the window this value covers. Equals the snapshot as_of, except in a current read (no time_start or time_end, limit 1): when the newest snapshot has no value for this measurement, the latest usable value is kept with its own earlier as_of, coverage and methods. It is the window total at that time, not a complete current window.
volume_usdobject12 child fields
market_coverageobjectoptionalFor selected USD volume only: counts over the same eligible market population and measurement window. Older snapshots omit it. Native quantities are never relabelled as USD.
6 child fields
eligible_market_countintegerincluded_market_countintegermissing_activity_market_countintegerunvalued_market_countintegerpartial_market_countintegerincomplete_time_market_countinteger
valuedecimal stringnullableThe measured value as an exact decimal string. Null when unavailable; never zero for unknown.
completenessenumcomplete,partialorunknown.covered_secondsnumberSeconds of the window the observations cover.
methodsarray of stringsMethods behind the value.
as_ofstringoptionalEnd of the window this value covers. Equals the snapshot as_of, except in a current read (no time_start or time_end, limit 1): when the newest snapshot has no value for this measurement, the latest usable value is kept with its own earlier as_of, coverage and methods. It is the window total at that time, not a complete current window.
execution_countobject12 child fields
market_coverageobjectoptionalFor selected USD volume only: counts over the same eligible market population and measurement window. Older snapshots omit it. Native quantities are never relabelled as USD.
6 child fields
eligible_market_countintegerincluded_market_countintegermissing_activity_market_countintegerunvalued_market_countintegerpartial_market_countintegerincomplete_time_market_countinteger
valuedecimal stringnullableThe measured value as an exact decimal string. Null when unavailable; never zero for unknown.
completenessenumcomplete,partialorunknown.covered_secondsnumberSeconds of the window the observations cover.
methodsarray of stringsMethods behind the value.
as_ofstringoptionalEnd of the window this value covers. Equals the snapshot as_of, except in a current read (no time_start or time_end, limit 1): when the newest snapshot has no value for this measurement, the latest usable value is kept with its own earlier as_of, coverage and methods. It is the window total at that time, not a complete current window.
market_categoryenumoptionalDisplay category of the market.
market_idstringStable opaque CantonCap market ID, prefixed
mkt_.venueobject2 child fields
venue_idstringStable CantonCap venue ID, such as
templeorcantex.namestringDisplay name. Null when none is published.
networkenumCanton network the record belongs to.
orientationenumoptionalmarket: base_asset and quote_asset are the venue market's. inverted: they are swapped (orientation=requested and a requested asset is the market's quote), so the ticker's price, base and quote volumes, and bid and ask depth are the market's read from the other side. activity_24h keeps the market's orientation. Older servers omit this field.
base_assetobject3 child fields
asset_idstringStable opaque CantonCap asset ID, prefixed
ast_.namestringnullableDisplay name. Null when none is published.
symbolstringnullableTicker symbol. Null when none is published.
quote_assetobject3 child fields
asset_idstringStable opaque CantonCap asset ID, prefixed
ast_.namestringnullableDisplay name. Null when none is published.
symbolstringnullableTicker symbol. Null when none is published.
market_modelenumHow the market trades:
amm,order_book,order_book_rfqorhybrid.statusenumLifecycle status of the record.
pool_idsarray of stringsPool IDs behind this market.
tickerobjectnullableLatest ticker of the market. Null when none is available.
7 child fields
pricedecimal stringnullablePrice in quote-asset units per base asset.
price_usddecimal stringnullableoptionalUSD price of one unit of the base asset as returned, through the quote asset's latest USD reference price: price × the quote's USD price, or for an inverted pair the original base's USD price ÷ the market's price, in exact decimals truncated to 38 places. Null when the quote has no USD reference price or the pair has no price. Older servers omit this field.
price_originenumWhere the ticker price comes from.
volume_base_24hdecimal stringnullable24-hour volume in base-asset units.
volume_quote_24hdecimal stringnullable24-hour volume in quote-asset units.
volume_usd_24hdecimal stringnullable24-hour volume in USD. Null when unavailable.
last_updated_atdate-timeTime of the latest represented update. For calculated asset prices it is the stored calculation time. Decide acceptable age from it.
liquidityobjectnullableLiquidity of the asset's markets, in USD and outside any conversion.
12 child fields
modelenumliquidity_scorenumbernullableoptionalDisplayed liquidity score, 0 to 100. Simulated buys and sells at $100, $500, $1,000, $5,000 and $10,000; fees excluded. Null means insufficient inputs, never a hidden market.
liquidity_score_methodologyenumoptionalMethodology version of the liquidity score.
liquidity_score_updated_atdate-timenullableoptionalWhen the liquidity score was calculated.
liquidity_usddecimal stringnullableoptionalPool liquidity in USD: the value locked in the asset's eligible AMM pools.
bid_depth_2pct_usddecimal stringnullableoptionalUSD notional of total bids within 2% below the best bid. Null when the book window or USD conversion is unavailable.
ask_depth_2pct_usddecimal stringnullableoptionalUSD notional of total asks within 2% above the best ask. Null when the book window or USD conversion is unavailable.
depth_originenumoptionalDepth is measured from displayed order-book levels.
depth_unavailable_reasonenumnullableoptionalWhy a synthetic depth value is null. A measured zero is returned as 0, never as a reason.
depth_updated_atdate-timenullableoptionalWhen the stored depth was calculated.
last_updated_atdate-timeTime of the latest represented update. For calculated asset prices it is the stored calculation time. Decide acceptable age from it.
spread_bpsdecimal stringnullableoptional(Best ask - best bid) / midpoint × 10,000.
last_updated_atdate-timeTime of the latest represented update. For calculated asset prices it is the stored calculation time. Decide acceptable age from it.
paginationobjectPresent on cursor-paginated collections.
1 child field
next_cursorstringnullableOpaque cursor for the next page, or null on the last page.
Headers
X-RateLimit-LimitRequests allowed in the current one-minute window.X-RateLimit-RemainingRequests left in the window.X-RateLimit-ResetUnix time, in seconds, when the window resets.ETagEntity tag of this representation. Send it back in If-None-Match.
Errors
| Status | Code | When |
|---|---|---|
| 400 | invalid_request | Request validation failedA parameter is malformed, out of bounds or not one of its allowed values. |
| 400 | invalid_request | Invalid cursorThe cursor is malformed or belongs to a different query. Some endpoints name it more precisely, such as Invalid historical range or cursor. |
| 401 | unauthenticated | A valid API key is requiredX-API-Key is missing or unknown. |
| 403 | forbidden | The API key does not resolve to an active planThe key expired, was suspended or has not started. |
| 403 | quota_exceeded | The requested page exceeds the API plan limitAn explicit limit is above the plan's page size. |
| 422 | unsupported_capability | Related pool set exceeds the bounded response sizeThe requested assets relate to more pools than one response carries. Request fewer IDs. |
| 429 | rate_limited | The request rate limit was exceededThe key's one-minute window is used up. Retry after Retry-After seconds. |
List registry configurations for an asset
https://api.cantoncap.cc/v1/assets/{asset_id}/registry-configurationsParameters
asset_idstringpathrequiredStable opaque CantonCap asset ID.
limitintegerqueryoptionalMaximum page size, bounded by the caller's plan.
cursorstringqueryoptionalOpaque continuation cursor from the previous response.
Request
curl -s "https://api.cantoncap.cc/v1/assets/ast_515c3eaa72bd4a8b9403297879d78ef6/registry-configurations" \
-H "X-API-Key: $CANTONCAP_API_KEY"Response
200 Registry configuration page.
{
"status": {
"timestamp": "2026-10-11T14:00:00.000Z",
"elapsed_ms": 18,
"error_code": 0,
"error_message": null,
"request_id": "req_7Hk2pQ9xLm"
},
"data": {
"source_url": "https://docs.example.com/fees",
"last_checked_at": "2026-10-11T14:00:00.000Z",
"configuration_count": 1,
"complete": true,
"configurations": [
{
"configuration_id": "cfg_cc_mainnet",
"operator": "Example Operator",
"provider": "Digital Asset registry",
"registrar": "DSO::1220b1431ef217342db44d516bb9befde802be7d8899637d290895fa58880f19accc",
"default_identifier": {
"source": "Digital Asset registry",
"scheme": "canton",
"id": "cc"
},
"additional_identifiers": [
{
"source": "Digital Asset registry",
"scheme": "canton",
"id": "cc"
}
],
"issuer_requirements": [
{
"issuer": "Example Issuer",
"required_claims": [
{
"property": "website_url",
"value": "1840221.55"
}
]
}
],
"holder_requirements": [
{
"issuer": "Example Issuer",
"required_claims": [
{
"property": "website_url",
"value": "1840221.55"
}
]
}
]
}
]
},
"pagination": {
"next_cursor": "eyJ2IjoxLCJvIjoyNX0"
}
}dataobjectnullable27 child fields
source_urlURI stringlast_checked_atstringWhen availability was last checked.
configuration_countintegercompletebooleanTrue once the period has ended. A complete period can still be corrected later.
configurationsarray of objects22 child fields
configuration_idstringoperatorstringproviderstringregistrarstringdefault_identifierobject3 child fields
sourcestringschemestringidstring
additional_identifiersarray of objects3 child fields
sourcestringschemestringidstring
issuer_requirementsarray of objects4 child fields
issuerstringrequired_claimsarray of objects2 child fields
propertystringvaluestringThe measured value as an exact decimal string. Null when unavailable; never zero for unknown.
holder_requirementsarray of objects4 child fields
issuerstringrequired_claimsarray of objects2 child fields
propertystringvaluestringThe measured value as an exact decimal string. Null when unavailable; never zero for unknown.
paginationobjectPresent on cursor-paginated collections.
1 child field
next_cursorstringnullableOpaque cursor for the next page, or null on the last page.
Headers
X-RateLimit-LimitRequests allowed in the current one-minute window.X-RateLimit-RemainingRequests left in the window.X-RateLimit-ResetUnix time, in seconds, when the window resets.
Errors
| Status | Code | When |
|---|---|---|
| 400 | invalid_request | Request validation failedA parameter is malformed, out of bounds or not one of its allowed values. |
| 400 | invalid_request | Invalid cursorThe cursor is malformed or belongs to a different query. Some endpoints name it more precisely, such as Invalid historical range or cursor. |
| 401 | unauthenticated | A valid API key is requiredX-API-Key is missing or unknown. |
| 403 | forbidden | The API key does not resolve to an active planThe key expired, was suspended or has not started. |
| 403 | quota_exceeded | The requested page exceeds the API plan limitAn explicit limit is above the plan's page size. |
| 404 | not_found | Asset not foundThe asset does not exist or is not published. |
| 429 | rate_limited | The request rate limit was exceededThe key's one-minute window is used up. Retry after Retry-After seconds. |