Scan Global Synchronizer Connectivity API
Splice network applications and validators need to be able to connect to multiple supervalidators’ Scan apps and Canton sequencers. If you have the base URL for a single SV Scan app, you can query for all other connected Scans and the SV sequencers. This lets you dynamically update your app configuration based on changing network SV configurations, and easily check that your own deployments can successfully connect to all needed endpoints. Additionally, you can query for all network-approved validators and get their details.
Listing all SV Scans
Every Scan can list all approved SV scans connected to the network. For example, query from /v0/scans from https://scan.sv-1.unknown_cluster.global.canton.network.sync.global, and the response will be something like
{
"scans": [
{
"domainId": "global-domain::122084177677350389dd0710d6516f700a33fe348c5f2702dffef6d36e1dedcbfc17",
"scans": [
/* several scans */,
{
"publicUrl": "https://scan.sv.dev.global.canton.network.digitalasset.com",
"svName": "DA-Helm-Test-Node"
},
/* several other scans */,
{
"publicUrl": "https://scan.sv-1.dev.global.canton.network.sync.global",
"svName": "Global-Synchronizer-Foundation"
}
]
}
]
}
scans
is a list of synchronizer IDs, each with an associated list of SVs and their Scan base URLs.
In this case, Global-Synchronizer-Foundation
matches the originally-used Scan.
Take any of these publicUrl
s and query /api/scan/v0/scans
, and the same set will be returned.
Listing all SV Sequencers
Likewise, Canton sequencers for all approved SVs are published by every Scan. For example, query from /v0/dso-sequencers, and the result will be something like
{
"domainSequencers": [
{
"domainId": "global-domain::122084177677350389dd0710d6516f700a33fe348c5f2702dffef6d36e1dedcbfc17",
"sequencers": [
/* several sequencers */,
{
"migrationId": 4,
"id": "SEQ::DA-Helm-Test-Node::122054dda14cc07dbf8cd56b392263c73b10630c0040f185b737ee5526c8d479ffab",
"url": "https://sequencer-4.sv.dev.global.canton.network.digitalasset.com",
"svName": "DA-Helm-Test-Node",
"availableAfter": "2024-11-29T15:25:05.771558Z"
},
/* several other sequencers */,
{
"migrationId": 4,
"id": "SEQ::Global-Synchronizer-Foundation::1220408be05ce20b9f7023ec1cad8af61f0280fd30a050ccf052660da2adf35549ed",
"url": "https://sequencer-4.sv-1.dev.global.canton.network.sync.global",
"svName": "Global-Synchronizer-Foundation",
"availableAfter": "2024-12-02T13:30:27.774745Z"
}
]
}
]
}
As svName
is the same as the svName
in Listing all SV Scans, it can be used to join the results of these endpoints, if necessary.
url
is the base URL of that SV’s sequencer.
Listing all Validators
Every validator approved on the network has a “license” on the ledger.
The /v0/admin/validator/licenses endpoint lists all of these in the form of Splice.ValidatorLicense:ValidatorLicense
Daml contracts.
These include:
onboarding identification, in the form of
validator
,sponsor
, anddso
,activity statistics, such as
faucetState
andlastActiveAt
, andother tertiary validator information in
metadata
.
All of these, and most other important data, are within the payload
property.
Other fields reflect that this is a Daml contract, and are useful for other Daml interactions.
These licenses can only record information about the past state of the network.
However, lastActiveAt
can be used to infer which validators are currently likely to be active on the network and which are inactive or disconnected.
Here’s a snippet of an example response from an active network:
{
"validator_licenses": [
/* many similar records */,
{
"template_id": "979ec710c3ae3a05cb44edf8461a9b4d7dd2053add95664f94fc89e5f18df80f:Splice.ValidatorLicense:ValidatorLicense",
"contract_id": "00e17d6e36499b656f8e248c31f18130e00db30332820b6b91da9f222049f3d078ca101220d189c2482b5018eae7c656561bf201a54deb276f81e8a0d715b7305d3a03abc3",
"payload": {
"dso": "DSO::122084177677350389dd0710d6516f700a33fe348c5f2702dffef6d36e1dedcbfc17",
"sponsor": "Digital-Asset-2::1220dcf294bffd10439167f7460b1b6926b7a87d3237b748c7de6d7367fad3e33b20",
"lastActiveAt": "2025-01-23T12:48:21.220193Z",
"validator": "digitalasset-testValidator-1::1220167abbb792b81e5fb1dc45311f32eb9d796c46a5100a1cd446979176f699e117",
"faucetState": {
"firstReceivedFor": {
"number": "17087"
},
"lastReceivedFor": {
"number": "17122"
},
"numCouponsMissed": "0"
},
"metadata": {
"lastUpdatedAt": "2025-01-23T07:03:50.820769Z",
"version": "0.3.6",
"contactPoint": "sv-support@example.com"
}
},
"created_event_blob": "CgMyLjESwgYKRQDhfW42SZtlb44kjDHxgTDgDbMDMoILa5HanyIgSfPQeMoQEiDRicJIK1AY6ufGVlYb8gGlTesnb4HooNcVtzBdOgOrwxINc3BsaWNlLWFtdWxldBpuCkA5NzllYzcxMGMzYWUzYTA1Y2I0NGVkZjg0NjFhOWI0ZDdkZDIwNTNhZGQ5NTY2NGY5NGZjODllNWYxOGRmODBmEgZTcGxpY2USEFZhbGlkYXRvckxpY2Vuc2UaEFZhbGlkYXRvckxpY2Vuc2UilQNqkgMKZgpkOmJkaWdpdGFsYXNzZXQtdGVzdFZhbGlkYXRvci0xOjoxMjIwMTY3YWJiYjc5MmI4MWU1ZmIxZGM0NTMxMWYzMmViOWQ3OTZjNDZhNTEwMGExY2Q0NDY5NzkxNzZmNjk5ZTExNwpZClc6VURpZ2l0YWwtQXNzZXQtMjo6MTIyMGRjZjI5NGJmZmQxMDQzOTE2N2Y3NDYwYjFiNjkyNmI3YTg3ZDMyMzdiNzQ4YzdkZTZkNzM2N2ZhZDNlMzNiMjAKTQpLOklEU086OjEyMjA4NDE3NzY3NzM1MDM4OWRkMDcxMGQ2NTE2ZjcwMGEzM2ZlMzQ4YzVmMjcwMmRmZmVmNmQzNmUxZGVkY2JmYzE3CioKKFImCiRqIgoMCgpqCAoGCgQY/ooCCgwKCmoICgYKBBjEiwIKBAoCGAAKQQo/Uj0KO2o5CgsKCSmhJ1o2WiwGAAoJCgdCBTAuMy42Ch8KHUIbc3Ytc3VwcG9ydEBkaWdpdGFsYXNzZXQuY29tCg8KDVILCgkpYWtnBl8sBgAqSURTTzo6MTIyMDg0MTc3Njc3MzUwMzg5ZGQwNzEwZDY1MTZmNzAwYTMzZmUzNDhjNWYyNzAyZGZmZWY2ZDM2ZTFkZWRjYmZjMTcyYmRpZ2l0YWxhc3NldC10ZXN0VmFsaWRhdG9yLTE6OjEyMjAxNjdhYmJiNzkyYjgxZTVmYjFkYzQ1MzExZjMyZWI5ZDc5NmM0NmE1MTAwYTFjZDQ0Njk3OTE3NmY2OTllMTE3OWFrZwZfLAYAQioKJgokCAESIBhgA7BpKZodv42OaTYfxCqk4WQhgRJ+scPIQtmbh96gEB4=",
"created_at": "2025-01-23T12:48:21.220193Z"
},
/* many similar records */,
],
"next_page_token": 6033
}
Passing this next_page_token
as the after
query parameter, you might see another page;
the sequence of pages terminates with an absent or null token as follows:
{
"validator_licenses": [],
"next_page_token": null
}
Parties’ Hosting Participants
In any Canton deployment, each party is hosted on a participant. This can be accessed through Scan with /v0/domains/{domain_id}/parties/{party_id}/participant-id.
For example, looking up /v0/domains/global-domain::122084177677350389dd0710d6516f700a33fe348c5f2702dffef6d36e1dedcbfc17/parties/digitalasset-testValidator-1::1220e92bbc9d80cb6e283184017b307b9f44f23d32d7d195cdbcac033ae91eac2f28/participant-id
on a test network yields
{
"participant_id": "PAR::validator-runbook::1220e92bbc9d80cb6e283184017b307b9f44f23d32d7d195cdbcac033ae91eac2f28"
}