Canton Data Services (Beta)

REST API for Canton positions, settlements, exceptions and ledger activity.

🚧

Beta

Canton Data Services is in Beta (specification version 0.1.0). Endpoints and response fields can change as the product evolves. Real-time delivery of ledger events is planned and is not available yet.

The Canton Data Services API exposes Canton ledger data as REST resources. Reads are served from a Blockdaemon-hosted data plane built on Digital Asset's Participant Query Store (PQS), so queries do not compete with your validator for capacity.

This page covers what every endpoint has in common. The endpoint pages in this section are generated from the OpenAPI specification.

Base URL

https://svc.blockdaemon.com/data/canton/mainnet

The path pins the chain and network. Every response also carries a chainId, such as canton:mainnet, so a stored record identifies its own network without its request URL.

Tiers

The first path segment after the base URL selects a capability tier. Tiers differ in what they require of the ledger, not in quality of service.

TierPath prefixRequiresServes
Canton core/nativeNothing. Works on any Canton participant.The ledger's own event structure: updates, contracts, parties, validator rewards and dataset freshness.
Token standard/tokenAny Canton Token Standard asset (CIP-0056 or CIP-0112).Holdings, positions, allocations and transfer instructions for any compliant token, including Canton Coin.
DTCC registry/dtccThe DTCC registry Daml packages.Settled transfers, issuance, rejections, compliance delegations and party credentials.

Tiers are licensed independently. A request to a tier that is not licensed for your account is refused with 403.

Tiers are additive, not alternative. The token endpoints read the token standard's interface view, so they work the same way for DTCC securities and for Canton Coin. When the dtcc tier is also licensed, the same token endpoints add registry-specific fields. Each such field says so in its description.

The Portfolio endpoints (/portfolio/v1/...) are not gated by tier. The tiers licensed for your account decide what their responses contain.

Authentication

The specification lists two authentication schemes. Send one of them with every request:

SchemeHow to send it
JWT bearer tokenAuthorization: Bearer <access_token>. The token is an OAuth2 client-credentials token issued for the Ledger API audience.
Blockdaemon API keyX-API-Key: <api_key>

For how Blockdaemon API keys are issued and managed, see Authentication.

The one exception is GET /native/health, which does not need a caller credential.

Party scoping

Every response is scoped to the parties your credential is allowed to read. The same deployment can therefore serve several clients, each seeing only its own data. If a query returns nothing for a party you expect to see, check that your credential can read as that party. GET /native/parties reports the read and act rights your credential holds on each party.

Ledger offsets and freshness

A ledger offset is a position in the ledger. It is returned as a string and is opaque: compare and order offsets, but never do arithmetic on them or assume they increase by one.

  • GET /token/positions returns the offset the result is as of, in the X-Ledger-Offset response header and as asOfOffset on each row. Rows in one response share the same offset.
  • GET /native/health returns ledgerOffset and latestEventAt, the commit time of the newest event available to query. The gap between latestEventAt and the current time is the staleness of everything the API returns.
  • GET /native/updates accepts ledgerOffset[gt], which resumes a feed after the highest offset you have processed.

Offsets are local to one participant. The same transaction has a different offset on a different participant, so never compare raw offsets across networks or deployments.

Pagination and sorting

List endpoints use cursor-based pagination.

ParameterDescription
limitRecords per page, from 1 to 100. The default is 20.
pageTokenOpaque cursor. Pass the pagination.nextPageToken value from the previous response. Omit it for the first page.
sortOrdering as field:direction. Support varies by endpoint. For example, /token/positions sorts by partyId or instrumentId, and several list endpoints accept only createdAt:asc. An unsupported value returns 400, so omit sort unless you need a specific order.

pagination.nextPageToken is absent on the last page. pagination.totalCount is present only on endpoints that can compute it cheaply. Treat pageToken as a black box and do not construct or edit one.

Date filters take ISO 8601 timestamps and use bracket syntax, such as settledAt[gte] and settledAt[lte]. Most HTTP clients need these brackets URL-encoded or escaped.

Conventions

ConceptConvention
Response envelopeList endpoints return data, pagination and requestId.
Party identifierALIAS::FINGERPRINT. Compare the whole string, never the alias alone.
Contract identifierLowercase hexadecimal string.
Instrument identifierOpaque key. On the DTCC tier it is the registrar's own scheme. Do not parse it.
QuantitiesReported three ways: amount, the raw unscaled integer as a string; amountFormatted, the same value with its decimal point applied; and decimals, the scale. Use amount for arithmetic and amountFormatted for display. Quantities are never JSON numbers.
TimestampsISO 8601 in UTC with millisecond precision. They record when the ledger committed the event, not when the API observed it.
Record statusopen means the record is in force. closed means a later event superseded it. Records are never deleted, so closed records stay queryable.

Errors

Error responses share one shape:

{
  "error": {
    "code": "invalid_parameter",
    "message": "Parameter `limit` must be between 1 and 100.",
    "details": { "parameter": "limit" }
  },
  "requestId": "9c1e7b04-5d38-4f62-a917-3b6c8d2e5f01"
}
StatusMeaningAction
400A query parameter is missing or malformed.Correct the request. The details field names the parameter.
401The credential is missing, expired or invalid.Obtain a fresh token.
403The credential is valid but the tier is not licensed, or it cannot read as the requested party.Check your licensed tiers and party rights.
429Rate limit exceeded.Wait for the window to reset, then retry.
500Unexpected server error.Retry with backoff. Quote the requestId if it persists.
503The dataset cannot be served at the moment.Retry with backoff.

Every response carries an X-Request-Id header and the same value as requestId in the body. Quote it when you contact support.

Rate limits and compute units

Requests are rate limited. Responses can carry the X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset headers. X-RateLimit-Reset is a Unix timestamp in seconds. See Rate Limits.

Each endpoint costs between 0 and 2 compute units (CU). A fixed endpoint has a set CU cost. A paginated endpoint is billed based on the number of items returned per page. See Compute Units for how CUs are billed.

EndpointCUType
GET /native/health0Fixed
GET /native/parties1Paginated
GET /native/validator-rewards1Paginated
GET /native/updates2Paginated
GET /native/contracts2Paginated
GET /token/positions2Paginated
GET /token/holdings1Paginated
GET /token/allocations1Paginated
GET /token/transfer-instructions1Paginated
GET /dtcc/transfers1Paginated
GET /dtcc/rejections1Paginated
GET /dtcc/supply-events1Paginated
GET /dtcc/issuance-requests1Paginated
GET /dtcc/parties1Paginated
GET /dtcc/compliance-delegations1Paginated
GET /dtcc/registrars/{registrarPartyId}/registry/metadata/v1/instruments (not yet available)1Paginated
GET /dtcc/registrars/{registrarPartyId}/registry/metadata/v1/instruments/{instrumentId} (not yet available)1Fixed
GET /portfolio/v1/{address}/balance1Fixed
GET /portfolio/v1/{address}/transactions1Paginated

CU costs are subject to change during the Beta.

Not available yet

  • Real-time delivery. Event notifications are planned. Until they are available, poll GET /native/updates with ledgerOffset[gt]. See Audit & Incremental Sync.
  • Instrument reference data. The two /dtcc/registrars/{registrarPartyId}/registry/metadata/v1/instruments endpoints are in the specification but are not served yet.

Next steps