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.

Live on MainNet: Record actions hit Canton MainNet in real time — every response includes a contract ID, update/transaction ID, and ledger offset you can look up against the Canton participant. On-chain value movement runs through the delegated facilitation flow (live; transfers only).

Why Use ccledger

  1. 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.
  2. 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.
  3. 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.
  4. Canton Network MainNet — Not a testnet or simulation. Your transactions and records exist on the same global synchronization domain used by major financial institutions.
  5. Self-service registration — One POST request returns an API key instantly. No approval process, no KYC, no waiting.
  6. 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.
  7. Query and verify — Retrieve any past action by ID, filter by app name or type, get aggregate statistics. Full audit trail.
  8. 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, and submittedBy (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 CreateTransferCommand from their own wallet and ccledger relays it, exercising Splice’s audited TransferFactory_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.

Your Application
Any HTTP client — curl, fetch, axios, requests
HTTPS POST · X-API-Key header
Caddy
TLS termination · port 443 · security headers · request body-size limits
reverse_proxy 127.0.0.1:8081
ccledger Backend
Spring Boot · port 8080 in-container, published on 127.0.0.1:8081 · Eclipse Temurin 21
  • Validate API key, check rate limit & fee credits
  • Debit the fee & record the action
  • Exercise the on-chain action — an attestation/issuance record
gRPC + Auth0 M2M JWT
Canton Participant
splice-validator-participant-1:5001 · Submit & wait for commit
Canton consensus protocol
Canton Network Global Domain
Production MainNet · global synchronization · sequencer + mediator
On-Chain Action Settled
An immutable record · contractId + updateId + ledgerOffset returned

Infrastructure

ComponentDetail
CloudAWS EC2, us-east-1 (Virginia)
TLSCaddy with automatic HTTPS (Let’s Encrypt)
BackendSpring Boot on Eclipse Temurin 21, Docker container
DatabasePostgreSQL (operational cache — API keys, action records, audit trail)
Canton SDKDaml, Splice
AuthAuth0 M2M client credentials for participant gRPC
ValidatorBlueprint validator on Canton Global MainNet
Daml packageccledger-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 identifier
  • transactionId — the Canton update/transaction ID
  • ledgerOffset — global sequence number on the ledger
  • synchronizerId — which Canton domain processed it
  • effectiveAt — 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.xyz

Step 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..."}'
About 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)." }
Important: Save the API key immediately. It is only shown once and cannot be retrieved later. Use it in the 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.

Authentication: All action and query endpoints require the 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

POST /api/v1/community/register

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:

FieldTypeRequiredDescription
appNamestringYesYour application name (3–100 characters)
cantonPartystringNoYour 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.
contactEmailstringNoOptional 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)

FieldTypeRequiredDescription
appNamestringYesYour application identifier (1–100 characters)
dataHashstringYesSHA-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

FieldTypeDescription
actionIdstring (UUID)Unique identifier assigned by ccledger
actionTypestringThe action type (attest, attest-mutual, mint)
statusstringconfirmed 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
appNamestringYour application name (echoed back)
dataHashstringYour data hash (echoed back)
mintedAtstring (ISO 8601)When the action was confirmed on-chain
proof.contractIdstringCanton contract ID (hex-encoded)
proof.transactionIdstringCanton transaction hash (hex-encoded)
proof.ledgerOffsetintegerGlobal ledger sequence number
proof.synchronizerIdstringCanton synchronizer (global-domain::...)
proof.effectiveAtstring (ISO 8601)Timestamp when the transaction was committed by the Canton sequencer
proof.packageIdstring or nullDaml package identifier. Always null for community action proofs.
proof.templateIdstring or nullFully qualified Daml template identifier. Always null for community action proofs.
rewardMarkerCreatedbooleanReserved field, always false.
POST /api/v1/community/attest

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"}'
POST /api/v1/community/attest-mutual

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." }
POST /api/v1/community/mint

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

GET /api/v1/community/actions

List past actions. Requires API key. Supports query parameters for filtering.

ParameterTypeDescription
appNamestringFilter by application name
actionTypestringFilter by type: attest, attest-mutual, mint
dataOwnerstringFilter by data owner
statusstringFilter by status: pending, pending_signature, confirmed, failed, needs_reconciliation
referencestringFilter by reference identifier
pageintegerPage number, 0-indexed (default: 0)
sizeintegerPage 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 /api/v1/community/actions/{actionId}

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'
GET /api/v1/community/verify/{reference}

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

GET /api/v1/community/stats

Public aggregate statistics. No authentication required. Returns total counts and a breakdown by action type.

curl https://ccledger.xyz/api/v1/community/stats

Response:

