Ledger Service API

Canton Network access layer providing balance queries, token transfers, party management, and smart contract interactions on the Canton ledger.

Endpoints

Identity & Status

MethodEndpointDescription
GET/api/ledger/identityGet ledger identity (ledger ID, participant ID, validator name, network)
GET/api/ledger/timeGet current ledger time
GET/api/ledger/statusGet ledger connection status (participant, synchronizer)
GET/api/ledger/statsGet ledger statistics (total contracts, parties, packages, domains)
GET/api/ledger/domainsList connected synchronization domains
GET/api/ledger/organizationsList organizations

Parties

MethodEndpointDescription
GET/api/ledger/partiesList tenant's parties (supports pagination via query params)
POST/api/ledger/partiesAllocate new party on Canton
GET/api/ledger/parties/:partyIdGet a party by ID
PUT/api/ledger/parties/:partyIdUpdate party display name or annotations

Balance & Transfers

MethodEndpointDescription
GET/api/ledger/balance/:partyIdGet CC/Amulet balance for party
POST/api/ledger/transferTransfer tokens between parties

Contracts

MethodEndpointDescription
GET/api/ledger/contractsList contracts (supports pagination via query params)
POST/api/ledger/contractsCreate contract on ledger
GET/api/ledger/contracts/:idGet contract by ID
POST/api/ledger/contracts/:id/exerciseExercise choice on contract
POST/api/ledger/contracts/:id/archiveArchive a contract
GET/api/ledger/contracts/queryQuery contracts by party and template
POST/api/ledger/contracts/queryAdvanced filtered contract query (template IDs, status, domain, timestamps, payload search)

Packages

MethodEndpointDescription
GET/api/ledger/packagesList uploaded DAR packages (supports pagination)
POST/api/ledger/packagesUpload a DAR package (base64-encoded)
GET/api/ledger/packages/:packageIdGet package by ID
DELETE/api/ledger/packages/:packageIdDelete a package
GET/api/ledger/packages/:packageId/templatesGet templates defined in a package

Commands

MethodEndpointDescription
POST/api/ledger/commandsSubmit a command to the Canton ledger (create, exercise, createAndExercise)

Transactions

MethodEndpointDescription
GET/api/ledger/transactionsGet transaction history for a party (supports pagination)
POST/api/ledger/transactions/queryAdvanced filtered transaction query (template IDs, event types, offsets)

Allocations

MethodEndpointDescription
GET/api/ledger/allocationsList Canton allocations for this tenant (supports pagination)
POST/api/ledger/allocationsCreate a new Canton allocation for an app
GET/api/ledger/allocations/:idGet allocation by ID
PUT/api/ledger/allocations/:id/statusUpdate allocation status (active, suspended, revoked)
DELETE/api/ledger/allocations/:idDelete/revoke an allocation
GET/api/ledger/allocations/:id/partiesList sub-parties under an allocation
POST/api/ledger/allocations/:id/partiesCreate a sub-party under an allocation

Usage

MethodEndpointDescription
GET/api/ledger/usageGet usage statistics (filterable by app_id, start_date, end_date)

Get Balance

GET /api/ledger/balance/party::alice::12345
X-API-Key: tnz_yourtenant_yoursecretkey
X-Tenant-Id: your-tenant-id

Response

{
  "data": {
    "partyId": "party::alice::12345",
    "unlocked_cc": "985.50",
    "locked_cc": "14.50",
    "total_cc": "1000.00",
    "connected": true,
    "lastUpdated": "2024-01-15T10:30:00Z"
  }
}

Transfer Tokens

POST /api/ledger/transfer
X-API-Key: tnz_yourtenant_yoursecretkey
X-Tenant-Id: your-tenant-id
Content-Type: application/json

{
  "from_party_id": "party::alice::12345",
  "to_party_id": "party::bob::67890",
  "amount": "100.00",
  "reference": "Payment for services"
}

Response

