Updates Stream

updatesCreated pushes every ledger update, with the transaction content when it is public and the verdict metadata when it is not.

updatesCreated emits a batch of ledger updates recorded at the same moment, that is committed transactions on a Canton synchronizer, as CC View indexes them. Each event carries an array of updates. It is the widest stream: transfers, token instructions, traffic purchases, governance votes, reward issuance and app-specific contracts all arrive here.

Use it for transaction monitoring, compliance screening and forensics, where you need to see every action a party takes, including the ones that are not simple transfers.

Public and private updates

Canton keeps transaction content private to the parties involved. CC View therefore knows two kinds of updates, and the event tells you which one you got:

  • Public update. The transaction content is visible to CC View, for example a Canton Coin transfer or a DSO governance action. The event carries public with the main action and a summary of every ledger event in the update.
  • Private update. The content is confidential. What CC View knows comes from the synchronizer and the mediator: which parties submitted it, through which venue, how much traffic it consumed and whether it was accepted. The event carries private.

An event carries one of the two. The other is null. Use the dataScope filter to receive only one kind.

Subscribe

Public updates on mainnet, with the action and the event summaries:

subscription Updates {
  updatesCreated(filter: { network: "mainnet", dataScope: PUBLIC }) {
    recordTime
    updateId
    migrationId
    actingParties
    instruments
    public {
      primaryAction
      eventsSummaries
    }
  }
}

Open in GraphiQL ↗

Filter

All fields are optional and combine with AND. See Filters for the shared rules.

FieldTypeMatches
networkStringmainnet, testnet or devnet
dataScopeUpdatesDataScopePUBLIC delivers only updates with a public payload, PRIVATE only updates with a private payload. Omit to receive both
actingParties[String!]Party IDs. An update matches when any of them acted in it
instruments[String!]Instrument (asset issuer) party IDs. An update matches when it touches any of them

Event fields

FieldTypeMeaning
networkString!Network the update belongs to
updateIdString!Daml update ID in multihash format: 1220 followed by 64 lowercase hex characters, 68 characters in total
migrationIdInt!Synchronizer migration the update was recorded under. Together with updateId it identifies the update on the ledger
recordTimeString!Ledger record time, ISO 8601 UTC
actingParties[String!]!Party IDs that acted in the update
instruments[String!]!Instrument (asset issuer) party IDs touched by the update. Empty when the update does not touch a token
publicUpdatePublicSet for public updates, otherwise null
public.primaryActionString!The main action of the transaction. Uses the same taxonomy as Get update details: transfer, token_instruction, token_allocation, transfer_command, traffic_purchase, preapproval, validator_activity, activity_marker, governance, rewards, mining_round, amulet_lifecycle, other
public.eventsSummariesString!JSON-encoded array with one summary per ledger event in the update. Parse it with your JSON library
privateUpdatePrivateSet for private updates, otherwise null
private.providerString!Provider party ID of the venue (featured app) that submitted the transaction
private.senders[String!]!Party IDs that submitted the transaction
private.tokensStringJSON-encoded map of the tokens involved, when CC View can tell. Otherwise null
private.trafficInBytesIntSynchronizer traffic the transaction consumed, in bytes
private.verdictResultString!The mediator's verdict for the transaction

Example message

A public transfer and a private app transaction in one batch. Values are illustrative.

{
  "data": {
    "updatesCreated": [
      {
        "recordTime": "2026-09-30T14:03:11.482913130Z",
        "updateId": "122050503ac262ae61001e430f2ba3ff9b1854b74f78a1a1da1f8f9948640088591f",
        "migrationId": 4,
        "actingParties": ["alice::1220a3f0c2…", "bob::1220c81d9e…"],
        "instruments": [],
        "public": {
          "primaryAction": "transfer",
          "eventsSummaries": "[{\"type\":\"exercised\",\"template\":\"Splice.AmuletRules:AmuletRules\",\"choice\":\"AmuletRules_Transfer\"}]"
        },
        "private": null
      },
      {
        "recordTime": "2026-09-30T14:03:11.982004512Z",
        "updateId": "1220a7c4e1d9b2f6…",
        "migrationId": 4,
        "actingParties": ["venue-1::12203b7a0f…"],
        "instruments": ["issuer-x::1220d44c1a…"],
        "public": null,
        "private": {
          "provider": "venue-1::12203b7a0f…",
          "senders": ["venue-1::12203b7a0f…"],
          "tokens": null,
          "trafficInBytes": 18432,
          "verdictResult": "accepted"
        }
      }
    ]
  }
}

Example: watch a venue's private activity

Filter on dataScope: PRIVATE and the venue's party ID. You will see every confidential transaction the venue submits, with its traffic cost and verdict, without seeing the content.

subscription PrivateUpdates {
  updatesCreated(
    filter: { network: "mainnet", dataScope: PRIVATE, actingParties: ["venue-1::12203b7a…"] }
  ) {
    recordTime
    updateId
    actingParties
    private {
      provider
      senders
      trafficInBytes
      verdictResult
    }
  }
}

Open in GraphiQL ↗

Related REST endpoints

Updates list for history and backfill. Get update details for the enriched view of one update, with a human-readable summary and the action classification. Verdicts list for mediator verdicts.