Canton Network docsSplice APIs › Scan APIs › Scan API
GET /v1/dso
Updated 02-11-2026
cURL
Python
JavaScript
PHP
Go
Java
Ruby
curl --request GET \
--url 'https://scan.sv-1.global.canton.network.sync.global/api/scan/v1/dso'
import json
import requests
url = "https://scan.sv-1.global.canton.network.sync.global/api/scan/v1/dso"
response = requests.request("GET", url)
print(response.text)
const response = await fetch('https://scan.sv-1.global.canton.network.sync.global/api/scan/v1/dso', {
method: 'GET',
});
console.log(await response.text());
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://scan.sv-1.global.canton.network.sync.global/api/scan/v1/dso',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
]);
$response = curl_exec($curl);
echo $response;
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://scan.sv-1.global.canton.network.sync.global/api/scan/v1/dso", nil)
response, _ := http.DefaultClient.Do(req)
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
var request = HttpRequest.newBuilder()
.uri(URI.create("https://scan.sv-1.global.canton.network.sync.global/api/scan/v1/dso"))
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
var response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
require 'net/http'
require 'uri'
uri = URI('https://scan.sv-1.global.canton.network.sync.global/api/scan/v1/dso')
request = Net::HTTP::Get.new(uri)
response = Net::HTTP.start(uri.hostname, uri.port) do |http|
http.request(request)
end
puts response.body
200
{
"dso_party_id": "<string>",
"voting_threshold": 123,
"latest_mining_round": {
"contract": {
"template_id": "<string>",
"contract_id": "<string>",
"payload": {},
"created_event_blob": "<string>",
"created_at": "<string>"
},
"domain_id": "<string>"
},
"amulet_rules": {
"contract": {
"template_id": "<string>",
"contract_id": "<string>",
"payload": {},
"created_event_blob": "<string>",
"created_at": "<string>"
},
"domain_id": "<string>"
},
"dso_rules": {
"contract": {
"template_id": "<string>",
"contract_id": "<string>",
"payload": {},
"created_event_blob": "<string>",
"created_at": "<string>"
},
"domain_id": "<string>"
},
"sv_node_states": [
{
"contract": {
"template_id": "<string>",
"contract_id": "<string>",
"payload": {},
"created_event_blob": "<string>",
"created_at": "<string>"
},
"domain_id": "<string>"
}
],
"initial_round": "<string>"
}
GET
/
api
/
scan
/
v1
/
dso
cURL
Python
JavaScript
PHP
Go
Java
Ruby
curl --request GET \
--url 'https://scan.sv-1.global.canton.network.sync.global/api/scan/v1/dso'
import json
import requests
url = "https://scan.sv-1.global.canton.network.sync.global/api/scan/v1/dso"
response = requests.request("GET", url)
print(response.text)
const response = await fetch('https://scan.sv-1.global.canton.network.sync.global/api/scan/v1/dso', {
method: 'GET',
});
console.log(await response.text());
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://scan.sv-1.global.canton.network.sync.global/api/scan/v1/dso',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
]);
$response = curl_exec($curl);
echo $response;
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://scan.sv-1.global.canton.network.sync.global/api/scan/v1/dso", nil)
response, _ := http.DefaultClient.Do(req)
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
var request = HttpRequest.newBuilder()
.uri(URI.create("https://scan.sv-1.global.canton.network.sync.global/api/scan/v1/dso"))
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
var response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
require 'net/http'
require 'uri'
uri = URI('https://scan.sv-1.global.canton.network.sync.global/api/scan/v1/dso')
request = Net::HTTP::Get.new(uri)
response = Net::HTTP.start(uri.hostname, uri.port) do |http|
http.request(request)
end
puts response.body
200
{
"dso_party_id": "<string>",
"voting_threshold": 123,
"latest_mining_round": {
"contract": {
"template_id": "<string>",
"contract_id": "<string>",
"payload": {},
"created_event_blob": "<string>",
"created_at": "<string>"
},
"domain_id": "<string>"
},
"amulet_rules": {
"contract": {
"template_id": "<string>",
"contract_id": "<string>",
"payload": {},
"created_event_blob": "<string>",
"created_at": "<string>"
},
"domain_id": "<string>"
},
"dso_rules": {
"contract": {
"template_id": "<string>",
"contract_id": "<string>",
"payload": {},
"created_event_blob": "<string>",
"created_at": "<string>"
},
"domain_id": "<string>"
},
"sv_node_states": [
{
"contract": {
"template_id": "<string>",
"contract_id": "<string>",
"payload": {},
"created_event_blob": "<string>",
"created_at": "<string>"
},
"domain_id": "<string>"
}
],
"initial_round": "<string>"
}
Returns information about the DSO. Can be used in BFT reads.
OpenAPIAdded 0.10.0
cURL
Python
JavaScript
PHP
Go
Java
Ruby
curl --request GET \
--url 'https://scan.sv-1.global.canton.network.sync.global/api/scan/v1/dso'
import json
import requests
url = "https://scan.sv-1.global.canton.network.sync.global/api/scan/v1/dso"
response = requests.request("GET", url)
print(response.text)
const response = await fetch('https://scan.sv-1.global.canton.network.sync.global/api/scan/v1/dso', {
method: 'GET',
});
console.log(await response.text());
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://scan.sv-1.global.canton.network.sync.global/api/scan/v1/dso',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
]);
$response = curl_exec($curl);
echo $response;
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://scan.sv-1.global.canton.network.sync.global/api/scan/v1/dso", nil)
response, _ := http.DefaultClient.Do(req)
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
var request = HttpRequest.newBuilder()
.uri(URI.create("https://scan.sv-1.global.canton.network.sync.global/api/scan/v1/dso"))
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
var response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
require 'net/http'
require 'uri'
uri = URI('https://scan.sv-1.global.canton.network.sync.global/api/scan/v1/dso')
request = Net::HTTP::Get.new(uri)
response = Net::HTTP.start(uri.hostname, uri.port) do |http|
http.request(request)
end
puts response.body
200
{
"dso_party_id": "<string>",
"voting_threshold": 123,
"latest_mining_round": {
"contract": {
"template_id": "<string>",
"contract_id": "<string>",
"payload": {},
"created_event_blob": "<string>",
"created_at": "<string>"
},
"domain_id": "<string>"
},
"amulet_rules": {
"contract": {
"template_id": "<string>",
"contract_id": "<string>",
"payload": {},
"created_event_blob": "<string>",
"created_at": "<string>"
},
"domain_id": "<string>"
},
"dso_rules": {
"contract": {
"template_id": "<string>",
"contract_id": "<string>",
"payload": {},
"created_event_blob": "<string>",
"created_at": "<string>"
},
"domain_id": "<string>"
},
"sv_node_states": [
{
"contract": {
"template_id": "<string>",
"contract_id": "<string>",
"payload": {},
"created_event_blob": "<string>",
"created_at": "<string>"
},
"domain_id": "<string>"
}
],
"initial_round": "<string>"
}
Responses
200
okapplication/json
dso_party_id
string
required
Party representing the whole DSO; for Scan only, also returned by
/v0/dso-party-idvoting_threshold
integer
required
Threshold required to pass vote requests; also known as the “governance threshold”, it is always derived from the number of
svs in dso_ruleslatest_mining_round
ContractWithState
required
Contract of the Daml template
Splice.Round.OpenMiningRound, the one with the highest round number on the ledger that has been signed by dso_party_id. The round may not be usable as it may not be opened yet, in accordance with its opensAt template fieldamulet_rules
ContractWithState
required
Contract of the Daml template
Splice.AmuletRules.AmuletRules, including the full schedule of AmuletConfig changes approved by the DSO. Callers should not assume that initialValue is up-to-date, and should instead search futureValues for the latest configuration valid as of nowdso_rules
ContractWithState
required
Contract of the Daml template
Splice.DsoRules.DsoRules, listing the governance rules approved by the DSO governing this Splice network.sv_node_states
ContractWithState[]
required
For every one of
svs listed in dso_rules, a contract of the Daml template Splice.DSO.SvState.SvNodeState. This does not include states for offboarded SVs, though they may still have an on-ledger state contractinitial_round
string
Initial round from which the network bootstraps
History
Added
0.10.0