{
  "data": {
    "transactionId": "tx_abc123",
    "from_party_id": "party::alice::12345",
    "to_party_id": "party::bob::67890",
    "amount": "100.00",
    "status": "completed",
    "completedAt": "2024-01-15T10:30:00Z"
  }
}

Allocate Party

POST /api/ledger/parties
X-API-Key: tnz_yourtenant_yoursecretkey
X-Tenant-Id: your-tenant-id
Content-Type: application/json

{
  "displayName": "Treasury Wallet",
  "partyHint": "treasury"
}

Response

{
  "data": {
    "partyId": "party::treasury::54321",
    "displayName": "Treasury Wallet",
    "createdAt": "2024-01-15T10:30:00Z"
  }
}

List Parties

GET /api/ledger/parties
X-API-Key: tnz_yourtenant_yoursecretkey
X-Tenant-Id: your-tenant-id

Response

{
  "data": [
    {
      "partyId": "party::alice::12345",
      "displayName": "Alice",
      "createdAt": "2024-01-01T00:00:00Z"
    },
    {
      "partyId": "party::treasury::54321",
      "displayName": "Treasury Wallet",
      "createdAt": "2024-01-15T10:30:00Z"
    }
  ]
}

Create Contract

POST /api/ledger/contracts
X-API-Key: tnz_yourtenant_yoursecretkey
X-Tenant-Id: your-tenant-id
Content-Type: application/json

{
  "templateId": "Tenzro.Token:Asset",
  "payload": {
    "owner": "party::alice::12345",
    "amount": "1000.00",
    "symbol": "USDC"
  }
}

Exercise Choice

POST /api/ledger/contracts/contract_abc123/exercise
X-API-Key: tnz_yourtenant_yoursecretkey
X-Tenant-Id: your-tenant-id
Content-Type: application/json

{
  "choice": "Transfer",
  "argument": {
    "newOwner": "party::bob::67890",
    "amount": "100.00"
  }
}

Update Party

PUT /api/ledger/parties/party::treasury::54321
X-API-Key: tnz_yourtenant_yoursecretkey
X-Tenant-Id: your-tenant-id
Content-Type: application/json

{
  "displayName": "Main Treasury",
  "annotations": {
    "role": "treasury",
    "department": "finance"
  }
}

Response

{
  "data": {
    "partyId": "party::treasury::54321",
    "displayName": "Main Treasury",
    "isLocal": true,
    "annotations": {
      "role": "treasury",
      "department": "finance"
    }
  }
}

Upload Package

POST /api/ledger/packages
X-API-Key: tnz_yourtenant_yoursecretkey
X-Tenant-Id: your-tenant-id
Content-Type: application/json

{
  "name": "my-token-model",
  "version": "1.0.0",
  "dar_content": "<base64-encoded DAR file>"
}

Response

{
  "data": {
    "packageId": "pkg_abc123",
    "name": "my-token-model",
    "version": "1.0.0",
    "uploadedAt": "2024-01-15T10:30:00Z",
    "modules": ["Tenzro.Token", "Tenzro.Token.Types"]
  }
}

Get Package Templates

GET /api/ledger/packages/pkg_abc123/templates
X-API-Key: tnz_yourtenant_yoursecretkey
X-Tenant-Id: your-tenant-id

Response

{
  "data": [
    {
      "templateId": "Tenzro.Token:Asset",
      "moduleName": "Tenzro.Token",
      "templateName": "Asset",
      "choices": ["Transfer", "Split", "Merge", "Archive"],
      "signatories": ["owner"],
      "observers": ["regulator"]
    }
  ]
}

Submit Command

POST /api/ledger/commands
X-API-Key: tnz_yourtenant_yoursecretkey
X-Tenant-Id: your-tenant-id
Content-Type: application/json

{
  "partyId": "party::alice::12345",
  "commands": [
    {
      "type": "create",
      "templateId": "Tenzro.Token:Asset",
      "payload": {
        "owner": "party::alice::12345",
        "amount": "500.00"
      }
    }
  ]
}

