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
publicwith 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
}
}
}Filter
All fields are optional and combine with AND. See Filters for the shared rules.
| Field | Type | Matches |
|---|---|---|
network | String | mainnet, testnet or devnet |
dataScope | UpdatesDataScope | PUBLIC 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
| Field | Type | Meaning |
|---|---|---|
network | String! | Network the update belongs to |
updateId | String! | Daml update ID in multihash format: 1220 followed by 64 lowercase hex characters, 68 characters in total |
migrationId | Int! | Synchronizer migration the update was recorded under. Together with updateId it identifies the update on the ledger |
recordTime | String! | 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 |
public | UpdatePublic | Set for public updates, otherwise null |
public.primaryAction | String! | 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.eventsSummaries | String! | JSON-encoded array with one summary per ledger event in the update. Parse it with your JSON library |
private | UpdatePrivate | Set for private updates, otherwise null |
private.provider | String! | Provider party ID of the venue (featured app) that submitted the transaction |
private.senders | [String!]! | Party IDs that submitted the transaction |
private.tokens | String | JSON-encoded map of the tokens involved, when CC View can tell. Otherwise null |
private.trafficInBytes | Int | Synchronizer traffic the transaction consumed, in bytes |
private.verdictResult | String! | 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
}
}
}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.