POST /v0/holdings/state
cURL
Python
JavaScript
PHP
Go
Java
Ruby
curl --request POST \
--url 'https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/holdings/state' \
--header 'Content-Type: application/json' \
--data '{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"after": 123,
"page_size": 123,
"owner_party_ids": [
"<string>"
]
}'
import json
import requests
url = "https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/holdings/state"
headers = {'Content-Type': 'application/json'}
payload = json.loads(r'''{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"after": 123,
"page_size": 123,
"owner_party_ids": [
"<string>"
]
}''')
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/state', {
method: 'POST',
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"after": 123,
"page_size": 123,
"owner_party_ids": [
"<string>"
]
}),
});
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/state',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => <<<'JSON'
{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"after": 123,
"page_size": 123,
"owner_party_ids": [
"<string>"
]
}
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/state", bytes.NewBufferString(`{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"after": 123,
"page_size": 123,
"owner_party_ids": [
"<string>"
]
}`))
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/state"))
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("""
{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"after": 123,
"page_size": 123,
"owner_party_ids": [
"<string>"
]
}
"""))
.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/state')
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",
"after": 123,
"page_size": 123,
"owner_party_ids": [
"<string>"
]
}
JSON
response = Net::HTTP.start(uri.hostname, uri.port) do |http|
http.request(request)
end
puts response.body
200
400
404
500
{
"record_time": "2026-01-01T00:00:00Z",
"migration_id": 123,
"created_events": [
{
"event_type": "<string>",
"event_id": "<string>",
"contract_id": "<string>",
"template_id": "<string>",
"package_name": "<string>",
"create_arguments": {},
"created_at": "2026-01-01T00:00:00Z",
"signatories": [
"<string>"
],
"observers": [
"<string>"
]
}
],
"next_page_token": 123
}
{
"error": "<string>"
}
{
"error": "<string>"
}
{
"error": "<string>"
}
POST
/
api
/
scan
/
v0
/
holdings
/
state
cURL
Python
JavaScript
PHP
Go
Java
Ruby
curl --request POST \
--url 'https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/holdings/state' \
--header 'Content-Type: application/json' \
--data '{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"after": 123,
"page_size": 123,
"owner_party_ids": [
"<string>"
]
}'
import json
import requests
url = "https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/holdings/state"
headers = {'Content-Type': 'application/json'}
payload = json.loads(r'''{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"after": 123,
"page_size": 123,
"owner_party_ids": [
"<string>"
]
}''')
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/state', {
method: 'POST',
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"after": 123,
"page_size": 123,
"owner_party_ids": [
"<string>"
]
}),
});
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/state',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => <<<'JSON'
{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"after": 123,
"page_size": 123,
"owner_party_ids": [
"<string>"
]
}
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/state", bytes.NewBufferString(`{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"after": 123,
"page_size": 123,
"owner_party_ids": [
"<string>"
]
}`))
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/state"))
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("""
{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"after": 123,
"page_size": 123,
"owner_party_ids": [
"<string>"
]
}
"""))
.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/state')
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",
"after": 123,
"page_size": 123,
"owner_party_ids": [
"<string>"
]
}
JSON
response = Net::HTTP.start(uri.hostname, uri.port) do |http|
http.request(request)
end
puts response.body
200
400
404
500
{
"record_time": "2026-01-01T00:00:00Z",
"migration_id": 123,
"created_events": [
{
"event_type": "<string>",
"event_id": "<string>",
"contract_id": "<string>",
"template_id": "<string>",
"package_name": "<string>",
"create_arguments": {},
"created_at": "2026-01-01T00:00:00Z",
"signatories": [
"<string>"
],
"observers": [
"<string>"
]
}
],
"next_page_token": 123
}
{
"error": "<string>"
}
{
"error": "<string>"
}
{
"error": "<string>"
}
Deprecated. Please use /v1/holdings/state instead. Returns the active amulet contracts for a given migration id and record time, in creation date ascending order, paged.
OpenAPIUpdated 0.6.0
cURL
Python
JavaScript
PHP
Go
Java
Ruby
curl --request POST \
--url 'https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/holdings/state' \
--header 'Content-Type: application/json' \
--data '{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"after": 123,
"page_size": 123,
"owner_party_ids": [
"<string>"
]
}'
import json
import requests
url = "https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/holdings/state"
headers = {'Content-Type': 'application/json'}
payload = json.loads(r'''{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"after": 123,
"page_size": 123,
"owner_party_ids": [
"<string>"
]
}''')
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/state', {
method: 'POST',
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"after": 123,
"page_size": 123,
"owner_party_ids": [
"<string>"
]
}),
});
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/state',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => <<<'JSON'
{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"after": 123,
"page_size": 123,
"owner_party_ids": [
"<string>"
]
}
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/state", bytes.NewBufferString(`{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"after": 123,
"page_size": 123,
"owner_party_ids": [
"<string>"
]
}`))
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/state"))
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("""
{
"migration_id": 123,
"record_time": "2026-01-01T00:00:00Z",
"record_time_match": "exact",
"after": 123,
"page_size": 123,
"owner_party_ids": [
"<string>"
]
}
"""))
.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/state')
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",
"after": 123,
"page_size": 123,
"owner_party_ids": [
"<string>"
]
}
JSON
response = Net::HTTP.start(uri.hostname, uri.port) do |http|
http.request(request)
end
puts response.body
200
400
404
500
{
"record_time": "2026-01-01T00:00:00Z",
"migration_id": 123,
"created_events": [
{
"event_type": "<string>",
"event_id": "<string>",
"contract_id": "<string>",
"template_id": "<string>",
"package_name": "<string>",
"create_arguments": {},
"created_at": "2026-01-01T00:00:00Z",
"signatories": [
"<string>"
],
"observers": [
"<string>"
]
}
],
"next_page_token": 123
}
{
"error": "<string>"
}
{
"error": "<string>"
}
{
"error": "<string>"
}
Body
application/json
migration_id
number
required
OpenAPI type:
integer (int64).The migration id for which to return the ACS.record_time
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.record_time_match
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.after
number
OpenAPI type:
integer (int64).Pagination token for the next page of results.page_size
number
required
OpenAPI type:
integer (int32).The maximum number of created events returned for this request.owner_party_ids
string[]
required
Filters by contracts in which these party_ids are the owners of the amulets.Minimum items: 1.
Responses
200
okapplication/json
record_time
string (date-time)
required
The same
record_time as in the request.migration_id
integer (int64)
required
The same
migration_id as in the request.created_events
CreatedEvent[]
required
Up to
page_size contracts in the ACS. create_arguments are always encoded as compact_json.Show child attributes
Show child attributes
event_type
string
required
event_id
string
required
The ID of this particular event. Equal to the key of this element of the containing
events_by_id if this is part of a TreeEvent.contract_id
string
required
The ID of the created contract.
template_id
string
required
The template of the created contract.
package_name
string
required
The package name of the created contract.
create_arguments
object
required
The arguments that have been used to create the contract, in the form of JSON representation of a Daml record.
created_at
string (date-time)
required
Ledger effective time of the transaction that created the contract.
signatories
string[]
required
Signatories to the contract, in the form of party IDs.
observers
string[]
required
Observers to the contract, in the form of party IDs.
next_page_token
integer (int64)
When requesting the next page of results, pass this as
after to the AcsRequest or HoldingsStateRequest. Will be absent when there are no more pages.400
bad requestapplication/json
error
string
required
404
not foundapplication/json
error
string
required
500
internal server errorapplication/json
error
string
required
History
Updated
0.6.0The POST /v0/holdings/state operation changed in this snapshot.