ccledger Community API
A non-custodial records and payments API for Canton Network. The on-chain record actions attest and mint are fully live: each writes an immutable record on Canton MainNet and returns an on-chain proof (contract ID, update/transaction ID, ledger offset). Mutual attestation (attest-mutual) is live: it returns pending_signature with the proposal's proof and flips to confirmed when the attestor accepts from their own wallet. On-chain value movement runs through the delegated facilitation flow (plain sender-signed CC transfers only), where you sign from your own wallet and ccledger relays as the application provider — live now.
Built by Blueprint, a Hivemind Capital Partners ecosystem company. Blueprint operates a Canton Network validator on Global MainNet. ccledger is non-custodial, enforced in code: prepaid CC is a non-refundable service credit (“fee credits”) that pays per-action fees only and never funds on-chain value movement — there is no withdrawal endpoint. No validator, no Daml, no keys held by us. Every API key includes 50 trial record actions — top up fee credits for paid tier at 100 RPM. Hold CCL for discount.
Why Use ccledger
- Immutable on-chain records, no gas fees — Attest, co-sign mutual attestations, and record issuance on Canton MainNet with one call. No wallet to wire up, no gas fees. 50 trial record actions included with every API key (max 25/day). Top up fee credits for paid tier at 100 RPM (2.0 CC fee per record action, 5.0 CC fee for mutual attestation). Hold CCL for discount.
- Non-custodial value movement (live) — Fee credits never fund value movement. On-chain CC moves from your own wallet via the delegated facilitation flow (transfers only) — you sign a
CreateTransferCommand, ccledger relays it as the application provider over Splice’s audited Amulet and Canton Token Standard contracts. - On-chain proof — Every response includes contract ID, update/transaction ID, ledger offset, synchronizer ID, and effective timestamp. A verifiable on-chain record — look it up on any Canton participant.
- Canton Network MainNet — Not a testnet or simulation. Your transactions and records exist on the same global synchronization domain used by major financial institutions.
- Self-service registration — One POST request returns an API key instantly. No approval process, no KYC, no waiting.
- Non-custodial, enforced in code — You keep your Loop wallet and keys. Prepaid CC is a non-refundable fee credit: it pays per-action fees only, never funds on-chain value movement, and cannot be withdrawn (there is no withdrawal endpoint). ccledger never holds customer CC as a spendable balance.
- Query and verify — Retrieve any past action by ID, filter by app name or type, get aggregate statistics. Full audit trail.
- No infrastructure to manage — Blueprint runs the Canton validator, token-standard integration, and database. 50 trial record actions to get started. Paid tier unlocks unlimited record throughput at 2.0 CC fee per record action (5.0 CC fee for mutual attestation). Hold CCL for discount. You just call the API.
Canton Network
Canton Network is a privacy-enabled, interoperable blockchain network designed for institutional use. Unlike public chains, Canton uses Daml smart contracts with built-in privacy — participants only see data they are authorized to see.
How Canton Works
- Daml smart contracts — Contracts are written in Daml, a purpose-built language for multi-party workflows. Each contract has explicit visibility and authorization rules.
- Global synchronization domain — All participants share a single source of truth without exposing private data. Transactions are atomic across parties.
- Validators — Network participants run validator nodes that host applications and process transactions. Blueprint operates one of these validators.
- Participant nodes — Each validator runs a participant node connected to the global domain. ccledger submits commands through Blueprint’s participant.
What Happens On-Chain
What ccledger does on Canton MainNet depends on the action type:
- Record actions (attest, attest-mutual, mint — all live) — the gateway creates an immutable record contract. The fields written on-chain are the gateway party, a batch id, the data owner, the period timestamps, the
dataHash, andsubmittedBy(your verified API key prefix, so every record is attributable). A mutual attestation additionally records the attestor party, the description and the asset type, and the attestor becomes a co-signatory when they accept. - Value movement — Plain CC transfers move via the live delegated facilitation flow: the sender signs a
CreateTransferCommandfrom their own wallet and ccledger relays it, exercising Splice’s auditedTransferFactory_Transfer. Facilitation covers transfers only — there is no non-custodial escrow or atomic-settlement path today.
Architecture
ccledger is a Spring Boot application running alongside Blueprint’s Canton validator. Here is the complete request flow from your application to on-chain proof.
- Validate API key, check rate limit & fee credits
- Debit the fee & record the action
- Exercise the on-chain action — an attestation/issuance record
splice-validator-participant-1:5001 · Submit & wait for commitInfrastructure
| Component | Detail |
|---|---|
| Cloud | AWS EC2, us-east-1 (Virginia) |
| TLS | Caddy with automatic HTTPS (Let’s Encrypt) |
| Backend | Spring Boot on Eclipse Temurin 21, Docker container |
| Database | PostgreSQL (operational cache — API keys, action records, audit trail) |
| Canton SDK | Daml, Splice |
| Auth | Auth0 M2M client credentials for participant gRPC |
| Validator | Blueprint validator on Canton Global MainNet |
| Daml package | ccledger-blueprint.dar |
Source of Truth
The Canton ledger is the source of truth for on-chain records and value. Attestations, mutual attestations, and issuance records are immutable record contracts. The PostgreSQL database tracks API keys, fee credits, the CCL discount credit, and action history for fast queries and rate-limit enforcement. Records already committed on-chain persist on the ledger regardless of the database.
On-Chain Proof Model
ccledger returns an on-chain proof for every live action. What that proof references depends on the action type.
Record actions (attest, attest-mutual, mint) record data on-chain: you provide a dataHash — a SHA-256 fingerprint of your off-chain data — and ccledger writes it into an immutable record contract. Your raw data never touches our servers; you hash it locally and send only the hash.
Every action returns:
contractId— the Canton contract identifiertransactionId— the Canton update/transaction IDledgerOffset— global sequence number on the ledgersynchronizerId— which Canton domain processed iteffectiveAt— when the Canton sequencer committed it
Look any of these up against a Canton participant to independently verify the action.
Getting Started
From zero to on-chain proof in three steps. No wallet, no gas fees. 50 trial transactions included.
Base URL
https://ccledger.xyzStep 1: Register for an API Key
One POST request. No approval needed. Returns your key instantly.
curl -X POST https://ccledger.xyz/api/v1/community/register \
-H 'Content-Type: application/json' \
-d '{"appName": "my-app", "cantonParty": "user-party::1220abc..."}'cantonParty: Optional, and an echoed hint only — it is not bound to your key at registration. Your Canton party is bound on your first verified fee-credit top-up: a verified on-chain CC transfer from that party (via your Loop wallet), claimed by your authenticated key, is the proof of control. CCL Builder Rewards attach to the bound party.
The cantonParty field is optional at registration and only echoed back. The first verified top-up permanently binds the sender party to your key; from then on, top-ups must come from that party.
{
"apiKey": "cb_community_abc123...",
"appName": "my-app",
"cantonParty": "user-party::1220abc...",
"tier": "community",
"rateLimitRpm": 10,
"scopes": ["community:write"],
"trialCreditsRemaining": 50,
"message": "Store this API key securely -- it will not be shown again. 50 trial transactions included (max 25/day)."
}X-API-Key header for all subsequent requests. Your key includes 50 trial transactions (max 25/day) — no deposit needed to start.
Step 2: Call Any Action Endpoint
Choose from 3 record actions. Here’s an example using attest:
curl -X POST https://ccledger.xyz/api/v1/community/attest \
-H 'X-API-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"appName": "my-app",
"dataOwner": "user-123",
"dataId": "invoice-456",
"dataHash": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
"description": "Invoice attestation for Q1 2026"
}'Step 3: Get On-Chain Proof
Every successful action returns a proof object with the on-chain record:
{
"actionId": "77f83164-0be3-40d2-a1c5-9e8f7d6b5a4c",
"actionType": "attest",
"status": "confirmed",
"appName": "my-app",
"dataHash": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
"mintedAt": "2026-03-04T23:02:34.774Z",
"proof": {
"contractId": "000f8f4427be3817...",
"transactionId": "12202b581a05cafd...",
"ledgerOffset": 2087132,
"synchronizerId": "global-domain::1220b1431ef2...",
"effectiveAt": "2026-03-04T23:02:31.915Z",
"packageId": null,
"templateId": null
},
"rewardMarkerCreated": false
}
The contractId uniquely identifies the Daml contract on Canton MainNet. The transactionId is the Canton transaction hash. The ledgerOffset is the global sequence number. These are permanent, immutable records.
API Reference
29 REST endpoints. All return JSON. Base URL: https://ccledger.xyz. The reference below covers the core record, query, and account endpoints; the rest form two non-custodial capability groups — the agentic rail (scoped agent keys + signed fee receipts) and the dev on-ramp (sandbox/test mode + signed webhooks), where agent keys are scoped spend handles on prepaid fee credits and receipts/webhooks carry fees and metadata only. For the interactive explorer with try-it-out (and the full endpoint list), see the API Explorer.
X-API-Key header. Five endpoints are public (no auth): GET /verify/{reference}, POST /register, GET /stats, GET /chart and POST /sandbox/keys.Error responses: See the Error Responses section below for the exact format returned by each HTTP status code (400, 401, 402, 403, 404, 429, 500).
Registration
Register for a community API key. No authentication required. Rate limited to 3 registrations per IP per 24 hours. The cantonParty field is an optional echoed hint only — your Canton party is bound on your first verified fee-credit top-up (the verified transfer is the proof of control), which is also what attaches CCL Builder Rewards.
Request body:
| Field | Type | Required | Description |
|---|---|---|---|
appName | string | Yes | Your application name (3–100 characters) |
cantonParty | string | No | Your Canton party ID from your Loop wallet (max 512 characters). Echoed hint only — it is not bound to your key at registration. Your Canton party is bound on your first verified fee-credit top-up: the verified on-chain transfer from that party is the proof of control. |
contactEmail | string | No | Optional contact email address |
{
"appName": "your-app-name",
"cantonParty": "user-party::1220abc...",
"contactEmail": "dev@example.com"
}Response (201 Created):
{
"apiKey": "cb_community_a1b2c3d4e5f6g7h8i9j0...",
"appName": "your-app-name",
"cantonParty": "user-party::1220abc...",
"tier": "community",
"rateLimitRpm": 10,
"scopes": ["community:write"],
"trialCreditsRemaining": 50,
"message": "Store this API key securely -- it will not be shown again. Use it in the X-Api-Key header for all community API requests."
}Action Endpoints
Three record actions. The record actions attest and mint are fully live — they write immutable records on Canton MainNet and return an on-chain proof. Attest-mutual returns pending_signature with the proposal's proof, then flips to confirmed when the attestor accepts. On-chain value movement runs through the delegated facilitation flow (you sign from your own wallet, ccledger relays as the application provider; transfers only) — live.
Required Fields (all action types)
| Field | Type | Required | Description |
|---|---|---|---|
appName | string | Yes | Your application identifier (1–100 characters) |
dataHash | string | Yes | SHA-256 hash, hex-encoded (max 128 characters) — the recorded fingerprint. |
Some actions require additional fields: attest-mutual needs attestorParty. See each endpoint below and the Action Types section.
Common Response Fields
| Field | Type | Description |
|---|---|---|
actionId | string (UUID) | Unique identifier assigned by ccledger |
actionType | string | The action type (attest, attest-mutual, mint) |
status | string | confirmed when on-chain, failed on ledger error. Mutual attestation returns pending_signature until the attestor co-signs; an ambiguous on-chain submit returns needs_reconciliation |
appName | string | Your application name (echoed back) |
dataHash | string | Your data hash (echoed back) |
mintedAt | string (ISO 8601) | When the action was confirmed on-chain |
proof.contractId | string | Canton contract ID (hex-encoded) |
proof.transactionId | string | Canton transaction hash (hex-encoded) |
proof.ledgerOffset | integer | Global ledger sequence number |
proof.synchronizerId | string | Canton synchronizer (global-domain::...) |
proof.effectiveAt | string (ISO 8601) | Timestamp when the transaction was committed by the Canton sequencer |
proof.packageId | string or null | Daml package identifier. Always null for community action proofs. |
proof.templateId | string or null | Fully qualified Daml template identifier. Always null for community action proofs. |
rewardMarkerCreated | boolean | Reserved field, always false. |
Record a data attestation. Use for audit trails, compliance records, data integrity proofs. Additional fields: dataOwner, dataId, description.
curl -X POST https://ccledger.xyz/api/v1/community/attest \
-H 'X-API-Key: YOUR_KEY' \
-H 'Content-Type: application/json' \
-d '{"appName":"my-app","dataHash":"a1b2c3...","description":"Audit record"}'Two-party, co-signed attestation for non-repudiation. Creates an on-chain attestation proposal naming an attestor party; the attestor exercises Accept from their own Canton wallet, producing a dual-signed mutual attestation contract. Neither party can later deny it. Costs 5.0 CC (or 1 trial credit). Required field: attestorParty (Canton party ID of the co-signer; it cannot be the gateway party). The attestor becomes a signatory of the resulting contract, so that party must be known on the Global Synchronizer and hosted by a participant that has vetted ccledger’s gateway package. In practice that means a party ccledger hosts for you (contact support@theblueprint.xyz) or a validator that has vetted the package. A party that cannot take part is rejected with 400 and nothing is charged. Additional fields: dataOwner, dataId, description, assetType.
Returns status pending_signature with the proposal's on-chain proof; the action flips to confirmed automatically when the attestor accepts (poll GET /actions/{actionId} or subscribe to an action.confirmed webhook). A signed fee receipt is emitted at proposal time.
curl -X POST https://ccledger.xyz/api/v1/community/attest-mutual \
-H 'X-API-Key: YOUR_KEY' \
-H 'Content-Type: application/json' \
-d '{"appName":"my-app","dataHash":"a1b2c3...","attestorParty":"attestor::1220abcdef...","description":"Mutual audit record"}'Response (200):
{
"actionId": "6a9e2ffc-0027-4ea4-afb3-5cde9e0f11d1",
"actionType": "attest-mutual",
"status": "pending_signature",
"proof": { "contractId": "00d51be5...", "transactionId": "1220f132...", "ledgerOffset": 5650605, "synchronizerId": "global-domain::1220b143..." },
"proposalContractId": "00d51be5...",
"attestorParty": "attestor::1220abcdef...",
"signingInstructions": "The attestor party must exercise the Accept choice on the proposal contract using their Canton wallet."
}Record an issuance or certificate on-chain. ccledger is a non-issuer — this does not mint Canton Coin (only the DSO can) or a tradeable token. It writes an immutable record for issuance and certificate use cases. Additional fields: owner, tokenId, tokenName, amount, metadata, reference. These extra fields are stored in ccledger’s queryable record and returned by GET /actions; the on-chain contract itself carries the dataHash, the owner and the timestamps.
curl -X POST https://ccledger.xyz/api/v1/community/mint \
-H 'X-API-Key: YOUR_KEY' \
-H 'Content-Type: application/json' \
-d '{"appName":"my-app","dataHash":"e5f6a1...","owner":"creator-1","tokenId":"nft-001","tokenName":"MY-TOKEN","amount":"1","metadata":"{\"collection\":\"genesis\"}","reference":"mint-001"}'Query Endpoints
List past actions. Requires API key. Supports query parameters for filtering.
| Parameter | Type | Description |
|---|---|---|
appName | string | Filter by application name |
actionType | string | Filter by type: attest, attest-mutual, mint |
dataOwner | string | Filter by data owner |
status | string | Filter by status: pending, pending_signature, confirmed, failed, needs_reconciliation |
reference | string | Filter by reference identifier |
page | integer | Page number, 0-indexed (default: 0) |
size | integer | Page size (default: 50, max: 100) |
curl "https://ccledger.xyz/api/v1/community/actions?appName=my-app&actionType=attest" \
-H 'X-API-Key: YOUR_KEY'Response: Returns a JSON array of action detail objects.
[
{
"actionId": "77f83164-0be3-40d2-a1c5-9e8f7d6b5a4c",
"actionType": "attest",
"appName": "my-app",
"dataOwner": "user-123",
"dataId": "invoice-456",
"dataHash": "9f86d081884c7d65...",
"description": "Invoice attestation for Q1 2026",
"reference": null,
"assetType": null,
"status": "confirmed",
"proof": {
"contractId": "000f8f4427be3817...",
"transactionId": "12202b581a05cafd...",
"ledgerOffset": 2087132,
"synchronizerId": "global-domain::1220b1431ef2...",
"effectiveAt": "2026-03-04T23:02:31.915Z",
"packageId": null,
"templateId": null
},
"rewardMarkerCreated": false,
"createdAt": "2026-03-04T23:02:30.100Z",
"completedAt": "2026-03-04T23:02:34.774Z"
}
]Get a single action by its UUID. Returns the full action detail record with on-chain proof. Returns 404 if the action does not exist or does not belong to your API key.
curl https://ccledger.xyz/api/v1/community/actions/77f83164-0be3-40d2-a1c5-9e8f7d6b5a4c \
-H 'X-API-Key: YOUR_KEY'Public proof verification — no API key required. Anyone holding a proof reference can check that ccledger wrote the record on Canton MainNet and read back its on-chain coordinates. Pass any one of the three references a proof carries: the actionId (UUID), the contractId, or the transactionId (updateId). This is what makes a shared proof independently checkable by an auditor or counterparty instead of a bare claim. References are high-entropy, the endpoint is read-only, and the response never exposes tenant financials or payload fields beyond the dataHash the proof already carries.
curl https://ccledger.xyz/api/v1/community/verify/6a9e2ffc-0027-4ea4-afb3-5cde9e0f11d1{
"verified": true,
"matchedBy": "actionId",
"actionId": "6a9e2ffc-0027-4ea4-afb3-5cde9e0f11d1",
"actionType": "attest-mutual",
"status": "confirmed",
"appName": "my-app",
"dataHash": "17b3d373...",
"proof": { "contractId": "003e6a1d...", "transactionId": "1220db66...", "ledgerOffset": 5650637, "synchronizerId": "global-domain::1220b143..." },
"createdAt": "2026-08-19T22:19:13Z",
"completedAt": "2026-08-19T22:24:39Z"
}Unknown references return 404 with {"verified": false}.
Public aggregate statistics. No authentication required. Returns total counts and a breakdown by action type.
curl https://ccledger.xyz/api/v1/community/statsResponse:
{
"totalActions": 79,
"confirmedActions": 76,
"rewardMarkersCreated": 0,
"activeApps": 23,
"actionsByType": {
"attest": 35,
"mint": 8,
"ledger-submit": 14
},
"costPerAction": 2.0,
"costPerMutualAction": 5.0,
"paidTierRpm": 100,
"communityTierRpm": 10,
"loyaltyTokensMinted": 0,
"registeredKeys": 30,
"registeredParties": 2,
"cclTotalSupply": 0,
"cclBlueprintTreasury": 0,
"partyStats": [...],
"ledgerSubmissions": 14,
"confirmedLedgerSubmissions": 14,
"successRate": 96.2,
"ccRevenue": 45.0,
"ccDeposits": 100.0,
"trialToPaidRate": 25.0,
"avgDailyActions7d": 11.3,
"weekOverWeekPct": 15.0,
"busiestDay": "2026-03-25",
"peakHour": 14,
"avgSecondsToConfirm": 3.2
}Public time-series chart data for analytics dashboards. No authentication required. Returns daily counts within the requested time window.
| Parameter | Type | Description |
|---|---|---|
window | string | Time window: 7d, 30d (default), or 90d |
curl "https://ccledger.xyz/api/v1/community/chart?window=30d"Response:
{
"window": "30d",
"communityActions": [
{"date": "2026-03-15", "count": 12},
{"date": "2026-03-16", "count": 8}
],
"actionsByType": {
"attest": [{"date": "2026-03-15", "count": 5}],
"mint": [{"date": "2026-03-15", "count": 4}]
},
"ledgerSubmissions": [{"date": "2026-03-15", "count": 2}],
"registrations": [{"date": "2026-03-15", "count": 3}],
"cclMinted": [],
"activeKeys": [{"date": "2026-03-15", "count": 5}]
}Balance & Credits
Prepaid CC is a non-refundable service credit (“fee credits”) that pays per-action fees only — it never funds on-chain value movement, and there is no withdrawal endpoint (credits are a one-way prepayment, not a custodial balance). Send CC from your Loop wallet: the first top-up is claimed once via POST /deposit with your deposit code in the memo, and later top-ups auto-credit within seconds. Community tier includes 50 trial record actions (max 25/day) at no cost. Paid tier (100 RPM) costs 2.0 CC fee per record action (5.0 CC for mutual attestation). Simply holding CCL gives you a discount on every action.
POST /deposit with your deposit code in the memo, which binds your Canton party; later top-ups auto-credit within seconds, and your key upgrades to paid tier at 100 RPM) → Each record action deducts its fee at your discounted rate → Every 10 CC-paid actions earns 1 CCL Builder Reward → Hold CCL to lower your CC fee per action.
Fees (deterministic, no hidden costs)
| Action Type | Base Fee |
|---|---|
| Record actions (attest, mint) | 2.0 CC (hold CCL for discount) |
| Mutual attestation (attest-mutual) | 5.0 CC (hold CCL for discount) |
| Trial actions (50 included, record actions only) | 0 CC |
CCL Discount Curve
Your discount is based on the CCL you hold (cclOnchainHoldings), tracked on your ccledger account. Formula: discount = 50% × (1 - 1/(1 + cclOnchainHoldings/200))
| CCL Held | Discount | CC/Action | CC/Mutual |
|---|---|---|---|
| 0 | 0% | 2.000 | 5.000 |
| 50 | 10% | 1.800 | 4.500 |
| 100 | 16.7% | 1.667 | 4.167 |
| 200 | 25% | 1.500 | 3.750 |
| 500 | 35.7% | 1.286 | 3.214 |
| 1,000 | 41.7% | 1.167 | 2.917 |
Discount increases with more CCL held (up to ~50%). Hold CCL to lower your CC cost per action — CCL is never spent, only CC is charged at the discounted rate. Your discount is shown in GET /balance (cclOnchainHoldings, discountedCostPerAction, discountedCostPerMutual, discountPercent). The more CCL you hold, the larger your discount.
Unified balance endpoint. Returns your fee-credit balance (ccBalance — non-refundable prepaid CC that pays per-action fees only), CCL balance, your CCL discount balance (cclOnchainHoldings — the CCL you hold that drives your discount), tier, rate limit, base and discounted fee per action, CCL mint progress (cantonParty, cclTotalMinted, cclActionsTowardNext, cclNextMilestone), discount info, and recent transaction history. Your discount is based on the CCL you hold, tracked on your ccledger account. Requires API key.
curl https://ccledger.xyz/api/v1/community/balance \
-H 'X-API-Key: YOUR_KEY'Response:
{
"tier": "paid",
"rateLimitRpm": 100,
"ccBalance": 42.5,
"costPerAction": 2.0,
"costPerMutualAction": 5.0,
"discountedCostPerAction": 1.666667,
"discountedCostPerMutual": 4.166667,
"discountPercent": "16.7%",
"trialCreditsRemaining": 48,
"trialCreditsTotal": 50,
"trialDailyUsed": 2, // all actions today, trial or paid
"trialDailyLimit": 25,
"cclBalance": 100.0,
"cclOnchainHoldings": 100.0,
"cantonParty": "user-party::1220abcdef...",
"cclTotalMinted": 100,
"cclActionsTowardNext": 2,
"cclNextMilestone": 10,
"recentTransactions": [
{
"id": 1,
"type": "deposit",
"amount": 50.0,
"balanceAfter": 50.0,
"referenceId": null,
"cantonTxId": "tx-abc123",
"description": "CC deposit from Canton tx tx-abc123",
"createdAt": "2026-03-04T14:30:00Z"
}
]
}Dry-run pricing preview. Returns the exact fee an action would cost before you spend anything: the base fee, the CCL-discounted fee you would actually pay, your discount percent, the CCL you hold, your fee-credit balance, and whether you can afford it. Read-only — no side effects. Requires API key. Required: actionType, one of attest, attest-mutual or mint. Anything else returns 400. The response carries the base fee, your CCL-discounted fee, your discount percent, your balance and whether you can afford it; note is null unless mutual attestation is switched off. For attest-mutual the note is null in normal operation; the quote returns the 5.0 CC fee. Quoting an unavailable action does not imply it is callable.
curl -X POST https://ccledger.xyz/api/v1/community/quote \
-H 'X-API-Key: YOUR_KEY' \
-H 'Content-Type: application/json' \
-d '{"actionType":"attest"}'Response:
{
"actionType": "attest",
"currency": "CC",
"baseFee": 2.0,
"fee": 1.666667,
"discountPercent": "16.7%",
"cclOnchainHoldings": 100.0,
"balance": 42.5,
"sufficientForFee": true,
"note": null
}/register and GET /balance) in the transfer memo, send the CC, then submit that transaction id to POST /deposit. Every later top-up from the bound party is auto-credited within seconds with no API call. Fee credits are non-refundable and pay per-action fees only.Top-up address:
blueprint-validator-1::1220daab58adcae026bd2ca7ad95014f678bda3ce2a6f91b744cf3ec3d87f09deeacHow to get CC: Buy Canton Coin on Coinbase → transfer to your Loop wallet → send to the Blueprint validator address above. Claim the first top-up via
POST /deposit; later ones auto-credit. Tier auto-upgrades.
Fee-credit top-up (manual fallback). Tops up your fee credits — the non-refundable prepaid CC that pays per-action fees only (never funds value movement; cannot be withdrawn). The primary top-up method is automatic (see above). Use this endpoint only if auto-detection hasn’t processed your transfer yet. Verifies the transaction via gRPC Ledger API (extracts the amount from the contract arguments, requires the received contract to be a plain Splice.Amulet:Amulet owned by the Blueprint gateway party, and identifies the sender from the contract’s non-gateway stakeholder). Minimum top-up: 1.0 CC. Your Canton party is bound on the first verified top-up (the verified transfer is the proof of control); after binding, the sender must match (returns 403 on mismatch). Automatically upgrades your key from community (10 RPM) to paid tier (100 RPM). Returns 409 if the transaction was already credited.
curl -X POST https://ccledger.xyz/api/v1/community/deposit \
-H 'X-API-Key: YOUR_KEY' \
-H 'Content-Type: application/json' \
-d '{"transactionId":"canton-tx-abc123def456","amount":50.0}'Response (200 OK):
{
"credited": 50.0,
"newBalance": 92.5,
"tier": "paid",
"rateLimitRpm": 100,
"message": "Credited 50.0 CC in non-refundable fee credits (verified on-chain). Fee credits pay per-action fees only; ccledger is non-custodial and never holds a spendable value balance. Your API key is now paid tier (100 RPM, 2.0 CC per action)."
}Action Types
Three record actions — attest, attest-mutual, and mint — all fully live, each writing an immutable record with an on-chain proof. On-chain value movement is a separate live path via the delegated facilitation flow (transfers only). All live actions return the same on-chain proof format.
| Action | Status | What It Does | Key Fields |
|---|---|---|---|
| Attest | Live | Immutable record — audit trails, compliance records, document hashes, KYC/AML attestations (2.0 CC fee or 1 trial credit) | dataOwner, dataId, description |
| Attest-Mutual | Live | Immutable record — two-party, co-signed non-repudiation. Currently returns HTTP 503 with no charge while its rollout completes; use single-party attest today (5.0 CC fee or 1 trial credit) | attestorParty (required), dataOwner, dataId, description |
| Mint | Live | Immutable record for issuance/certificate use cases. Non-issuer — not Canton Coin, not a tradeable token (2.0 CC fee or 1 trial credit) | owner, tokenId, tokenName, amount, metadata, reference |
Computing a Data Hash
JavaScript / Node.js
const crypto = require('crypto');
const data = JSON.stringify({ invoice: 'INV-001', amount: 5000, currency: 'USD' });
const hash = crypto.createHash('sha256').update(data).digest('hex');
// hash = "5a1c3ef7b9d2..." (64 hex characters)Python
import hashlib, json
data = json.dumps({"invoice": "INV-001", "amount": 5000, "currency": "USD"})
hash = hashlib.sha256(data.encode()).hexdigest()
# hash = "5a1c3ef7b9d2..." (64 hex characters)Bash
echo -n '{"invoice":"INV-001","amount":5000,"currency":"USD"}' | sha256sum | cut -d' ' -f1On-Chain Proof
Every action response includes a proof object. These fields are your verifiable, on-chain evidence that the action settled on Canton MainNet.
| Field | Format | Description |
|---|---|---|
contractId | Hex string (~140 chars) | Unique identifier of the Daml contract on the ledger. This is the canonical reference for the on-chain record. |
transactionId | Hex string (68 chars) | Canton transaction hash. Identifies the specific transaction that created the contract. |
ledgerOffset | Integer | Global monotonically-increasing sequence number. Every transaction on the participant gets a unique offset. |
synchronizerId | global-domain::1220... | The Canton synchronization domain where the transaction was committed. global-domain = Canton MainNet. |
effectiveAt | ISO 8601 timestamp | The timestamp at which the transaction was committed by the Canton sequencer. |
packageId | String or null | Daml package identifier. Always null for community action proofs; populated for enterprise (ledger submission) proofs. |
templateId | String or null | Fully qualified Daml template identifier (e.g., Module:Template). Always null for community action proofs. |
What Makes This Proof Trustworthy
- Finality — Once committed on Canton, a transaction is final, and an attestation record cannot be modified or deleted by anyone, including Blueprint.
- Consensus — The transaction was committed through Canton’s global synchronization protocol, validated by the sequencer and mediator.
- Ordering — The
ledgerOffsetgives a total ordering of all events. You can prove that record A was created before record B. - Timestamping — The
effectiveAttimestamp is set by the Canton sequencer, not by Blueprint’s application.
Payments — Non-Custodial Facilitation
This is the live way to move Canton Coin through ccledger. You sign the transfer with your own key; ccledger relays it to the ledger as the application provider. ccledger never holds your funds and never sees your private key. Prepaid fee credits are never spent on value movement. Facilitation covers plain sender-signed CC transfers only — there is no non-custodial escrow or atomic-settlement path today.
GET /facilitation/status therefore returns
featured: false, facilitated transfers carry no featured-app tag, and no CIP-0104 confirmer rewards
accrue today. Transfers themselves are fully live and work exactly the same either way.
The Flow
| Step | Endpoint | Who acts | What happens |
|---|---|---|---|
| 0 | GET /facilitation/status | You | Readiness probe — {enabled, featured, appProviderParty}. |
| 1 | POST /facilitation/onboard | ccledger, then the sender | One-time per party. Creates an ExternalPartySetupProposal; the sender Accepts it with their own key, producing a TransferPreapproval naming ccledger as provider. Self-serve and fee-charged: a flat 5.0 CC onboarding fee is debited from your fee credits (it funds the real on-chain setup fee and the party’s receive preapproval; trial credits cannot pay it). See the participant prerequisites below. |
| 2 | POST /facilitation/prepare | ccledger | Builds the CreateTransferCommand and returns it prepared but unsubmitted. |
| 3 | — local — | You | Ed25519-sign the raw bytes of the base64-decoded preparedTransactionHash (32 bytes). Your key never leaves your machine. |
| 4 | POST /facilitation/execute | ccledger | Relays your signed command; your TransferCommand is created on-ledger. |
| 5 | POST /facilitation/send | ccledger | Exercises TransferCommand_Send — your own CC moves to the receiver. |
/onboard call itself is self-serve (fee-charged,
5.0 CC from fee credits). Before it can run for a brand-new party, two participant-side steps are required
that no public ccledger endpoint covers:
- The external party must be allocated on ccledger’s participant — a one-time topology operation through the Canton validator admin API, outside the Ledger API.
- ccledger’s backend user must be granted
CanActAson that party, or/preparecannot act as the sender.
ExternalPartySetupProposal_Accept is likewise signed with the sender’s
own key and submitted through the participant’s interactive-submission API by the onboarding tooling.
Contact us and we run these participant-side steps with you (typically same-day); steps 2–5 are then
fully self-serve for that party. A sixth endpoint, POST /facilitation/fund, seeds a party from ccledger’s own
treasury and is operator-only and disabled by default (503) — fund your own party from
your own wallet.
Nonce
/prepare requires the sender’s current nextNonce, read from the Canton Scan
transfer-command counter (0 for a party that has never sent). A prepared command is valid for 10 minutes.
# the public SV Scan host rejects unauthenticated clients (403), so read it through ccledger's proxy
curl -s https://ccledger.xyz/scan-api/v0/transfer-command-counter/<sender-party> \
| jq -r .transfer_command_counter.contract.payload.nextNonce
# a party that has never sent has no counter yet — use nonce 0 for its first transferExample — prepare, sign, execute, send
# 2. prepare (nonce from the counter above)
curl -sX POST https://ccledger.xyz/api/v1/community/facilitation/prepare \
-H "X-API-Key: $CCLEDGER_KEY" -H "Content-Type: application/json" \
-d '{"sender":"alice::1220abc...","receiver":"bob::1220def...","amount":1.0,"nonce":0}'
# -> {"preparedTransaction":"CrAWCgMy...","preparedTransactionHash":"x/KMaR7C...","hashingSchemeVersion":"HASHING_SCHEME_VERSION_V2","nonce":0}
# 3. sign LOCALLY: Ed25519 over the decoded raw bytes of preparedTransactionHash
# 4. execute — signedByFingerprint is the part of your party id after '::'
curl -sX POST https://ccledger.xyz/api/v1/community/facilitation/execute \
-H "X-API-Key: $CCLEDGER_KEY" -H "Content-Type: application/json" \
-d '{"preparedTransaction":"CrAWCgMy...","preparedTransactionHash":"x/KMaR7C...",
"hashingSchemeVersion":"HASHING_SCHEME_VERSION_V2","nonce":0,
"sender":"alice::1220abc...","signatureB64":"3q2+7w...","signedByFingerprint":"1220abc..."}'
# -> {"transferCommandCid":"005ea34cc0..."}
# 5. send — transferCounterCid is auto-fetched from Scan when omitted
curl -sX POST https://ccledger.xyz/api/v1/community/facilitation/send \
-H "X-API-Key: $CCLEDGER_KEY" -H "Content-Type: application/json" \
-d '{"transferCommandCid":"005ea34cc0...","sender":"alice::1220abc...",
"senderInputCids":["00fbe3047e..."],"receiverPreapprovalCid":"00797a11de...","nonce":0}'
# -> {"updateId":null,"success":true,"reason":"sent (executed by the delegate's validator automation)","outputAmuletCid":null,"featured":false}Reading the /send result
success: true— the transfer settled. Ifreasonsays “executed by the delegate’s validator automation”, the validator’s own Splice automation executed your pending command before ccledger’s submission landed. That is normal and expected: the payment went through, butupdateIdisnullbecause it was not our transaction. Verify on-chain via the sender’s history on ccscan. Do not retry.success: falsewith HTTP 200 — a committed on-ledger Failure result (out of funds, expired command, wrong receiver). Definite: no funds moved.- HTTP 202
needs_reconciliation— the submit was indeterminate and may have committed. Check the transfer-command status on Scan before doing anything else; never blind-retry. - HTTP 500 — definite pre-commit failure. Nothing moved, nothing to refund.
Full request and response schemas for all six endpoints are in the API Explorer and openapi.json.
Trial Credits & CCL Builder Rewards
Trial Credits
Every new API key includes 50 trial credits (max 25 per day). Trial credits fund the record actions only (attest, attest-mutual, mint), so you can test without paying CC. They never fund value movement.
- 50 total trial credits per API key, non-renewable
- 25/day cap to prevent abuse (resets daily UTC)
- Automatic refund if an action fails definitively before commit — an indeterminate submission is not refunded, it is marked
needs_reconciliation - Check remaining credits via
GET /api/v1/community/balance(trialCreditsRemaining,trialDailyUsed)
When trial credits are exhausted, record actions return 402 (see Error Responses). Top up fee credits by sending CC from your Loop wallet to the Blueprint validator (minimum 1.0 CC, maximum 10,000 CC per deposit); the ledger watcher credits them once the transfer is confirmed on-chain, upgrading you to paid tier for unlimited record actions. POST /deposit is available as a manual fallback.
CCL Builder Rewards
Every 10th CC-paid action (not trial) earns 1 CCL Builder Reward on your account, tracked per API key.
- 1 CCL per 10 CC-paid actions (attest, attest-mutual, mint)
- Discount based on the CCL you hold (
cclOnchainHoldings), tracked on your ccledger account - Hold CCL to reduce your CC cost per action — the discount approaches ~50%
- CCL is never spent on actions; only CC is charged at the discounted rate
- See CCL Builder Rewards for full details on the discount curve
CCL Builder Rewards
CCL is an account-based, non-transferable discount credit for the ccledger ecosystem. Hold CCL to reduce your CC cost per action — the discount approaches ~50%. Your discount is based on the CCL you hold, tracked on your ccledger account. The more CCL you hold, the larger your discount.
cclOnchainHoldings). The more CCL you hold, the larger your discount.Discount Curve
Discount is based on cclOnchainHoldings — the CCL you hold on your ccledger account. Formula: discount = 50% × (1 - 1/(1 + cclOnchainHoldings/200))
| CCL Held | Discount | CC/Action | CC/Mutual |
|---|---|---|---|
| 0 | 0% | 2.000 | 5.000 |
| 10 | 2.4% | 1.952 | 4.881 |
| 50 | 10% | 1.800 | 4.500 |
| 100 | 16.7% | 1.667 | 4.167 |
| 200 | 25% | 1.500 | 3.750 |
| 500 | 35.7% | 1.286 | 3.214 |
| 1,000 | 41.7% | 1.167 | 2.917 |
Discount increases with more CCL held (up to ~50%).
Earning CCL
CCL Builder Rewards are earned automatically. Every 10 CC-paid actions (attest, attest-mutual, mint) earns 1 CCL on your ccledger account. Trial actions do not count — only CC-paid actions earn CCL. Your Canton party is bound on your first verified fee-credit top-up.
Hold to Save
CCL is a discount credit tracked on your ccledger account. The more CCL you hold, the larger your discount on every action — your cclOnchainHoldings drives your discounted rates. CCL is never spent on actions; only CC is charged, at the discounted rate.
Billing Order
Billing follows your tier rather than a fallback chain. A paid-tier key is charged fee credits at your discounted rate, and returns 402 if the balance is short; it does not fall back to trial credits. A community-tier key spends trial credits, and returns 402 once they are gone. A key upgrades to paid automatically on its first credited top-up. CCL is held for the discount only and is never charged.
CCL Endpoint
Your CCL balance, CCL discount balance (cclOnchainHoldings), mint progress, and current discounted rates are all included in the unified GET /api/v1/community/balance endpoint (see Balance & Credits above).
Error Responses
Error response formats vary by endpoint and status code. Below is the exact response body for each error condition.
400 Bad Request
Returned by the registration endpoint when the request body is invalid:
// POST /register — missing or invalid appName
{
"error": "bad_request",
"message": "appName is required",
"status": 400
}// POST /register — appName length violation
{
"error": "bad_request",
"message": "appName must be 3-100 characters",
"status": 400
}Returned by action endpoints when required fields (appName or dataHash) are missing or invalid:
// POST /attest — missing appName
{
"error": "bad_request",
"message": "appName is required",
"status": 400
}// POST /attest — appName exceeds max length
{
"error": "bad_request",
"message": "appName must not exceed 100 characters",
"status": 400
}// POST /attest — missing dataHash
{
"error": "bad_request",
"message": "dataHash is required",
"status": 400
}// POST /attest — dataHash exceeds max length
{
"error": "bad_request",
"message": "dataHash must not exceed 128 characters",
"status": 400
}401 Unauthorized
Returned when the X-API-Key header is missing or contains an invalid key. Note: the 401 response uses {"message":"..."} only — there is no error field.
// No X-API-Key header provided
{
"message": "Unauthorized"
}// Invalid or revoked API key
{
"message": "Invalid API key"
}402 Payment Required (x402/p402-style)
Returned by record actions when trial credits are exhausted (community tier) or fee credits are insufficient (paid tier). The body includes the standard error/message/status plus x402Version: 1 and an accepts array, so an x402/p402 agent client can pay-and-retry with no bespoke integration. Paying = topping up fee credits by sending CC to the payTo gateway party (non-refundable; fees only), then retrying.
{
"error": "payment_required",
"message": "Trial credits exhausted. Send CC to the Blueprint validator to continue.",
"status": 402,
"x402Version": 1,
"accepts": [
{
"scheme": "exact",
"network": "canton",
"asset": "CC",
"maxAmountRequired": "2.0",
"resource": "/api/v1/community/attest",
"payTo": "blueprint-validator-1::1220daab58adcae026bd2ca7ad95014f678bda3ce2a6f91b744cf3ec3d87f09deeac",
"description": "Fund this action by sending CC to the Blueprint validator party, then retry.",
"maxTimeoutSeconds": 300
}
]
}403 Forbidden
POST /deposit returns 403 when the transaction sender does not match the Canton party bound to your key by its first verified top-up.
{
"error": "forbidden",
"message": "Transaction sender does not match your registered Canton party. Deposits must come from the same Canton party used for your first deposit.",
"status": 403
}404 Not Found
Returned by GET /api/v1/community/actions/{actionId} when the action ID does not exist or does not belong to your API key:
{
"error": "not_found",
"message": "Action not found",
"status": 404
}429 Too Many Requests
Returned when you exceed the rate limit. The API-key rate limiter includes retryAfterSeconds in the JSON body and a Retry-After HTTP header. The registration rate limiter returns a standard error response.
// Action or query rate limit exceeded
{
"message": "Rate limit exceeded",
"retryAfterSeconds": 60
}// Registration rate limit (3 per IP per 24 hours)
{
"error": "rate_limit_exceeded",
"message": "Maximum 3 registrations per IP per 24 hours",
"status": 429
}500 Internal Server Error
Returned when the Canton ledger operation fails (e.g., participant unavailable). Returns an ErrorResponse carrying the action id, so you can look the action up afterwards with GET /actions/{actionId}:
{
"error": "internal_error",
"message": "Action failed. Reference: 7f3a9b2c-1d4e-5f6a-...",
"status": 500
}400 Bad Request (attest-mutual attestorParty)
Returned when attestorParty cannot take part in the attestation: the party is unknown on the Global Synchronizer, or its participant has not vetted ccledger’s gateway package. Any fee credit or trial debit is refunded, so nothing is charged.
{
"error": "bad_request",
"message": "attestorParty cannot take part in this attestation. The party must be known on the Global Synchronizer AND hosted by a participant that has vetted ccledger's gateway package, because it becomes a signatory of the resulting contract. Use a party hosted by ccledger (contact support@theblueprint.xyz) or have the attestor's validator vet the ccledger gateway package first. You were not charged.",
"status": 400
}503 Service Unavailable
Returned only if the operator has switched a capability off with its emergency kill-switch (for example POST /attest-mutual or the facilitation endpoints). Nothing is charged — no fee credit or trial debit. The response body names the switched-off capability and what remains available.
{
"error": "unavailable",
"message": "Mutual attestation is switched off by the operator. You were NOT charged. Single-party attestation (POST /attest), mint records (POST /mint), and quotes are fully available.",
"status": 503
}Security Model
ccledger is designed with a minimal trust surface. Here is exactly what the API can and cannot do.
- Non-custodial, enforced in code — ccledger never holds customer CC as a spendable value balance. Prepaid CC is a non-refundable fee credit: it pays per-action fees only, never funds on-chain value movement, and cannot be withdrawn (no withdrawal endpoint exists). ccledger never holds customer CC as a spendable value balance.
- Your data is private — Only you can see your action detail, proofs and balance. Note that the unauthenticated
GET /statsendpoint publishes aggregate network stats and a leaderboard of app name, Canton party, tier and action counts for keys with a bound Canton party; spend and CCL holdings are never exposed. - On-chain proof, off-chain data — You send a hash, not raw data. ccledger never sees your underlying records. The hash is stored on-chain as proof, but the data it represents remains entirely within your system.
- Rate limiting — Community tier: 10 RPM (50 trial TX, max 25/day). Paid tier: 100 RPM. Registration: 3 per IP per 24 hours.
- TLS everywhere — All connections use HTTPS with automatic certificate management. No plaintext data in transit.
- Top-up verification — Fee-credit top-ups are verified on-chain via the Canton Ledger API. Your Canton party is bound on the first verified top-up (the verified transfer is the proof of control), and later top-ups must come from the bound party. Amounts are extracted from on-chain contract arguments, not user-supplied.
Rate Limits
Rate limits protect the shared infrastructure and ensure fair access for all developers.
| Endpoint | Limit | Window |
|---|---|---|
Every request carrying X-API-Key — actions, queries, balance, quote, facilitation, webhooks, agent keys, on any path | 10 RPM (community) / 100 RPM (paid) | Sliding 60 seconds, per API key |
| Registration | 3 requests | Per 24 hours, per IP |
| Sandbox key creation | 20 keys | Per 24 hours, per IP |
| Public endpoints (stats, chart) | No limit when called without a key — sending X-API-Key counts the call against that key | — |
When rate limited, the API returns HTTP 429 with a JSON body. For API-key rate limits, the response includes a retryAfterSeconds field. See Error Responses for exact response formats.
MCP Server
ccledger exposes 28 MCP tools via Streamable HTTP. AI agents (Claude Desktop, Claude Code, LangChain, CrewAI, etc.) can connect and call the API with zero friction.
Endpoint
https://ccledger.xyz/mcpCore tools
| Tool | Description | Auth |
|---|---|---|
register_api_key | Register for an API key (50 trial record-action credits) | No |
get_stats | Public network statistics | No |
quote | Dry-run pricing preview — exact fee, CCL discount, balance, and affordability before spending (read-only) | apiKey |
submit_attest | Record an immutable attestation on-chain (2.0 CC fee or 1 trial credit) | apiKey |
submit_attest_mutual | Two-party co-signed attestation: pending_signature until the attestor accepts from their own wallet; 5.0 CC fee (or 1 trial credit) | apiKey |
submit_mint | Record an issuance/certificate; non-issuer, not CC (2.0 CC fee or 1 trial credit) | apiKey |
get_balance | Fee credits, CCL discount balance (drives discount), tier, CCL mint progress, discounted rates | apiKey |
deposit_cc | Manual fee-credit top-up fallback (top-ups are auto-detected; min 1.0 CC; non-refundable) | apiKey |
list_actions | List past actions | apiKey |
get_action_by_id | Get single action by UUID | apiKey |
get_action | Alias for get_action_by_id | apiKey |
verify_record | Public proof verification — pass an actionId, contractId, or transactionId and get the on-chain coordinates back | No |
These are the core record, query, verification, and account tools. The remaining tools cover three non-custodial capability groups — the agentic rail (scoped agent keys + signed fee receipts), the dev on-ramp (sandbox/test mode + signed webhooks), and the facilitation flow (facilitation_status, facilitation_onboard, facilitation_prepare, facilitation_execute, facilitation_send — the full sender-signed transfer sequence) — for 28 tools in total. Agent keys are scoped spend handles on prepaid fee credits; receipts and webhooks carry fees and metadata only, never value movement. See the API Explorer or openapi.json for the complete list.
Connect from Claude Desktop / Claude Code
Add to your claude_desktop_config.json or project .mcp.json:
{
"mcpServers": {
"ccledger": {
"type": "url",
"url": "https://ccledger.xyz/mcp"
}
}
}AI Discovery Files
- llms.txt — LLM-optimized overview (llmstxt.org spec)
- llms-full.txt — Complete reference for agents
- .well-known/agent.json — A2A agent card
- openapi.json — OpenAPI 3.1 spec with x-llm-hint annotations
FAQ
POST /deposit, later ones auto-credit. Fees: 2.0 CC per record action (5.0 CC for mutual attestation). Fee credits are non-refundable and pay fees only — they never fund value movement. Hold CCL to reduce your fee per action — discount increases with more CCL held (up to ~50%). Every 10 CC-paid actions earns 1 CCL. Preview any fee via POST /api/v1/community/quote; check your discount via GET /api/v1/community/balance.CreateTransferCommand yourself, and ccledger relays and submits it as the application provider (the CIP-0104 confirmer role) — it never takes custody of your CC.blueprint-validator-1::1220daab58adcae026bd2ca7ad95014f678bda3ce2a6f91b744cf3ec3d87f09deeac) — the first top-up is claimed once via POST /deposit with your deposit code in the memo, which binds your Canton party; later top-ups auto-credit within seconds, and your tier upgrades to paid automatically. Fee credits are non-refundable and pay fees only — they never fund on-chain value movement and cannot be withdrawn. POST /deposit is available as a manual fallback.POST /deposit, later ones auto-credit. Value movement is live via the delegated facilitation flow. See Balance & Credits.false. You can ignore it.contractId or transactionId from the proof object. These can be looked up against any Canton participant connected to the global domain. You can also query your actions back through the API using GET /api/v1/community/actions/{actionId}.cclOnchainHoldings), tracked on your ccledger account — discount = 50% × (1 - 1/(1 + cclOnchainHoldings/200)). The more CCL you hold, the larger your discount. CCL is never spent on actions; only CC is charged at the discounted rate. See CCL Builder Rewards for full details.Verification
How to verify that your on-chain records are real and immutable.
Via the API
Query any action by its ID to retrieve the full proof:
curl https://ccledger.xyz/api/v1/community/actions/YOUR_ACTION_ID \
-H 'X-API-Key: YOUR_KEY'Via the Stats Endpoint
Verify aggregate counts match your expectations:
curl https://ccledger.xyz/api/v1/community/statsData Hash Verification
To verify that a record matches your original data:
- Retrieve the action from the API using its
actionId - Recompute the SHA-256 hash of your original data
- Compare the hash against the
dataHashfield in the response - If they match, the on-chain record corresponds to your original data
Canton Participant Verification
For maximum independence, you can verify contracts directly against a Canton participant. The contractId in the proof object is the canonical Daml contract identifier on the global domain. Any Canton participant with visibility to Blueprint’s contracts can look up this ID.
Ready to build?