{ "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 }
GET /api/v1/community/chart

Public time-series chart data for analytics dashboards. No authentication required. Returns daily counts within the requested time window.

ParameterTypeDescription
windowstringTime 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.

How it works: Register (50 trial record actions, 10 RPM) → Use trial credits for record actions (attest, attest-mutual, mint) → Send CC from your Loop wallet to the Blueprint validator (minimum 1.0 CC; 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 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 TypeBase 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 HeldDiscountCC/ActionCC/Mutual
00%2.0005.000
5010%1.8004.500
10016.7%1.6674.167
20025%1.5003.750
50035.7%1.2863.214
1,00041.7%1.1672.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.

GET /api/v1/community/balance

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" } ] }
POST /api/v1/community/quote

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 }
Auto top-up: Send CC from your Loop wallet to the Blueprint validator address (minimum 1.0 CC). A background service watches the Canton ledger and auto-credits top-ups from a party already bound to your key, within seconds and with no API call. Your first top-up binds your Canton party and is claimed once by hand: put your key’s deposit code (returned by /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::1220daab58adcae026bd2ca7ad95014f678bda3ce2a6f91b744cf3ec3d87f09deeac

How 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.
POST /api/v1/community/deposit

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.

ActionStatusWhat It DoesKey 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
Data hashing (record actions): Your raw data never leaves your system. Compute a SHA-256 hash locally and send only the hash to ccledger. The on-chain record stores your hash; recompute and compare later to verify.

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' ' -f1

On-Chain Proof

Every action response includes a proof object. These fields are your verifiable, on-chain evidence that the action settled on Canton MainNet.

FieldFormatDescription
contractIdHex string (~140 chars)Unique identifier of the Daml contract on the ledger. This is the canonical reference for the on-chain record.
transactionIdHex string (68 chars)Canton transaction hash. Identifies the specific transaction that created the contract.
ledgerOffsetIntegerGlobal monotonically-increasing sequence number. Every transaction on the participant gets a unique offset.
synchronizerIdglobal-domain::1220...The Canton synchronization domain where the transaction was committed. global-domain = Canton MainNet.
effectiveAtISO 8601 timestampThe timestamp at which the transaction was committed by the Canton sequencer.
packageIdString or nullDaml package identifier. Always null for community action proofs; populated for enterprise (ledger submission) proofs.
templateIdString or nullFully 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 ledgerOffset gives a total ordering of all events. You can prove that record A was created before record B.
  • Timestamping — The effectiveAt timestamp 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.

Featured-app status: ccledger relays as the application provider but has not yet been granted a FeaturedAppRight by Super-Validator vote. 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

StepEndpointWho actsWhat happens
0GET /facilitation/statusYouReadiness probe — {enabled, featured, appProviderParty}.
1POST /facilitation/onboardccledger, then the senderOne-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.
2POST /facilitation/prepareccledgerBuilds the CreateTransferCommand and returns it prepared but unsubmitted.
3— local —YouEd25519-sign the raw bytes of the base64-decoded preparedTransactionHash (32 bytes). Your key never leaves your machine.
4POST /facilitation/executeccledgerRelays your signed command; your TransferCommand is created on-ledger.
5POST /facilitation/sendccledgerExercises TransferCommand_Send — your own CC moves to the receiver.
Participant prerequisites. The /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:
  1. 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.
  2. ccledger’s backend user must be granted CanActAs on that party, or /prepare cannot act as the sender.
The sender’s 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 transfer

Example — 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. If reason says “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, but updateId is null because it was not our transaction. Verify on-chain via the sender’s history on ccscan. Do not retry.
  • success: false with 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.

Daily limit: If you hit the 25/day cap, action endpoints return 429 with a message to try again tomorrow or send CC to upgrade.

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.

How it works: Use ccledger → Earn CCL (every 10 CC-paid actions) → Hold CCL to reduce your CC cost per action. CCL is never spent — only CC is charged, at the discounted rate.
1. Use ccledger
Pay CC per action (at discounted rate) — every 10th CC-paid action earns 1 CCL
2. Hold CCL for Discount
Discount based on the CCL you hold (cclOnchainHoldings). The more CCL you hold, the larger your discount.
3. Pay Less CC on Every Action

Discount Curve

Discount is based on cclOnchainHoldings — the CCL you hold on your ccledger account. Formula: discount = 50% × (1 - 1/(1 + cclOnchainHoldings/200))

CCL HeldDiscountCC/ActionCC/Mutual
00%2.0005.000
102.4%1.9524.881
5010%1.8004.500
10016.7%1.6674.167
20025%1.5003.750
50035.7%1.2863.214
1,00041.7%1.1672.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.

  1. 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.
  2. Your data is private — Only you can see your action detail, proofs and balance. Note that the unauthenticated GET /stats endpoint 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.
  3. 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.
  4. Rate limiting — Community tier: 10 RPM (50 trial TX, max 25/day). Paid tier: 100 RPM. Registration: 3 per IP per 24 hours.
  5. TLS everywhere — All connections use HTTPS with automatic certificate management. No plaintext data in transit.
  6. 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.

EndpointLimitWindow
Every request carrying X-API-Key — actions, queries, balance, quote, facilitation, webhooks, agent keys, on any path10 RPM (community) / 100 RPM (paid)Sliding 60 seconds, per API key
Registration3 requestsPer 24 hours, per IP
Sandbox key creation20 keysPer 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/mcp

Core tools

ToolDescriptionAuth
register_api_keyRegister for an API key (50 trial record-action credits)No
get_statsPublic network statisticsNo
quoteDry-run pricing preview — exact fee, CCL discount, balance, and affordability before spending (read-only)apiKey
submit_attestRecord an immutable attestation on-chain (2.0 CC fee or 1 trial credit)apiKey
submit_attest_mutualTwo-party co-signed attestation: pending_signature until the attestor accepts from their own wallet; 5.0 CC fee (or 1 trial credit)apiKey
submit_mintRecord an issuance/certificate; non-issuer, not CC (2.0 CC fee or 1 trial credit)apiKey
get_balanceFee credits, CCL discount balance (drives discount), tier, CCL mint progress, discounted ratesapiKey
deposit_ccManual fee-credit top-up fallback (top-ups are auto-detected; min 1.0 CC; non-refundable)apiKey
list_actionsList past actionsapiKey
get_action_by_idGet single action by UUIDapiKey
get_actionAlias for get_action_by_idapiKey
verify_recordPublic proof verification — pass an actionId, contractId, or transactionId and get the on-chain coordinates backNo

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

FAQ

What does ccledger cost?
Every API key includes 50 trial record actions (max 25/day) at 10 RPM — no payment required. To lift the trial cap (100 RPM), top up fee credits by sending CC from your Loop wallet to the Blueprint validator (minimum 1.0 CC); the first top-up is claimed once via 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.
Is ccledger custodial?
No — ccledger is non-custodial, and the policy is enforced in code. 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 — credits are a one-way prepayment, not a custodial balance). In the delegated facilitation flow, you keep your own wallet and keys, sign a CreateTransferCommand yourself, and ccledger relays and submits it as the application provider (the CIP-0104 confirmer role) — it never takes custody of your CC.
How do fee-credit top-ups work?
Prepay your per-action fees with CC. Send CC (minimum 1.0) from your Loop wallet to the Blueprint validator address (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.
What is Canton Network?
Canton Network is a privacy-enabled blockchain network for institutional applications. It uses Daml smart contracts with built-in privacy controls. Major financial institutions including Goldman Sachs, Deloitte, and S&P Global participate in the network. ccledger uses Canton MainNet — the production network.
Is this a testnet?
No. ccledger writes to Canton Global MainNet. Every contract ID, transaction hash, and ledger offset is a real, permanent record on the production network.
Do I need to install anything?
No. ccledger is a REST API. If you can make HTTP requests (curl, fetch, axios, requests), you can use it. No SDK, no wallet software, no blockchain node required.
Can I use this in production?
Yes, for record actions — they are live on MainNet. Every API key includes 50 trial record actions. To lift the trial cap (100 RPM), top up fee credits by sending CC from your Loop wallet to the Blueprint validator; the first top-up is claimed once via POST /deposit, later ones auto-credit. Value movement is live via the delegated facilitation flow. See Balance & Credits.
What happens to my on-chain records if Blueprint goes down?
Records already created on Canton MainNet are immutable and persist on the ledger regardless of Blueprint’s uptime. The contracts exist on the global domain, not on Blueprint’s infrastructure alone.
Can Blueprint modify or delete my records?
No. Once created, an on-chain record on Canton cannot be modified or deleted. The original contract and its data remain unchanged and permanent for the lifetime of the network.
What is the rewardMarkerCreated field?
This is a reserved field and always false. You can ignore it.
How do I verify my records independently?
Use the 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}.
What is CCL and how does the discount work?
CCL is the Builder Rewards discount credit for the ccledger ecosystem — an account-based, non-transferable credit, not a token. You earn 1 CCL per 10 CC-paid actions (trial actions do not count). Hold CCL to reduce your CC cost per action; the discount approaches ~50%. Your discount is based on the CCL you hold (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.
What’s the difference between the 3 record actions?
Two write immutable records and are fully live: attest (audit trails, compliance proofs) and mint (an issuance/certificate record — non-issuer, not Canton Coin). Attest-mutual (co-signed non-repudiation) is live: pending_signature until the attestor accepts, then confirmed; single-party attest is the live path. 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.

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/stats

Data Hash Verification

To verify that a record matches your original data:

  1. Retrieve the action from the API using its actionId
  2. Recompute the SHA-256 hash of your original data
  3. Compare the hash against the dataHash field in the response
  4. 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?

Open API Explorer Contact Us
Blueprint