Response

{
  "data": {
    "success": true,
    "transactionId": "tx_cmd_456"
  }
}

Get Transaction History

GET /api/ledger/transactions?partyId=party::alice::12345&limit=50
X-API-Key: tnz_yourtenant_yoursecretkey
X-Tenant-Id: your-tenant-id

Response

{
  "transactions": [
    {
      "transactionId": "tx_abc123",
      "commandId": "cmd_001",
      "offset": "000000000000001234",
      "effectiveAt": "2024-01-15T10:30:00Z",
      "events": [
        {
          "type": "created",
          "contractId": "contract_xyz",
          "templateId": "Tenzro.Token:Asset",
          "payload": { "owner": "party::alice::12345", "amount": "1000.00" }
        }
      ]
    }
  ]
}

Filtered Contract Query

POST /api/ledger/contracts/query
X-API-Key: tnz_yourtenant_yoursecretkey
X-Tenant-Id: your-tenant-id
Content-Type: application/json

{
  "party_id": "party::alice::12345",
  "template_ids": ["Tenzro.Token:Asset"],
  "status": "active",
  "domain_id": "global-domain",
  "created_after": "2024-01-01T00:00:00Z",
  "payload_search": "USDC"
}

Create Allocation

POST /api/ledger/allocations
X-API-Key: tnz_yourtenant_yoursecretkey
X-Tenant-Id: your-tenant-id
Content-Type: application/json

{
  "appId": "my-defi-app",
  "appName": "My DeFi Application",
  "network": "devnet",
  "maxTransactionsPerDay": 10000,
  "maxContracts": 5000,
  "maxParties": 100
}

Response

{
  "data": {
    "id": "alloc_789",
    "appId": "my-defi-app",
    "appName": "My DeFi Application",
    "tenantId": "your-tenant-id",
    "participantId": "participant::abc",
    "partyId": "party::my-defi-app::99999",
    "network": "devnet",
    "status": "active",
    "createdAt": "2024-01-15T10:30:00Z"
  }
}

Pagination

List endpoints support cursor-based pagination via query parameters:

GET /api/ledger/contracts?pageSize=25&pageToken=eyJvZmZzZXQiOjI1fQ==
X-API-Key: tnz_yourtenant_yoursecretkey
X-Tenant-Id: your-tenant-id

Response

{
  "items": [...],
  "nextPageToken": "eyJvZmZzZXQiOjUwfQ==",
  "totalSize": 150,
  "hasMore": true
}

Paginated list endpoints: /api/ledger/contracts, /api/ledger/parties, /api/ledger/packages, /api/ledger/transactions, /api/ledger/allocations.

Get Ledger Time

GET /api/ledger/time
X-API-Key: tnz_yourtenant_yoursecretkey
X-Tenant-Id: your-tenant-id

Response

{
  "data": {
    "currentTime": "2024-01-15T10:30:00Z",
    "ledgerEffectiveTime": "2024-01-15T10:30:00Z"
  }
}

Get Ledger Stats

GET /api/ledger/stats
X-API-Key: tnz_yourtenant_yoursecretkey
X-Tenant-Id: your-tenant-id

Response

{
  "data": {
    "totalContracts": 1250,
    "activeContracts": 890,
    "totalParties": 45,
    "totalPackages": 12,
    "connectedDomains": 2
  }
}

Canton Network Integration

The Ledger Service connects to Canton Network, a privacy-first enterprise blockchain. Key concepts:

  • Parties - Identities on the ledger that can own contracts
  • Contracts - Smart contract instances with state
  • Choices - Actions that can be exercised on contracts
  • Domains - Synchronization domains for privacy isolation

Error Codes

CodeDescription
PARTY_NOT_FOUNDParty does not exist
INSUFFICIENT_BALANCENot enough balance for transfer
CONTRACT_NOT_FOUNDContract does not exist or is archived
INVALID_CHOICEChoice not available on contract
DOMAIN_UNAVAILABLESynchronization domain not available