curl --request POST \
--url 'https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/holdings/summary' \
--header 'Content-Type: application/json' \
--data '{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"owner_party_ids": [
"<string>"
],
"as_of_round": 123
}'
import json
import requests
url = "https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/holdings/summary"
headers = {'Content-Type': 'application/json'}
payload = json.loads(r'''{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"owner_party_ids": [
"<string>"
],
"as_of_round": 123
}''')
response = requests.request(
"POST", url, headers=headers, json=payload
)
print(response.text)
const response = await fetch('https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/holdings/summary', {
method: 'POST',
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"owner_party_ids": [
"<string>"
],
"as_of_round": 123
}),
});
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/v0/holdings/summary',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => <<<'JSON'
{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"owner_party_ids": [
"<string>"
],
"as_of_round": 123
}
JSON,
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
echo $response;
package main
import (
"bytes"
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("POST", "https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/holdings/summary", bytes.NewBufferString(`{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"owner_party_ids": [
"<string>"
],
"as_of_round": 123
}`))
req.Header.Set("Content-Type", "application/json")
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/v0/holdings/summary"))
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("""
{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"owner_party_ids": [
"<string>"
],
"as_of_round": 123
}
"""))
.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/v0/holdings/summary')
request = Net::HTTP::Post.new(uri)
request['Content-Type'] = 'application/json'
request.body = <<~JSON
{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"owner_party_ids": [
"<string>"
],
"as_of_round": 123
}
JSON
response = Net::HTTP.start(uri.hostname, uri.port) do |http|
http.request(request)
end
puts response.body
{
"record_time": "2026-01-01T00:00:00Z",
"migration_id": 123,
"computed_as_of_round": 123,
"summaries": [
{
"party_id": "<string>",
"total_unlocked_coin": "<string>",
"total_locked_coin": "<string>",
"total_coin_holdings": "<string>",
"accumulated_holding_fees_unlocked": "<string>",
"accumulated_holding_fees_locked": "<string>",
"accumulated_holding_fees_total": "<string>",
"total_available_coin": "<string>"
}
]
}
{
"error": "<string>"
}
{
"error": "<string>"
}
{
"error": "<string>"
}
POST /v0/holdings/summary
Deprecated. Please use /v1/holdings/summary instead. Returns the summary of active amulet contracts for a given migration id and record time, for the given parties. This is an aggregate of /v0/holdings/state by owner party ID with better performance than client-side computation.
POST
/
api
/
scan
/
v0
/
holdings
/
summary
curl --request POST \
--url 'https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/holdings/summary' \
--header 'Content-Type: application/json' \
--data '{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"owner_party_ids": [
"<string>"
],
"as_of_round": 123
}'
import json
import requests
url = "https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/holdings/summary"
headers = {'Content-Type': 'application/json'}
payload = json.loads(r'''{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"owner_party_ids": [
"<string>"
],
"as_of_round": 123
}''')
response = requests.request(
"POST", url, headers=headers, json=payload
)
print(response.text)
const response = await fetch('https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/holdings/summary', {
method: 'POST',
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"owner_party_ids": [
"<string>"
],
"as_of_round": 123
}),
});
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/v0/holdings/summary',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => <<<'JSON'
{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"owner_party_ids": [
"<string>"
],
"as_of_round": 123
}
JSON,
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
echo $response;
package main
import (
"bytes"
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("POST", "https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/holdings/summary", bytes.NewBufferString(`{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"owner_party_ids": [
"<string>"
],
"as_of_round": 123
}`))
req.Header.Set("Content-Type", "application/json")
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/v0/holdings/summary"))
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("""
{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"owner_party_ids": [
"<string>"
],
"as_of_round": 123
}
"""))
.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/v0/holdings/summary')
request = Net::HTTP::Post.new(uri)
request['Content-Type'] = 'application/json'
request.body = <<~JSON
{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"owner_party_ids": [
"<string>"
],
"as_of_round": 123
}
JSON
response = Net::HTTP.start(uri.hostname, uri.port) do |http|
http.request(request)
end
puts response.body
{
"record_time": "2026-01-01T00:00:00Z",
"migration_id": 123,
"computed_as_of_round": 123,
"summaries": [
{
"party_id": "<string>",
"total_unlocked_coin": "<string>",
"total_locked_coin": "<string>",
"total_coin_holdings": "<string>",
"accumulated_holding_fees_unlocked": "<string>",
"accumulated_holding_fees_locked": "<string>",
"accumulated_holding_fees_total": "<string>",
"total_available_coin": "<string>"
}
]
}
{
"error": "<string>"
}
{
"error": "<string>"
}
{
"error": "<string>"
}
Deprecated. Please use /v1/holdings/summary instead. Returns the summary of active amulet contracts for a given migration id and record time, for the given parties. This is an aggregate of /v0/holdings/state by owner party ID with better performance than client-side computation.
curl --request POST \
--url 'https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/holdings/summary' \
--header 'Content-Type: application/json' \
--data '{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"owner_party_ids": [
"<string>"
],
"as_of_round": 123
}'
import json
import requests
url = "https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/holdings/summary"
headers = {'Content-Type': 'application/json'}
payload = json.loads(r'''{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"owner_party_ids": [
"<string>"
],
"as_of_round": 123
}''')
response = requests.request(
"POST", url, headers=headers, json=payload
)
print(response.text)
const response = await fetch('https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/holdings/summary', {
method: 'POST',
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"owner_party_ids": [
"<string>"
],
"as_of_round": 123
}),
});
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/v0/holdings/summary',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => <<<'JSON'
{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"owner_party_ids": [
"<string>"
],
"as_of_round": 123
}
JSON,
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
echo $response;
package main
import (
"bytes"
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("POST", "https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/holdings/summary", bytes.NewBufferString(`{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"owner_party_ids": [
"<string>"
],
"as_of_round": 123
}`))
req.Header.Set("Content-Type", "application/json")
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/v0/holdings/summary"))
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("""
{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"owner_party_ids": [
"<string>"
],
"as_of_round": 123
}
"""))
.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/v0/holdings/summary')
request = Net::HTTP::Post.new(uri)
request['Content-Type'] = 'application/json'
request.body = <<~JSON
{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"owner_party_ids": [
"<string>"
],
"as_of_round": 123
}
JSON
response = Net::HTTP.start(uri.hostname, uri.port) do |http|
http.request(request)
end
puts response.body
{
"record_time": "2026-01-01T00:00:00Z",
"migration_id": 123,
"computed_as_of_round": 123,
"summaries": [
{
"party_id": "<string>",
"total_unlocked_coin": "<string>",
"total_locked_coin": "<string>",
"total_coin_holdings": "<string>",
"accumulated_holding_fees_unlocked": "<string>",
"accumulated_holding_fees_locked": "<string>",
"accumulated_holding_fees_total": "<string>",
"total_available_coin": "<string>"
}
]
}
{
"error": "<string>"
}
{
"error": "<string>"
}
{
"error": "<string>"
}
Body
application/json
number
required
OpenAPI type:
integer (int64).The migration id for which to return the summary.string
required
OpenAPI type:
string (date-time).The timestamp at which the contract set was active. This needs to be an exact timestamp, i.e., needs to correspond to a timestamp reported by /v0/state/acs/snapshot-timestamp if record_time_match is set to exact (which is the default). If record_time_match is set to at_or_before, this can be any timestamp, and the most recent snapshot at or before the given record_time will be returned.string
default:"exact"
How to match the record_time. “exact” requires the record_time to match exactly. “at_or_before” finds the most recent snapshot at or before the given record_time.Allowed values:
exact, at_or_before.string[]
required
The owners for which to compute the summary.Minimum items: 1.
number
OpenAPI type:
integer (int64).Compute holding fees as of this round. Defaults to the earliest open mining round.Responses
200
okapplication/json
string (date-time)
required
The same
record_time as in the request.integer (int64)
required
The same
migration_id as in the request.integer (int64)
required
The same
as_of_round as in the request, with the same default.HoldingsSummary[]
required
Show child attributes
Show child attributes
string
required
Owner party ID of the amulet. Guaranteed to be unique among
summaries.string
required
Sum of unlocked amulet at time of reception, not counting holding fees deducted since.
string
required
Sum of locked amulet at time of original amulet reception, not counting holding fees deducted since.
string
required
total_unlocked_coin + total_locked_coin.string
required
Sum of holding fees as of
computed_as_of_round that apply to unlocked amulet.string
required
Sum of holding fees as of
computed_as_of_round that apply to locked amulet, including fees applied since the amulet’s creation round.string
required
Same as
accumulated_holding_fees_unlocked + accumulated_holding_fees_locked.string
required
Same as
total_unlocked_coin - accumulated_holding_fees_unlocked.400
bad requestapplication/json
string
required
404
not foundapplication/json
string
required
500
internal server errorapplication/json
string
required
History
Deprecated
0.6.3Updated
0.6.3The POST /v0/holdings/summary operation changed in this snapshot.
Added
0.5.10