Skip to content
CCPEDIAby Unity Nodes
Documentation/Canton Network Docs/Splice APIsScan APIsScan APIView on Canton Network Docs

POST /v2/state/acs

POST
/
api
/
scan
/
v2
/
state
/
acs
Try it
cURL
Python
JavaScript
PHP
Go
Java
Ruby
curl --request POST \
  --url 'https://scan.sv-1.global.canton.network.sync.global/api/scan/v2/state/acs' \
  --header 'Content-Type: application/json' \
  --data '{
  "migration_id": 123,
  "record_time": "2026-01-01T00:00:00Z",
  "record_time_match": "exact",
  "after": "<string>",
  "page_size": 123,
  "party_ids": [
    "<string>"
  ],
  "templates": [
    "<string>"
  ]
}'
import json
import requests

url = "https://scan.sv-1.global.canton.network.sync.global/api/scan/v2/state/acs"
headers = {'Content-Type': 'application/json'}
payload = json.loads(r'''{
  "migration_id": 123,
  "record_time": "2026-01-01T00:00:00Z",
  "record_time_match": "exact",
  "after": "<string>",
  "page_size": 123,
  "party_ids": [
    "<string>"
  ],
  "templates": [
    "<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/v2/state/acs', {
  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": "<string>",
  "page_size": 123,
  "party_ids": [
    "<string>"
  ],
  "templates": [
    "<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/v2/state/acs',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS => <<<'JSON'
{
  "migration_id": 123,
  "record_time": "2026-01-01T00:00:00Z",
  "record_time_match": "exact",
  "after": "<string>",
  "page_size": 123,
  "party_ids": [
    "<string>"
  ],
  "templates": [
    "<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/v2/state/acs", bytes.NewBufferString(`{
  "migration_id": 123,
  "record_time": "2026-01-01T00:00:00Z",
  "record_time_match": "exact",
  "after": "<string>",
  "page_size": 123,
  "party_ids": [
    "<string>"
  ],
  "templates": [
    "<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/v2/state/acs"))
    .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": "<string>",
  "page_size": 123,
  "party_ids": [
    "<string>"
  ],
  "templates": [
    "<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/v2/state/acs')
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": "<string>",
  "page_size": 123,
  "party_ids": [
    "<string>"
  ],
  "templates": [
    "<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": [
    {
      "created_in_update_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": "<string>"
}
{
  "error": "<string>"
}
{
  "error": "<string>"
}
{
  "error": "<string>"
}

Returns the ACS in creation date ascending order, paged, for a given migration id and record time. Unlike /v0/state/acs, every contract is identified by an (optional) update_id (as opposed to the event ID in /v0/state/acs, which was not BFT-safe). The update_id is the ID of the update in which the contract was created, and can be used to correlate with updates returned by /v2/updates.

cURL
Python
JavaScript
PHP
Go
Java
Ruby
curl --request POST \
  --url 'https://scan.sv-1.global.canton.network.sync.global/api/scan/v2/state/acs' \
  --header 'Content-Type: application/json' \
  --data '{
  "migration_id": 123,
  "record_time": "2026-01-01T00:00:00Z",
  "record_time_match": "exact",
  "after": "<string>",
  "page_size": 123,
  "party_ids": [
    "<string>"
  ],
  "templates": [
    "<string>"
  ]
}'
import json
import requests

url = "https://scan.sv-1.global.canton.network.sync.global/api/scan/v2/state/acs"
headers = {'Content-Type': 'application/json'}
payload = json.loads(r'''{
  "migration_id": 123,
  "record_time": "2026-01-01T00:00:00Z",
  "record_time_match": "exact",
  "after": "<string>",
  "page_size": 123,
  "party_ids": [
    "<string>"
  ],
  "templates": [
    "<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/v2/state/acs', {
  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": "<string>",
  "page_size": 123,
  "party_ids": [
    "<string>"
  ],
  "templates": [
    "<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/v2/state/acs',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS => <<<'JSON'
{
  "migration_id": 123,
  "record_time": "2026-01-01T00:00:00Z",
  "record_time_match": "exact",
  "after": "<string>",
  "page_size": 123,
  "party_ids": [
    "<string>"
  ],
  "templates": [
    "<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/v2/state/acs", bytes.NewBufferString(`{
  "migration_id": 123,
  "record_time": "2026-01-01T00:00:00Z",
  "record_time_match": "exact",
  "after": "<string>",
  "page_size": 123,
  "party_ids": [
    "<string>"
  ],
  "templates": [
    "<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/v2/state/acs"))
    .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": "<string>",
  "page_size": 123,
  "party_ids": [
    "<string>"
  ],
  "templates": [
    "<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/v2/state/acs')
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": "<string>",
  "page_size": 123,
  "party_ids": [
    "<string>"
  ],
  "templates": [
    "<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": [
    {
      "created_in_update_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": "<string>"
}
{
  "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
string
Pagination token for the next page of results. For this to be valid, this must be the next_page_token from a prior request with identical parameters aside from after and page_size; the response may be invalid otherwise. This token is opaque and not meant to be edited by users.
page_size
number
required
OpenAPI type: integer (int32).The maximum number of created events returned for this request.
party_ids
string[]
Filters the ACS by contracts in which these party IDs are stakeholders.
templates
string[]
Filters the ACS by contracts with these template IDs, specified as “PACKAGE_NAME:MODULE_NAME:ENTITY_NAME”.

Responses

200

ok
application/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
ActiveContract[]
required
Up to page_size contracts in the ACS. create_arguments are always encoded as compact_json.

Show child attributes

created_in_update_id
string
The id of the update in which this contract was created. Optional and will be absent for contracts created in prior migration IDs.
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
string
When requesting the next page of results, pass this as after to the AcsRequestV2 or HoldingsStateRequestV2. Will be absent when there are no more pages. This token is opaque and not meant to be edited by users.

400

bad request
application/json
error
string
required

404

not found
application/json
error
string
required

500

internal server error
application/json
error
string
required

History

Added0.7.5