curl --request POST \
--url 'https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/backfilling/updates-before' \
--header 'Content-Type: application/json' \
--data '{
"migration_id": 123,
"synchronizer_id": "<string>",
"before": "2026-01-01T00:00:00Z",
"at_or_after": "2026-01-01T00:00:00Z",
"count": 123
}'
import json
import requests
url = "https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/backfilling/updates-before"
headers = {'Content-Type': 'application/json'}
payload = json.loads(r'''{
"migration_id": 123,
"synchronizer_id": "<string>",
"before": "2026-01-01T00:00:00Z",
"at_or_after": "2026-01-01T00:00:00Z",
"count": 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/backfilling/updates-before', {
method: 'POST',
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"migration_id": 123,
"synchronizer_id": "<string>",
"before": "2026-01-01T00:00:00Z",
"at_or_after": "2026-01-01T00:00:00Z",
"count": 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/backfilling/updates-before',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => <<<'JSON'
{
"migration_id": 123,
"synchronizer_id": "<string>",
"before": "2026-01-01T00:00:00Z",
"at_or_after": "2026-01-01T00:00:00Z",
"count": 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/backfilling/updates-before", bytes.NewBufferString(`{
"migration_id": 123,
"synchronizer_id": "<string>",
"before": "2026-01-01T00:00:00Z",
"at_or_after": "2026-01-01T00:00:00Z",
"count": 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/backfilling/updates-before"))
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("""
{
"migration_id": 123,
"synchronizer_id": "<string>",
"before": "2026-01-01T00:00:00Z",
"at_or_after": "2026-01-01T00:00:00Z",
"count": 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/backfilling/updates-before')
request = Net::HTTP::Post.new(uri)
request['Content-Type'] = 'application/json'
request.body = <<~JSON
{
"migration_id": 123,
"synchronizer_id": "<string>",
"before": "2026-01-01T00:00:00Z",
"at_or_after": "2026-01-01T00:00:00Z",
"count": 123
}
JSON
response = Net::HTTP.start(uri.hostname, uri.port) do |http|
http.request(request)
end
puts response.body
{
"transactions": [
{
"update_id": "<string>",
"migration_id": 123,
"workflow_id": "<string>",
"record_time": "<string>",
"synchronizer_id": "<string>",
"effective_at": "<string>",
"offset": "<string>",
"root_event_ids": [
"<string>"
],
"events_by_id": {},
"external_transaction_hash": "<string>"
}
]
}
{
"error": "<string>"
}
POST /v0/backfilling/updates-before
Retrieve transactions and synchronizer reassignments prior to the request’s specification.
POST
/
api
/
scan
/
v0
/
backfilling
/
updates-before
curl --request POST \
--url 'https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/backfilling/updates-before' \
--header 'Content-Type: application/json' \
--data '{
"migration_id": 123,
"synchronizer_id": "<string>",
"before": "2026-01-01T00:00:00Z",
"at_or_after": "2026-01-01T00:00:00Z",
"count": 123
}'
import json
import requests
url = "https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/backfilling/updates-before"
headers = {'Content-Type': 'application/json'}
payload = json.loads(r'''{
"migration_id": 123,
"synchronizer_id": "<string>",
"before": "2026-01-01T00:00:00Z",
"at_or_after": "2026-01-01T00:00:00Z",
"count": 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/backfilling/updates-before', {
method: 'POST',
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"migration_id": 123,
"synchronizer_id": "<string>",
"before": "2026-01-01T00:00:00Z",
"at_or_after": "2026-01-01T00:00:00Z",
"count": 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/backfilling/updates-before',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => <<<'JSON'
{
"migration_id": 123,
"synchronizer_id": "<string>",
"before": "2026-01-01T00:00:00Z",
"at_or_after": "2026-01-01T00:00:00Z",
"count": 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/backfilling/updates-before", bytes.NewBufferString(`{
"migration_id": 123,
"synchronizer_id": "<string>",
"before": "2026-01-01T00:00:00Z",
"at_or_after": "2026-01-01T00:00:00Z",
"count": 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/backfilling/updates-before"))
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("""
{
"migration_id": 123,
"synchronizer_id": "<string>",
"before": "2026-01-01T00:00:00Z",
"at_or_after": "2026-01-01T00:00:00Z",
"count": 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/backfilling/updates-before')
request = Net::HTTP::Post.new(uri)
request['Content-Type'] = 'application/json'
request.body = <<~JSON
{
"migration_id": 123,
"synchronizer_id": "<string>",
"before": "2026-01-01T00:00:00Z",
"at_or_after": "2026-01-01T00:00:00Z",
"count": 123
}
JSON
response = Net::HTTP.start(uri.hostname, uri.port) do |http|
http.request(request)
end
puts response.body
{
"transactions": [
{
"update_id": "<string>",
"migration_id": 123,
"workflow_id": "<string>",
"record_time": "<string>",
"synchronizer_id": "<string>",
"effective_at": "<string>",
"offset": "<string>",
"root_event_ids": [
"<string>"
],
"events_by_id": {},
"external_transaction_hash": "<string>"
}
]
}
{
"error": "<string>"
}
Retrieve transactions and synchronizer reassignments prior to the request’s specification.
curl --request POST \
--url 'https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/backfilling/updates-before' \
--header 'Content-Type: application/json' \
--data '{
"migration_id": 123,
"synchronizer_id": "<string>",
"before": "2026-01-01T00:00:00Z",
"at_or_after": "2026-01-01T00:00:00Z",
"count": 123
}'
import json
import requests
url = "https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/backfilling/updates-before"
headers = {'Content-Type': 'application/json'}
payload = json.loads(r'''{
"migration_id": 123,
"synchronizer_id": "<string>",
"before": "2026-01-01T00:00:00Z",
"at_or_after": "2026-01-01T00:00:00Z",
"count": 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/backfilling/updates-before', {
method: 'POST',
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"migration_id": 123,
"synchronizer_id": "<string>",
"before": "2026-01-01T00:00:00Z",
"at_or_after": "2026-01-01T00:00:00Z",
"count": 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/backfilling/updates-before',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => <<<'JSON'
{
"migration_id": 123,
"synchronizer_id": "<string>",
"before": "2026-01-01T00:00:00Z",
"at_or_after": "2026-01-01T00:00:00Z",
"count": 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/backfilling/updates-before", bytes.NewBufferString(`{
"migration_id": 123,
"synchronizer_id": "<string>",
"before": "2026-01-01T00:00:00Z",
"at_or_after": "2026-01-01T00:00:00Z",
"count": 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/backfilling/updates-before"))
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("""
{
"migration_id": 123,
"synchronizer_id": "<string>",
"before": "2026-01-01T00:00:00Z",
"at_or_after": "2026-01-01T00:00:00Z",
"count": 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/backfilling/updates-before')
request = Net::HTTP::Post.new(uri)
request['Content-Type'] = 'application/json'
request.body = <<~JSON
{
"migration_id": 123,
"synchronizer_id": "<string>",
"before": "2026-01-01T00:00:00Z",
"at_or_after": "2026-01-01T00:00:00Z",
"count": 123
}
JSON
response = Net::HTTP.start(uri.hostname, uri.port) do |http|
http.request(request)
end
puts response.body
{
"transactions": [
{
"update_id": "<string>",
"migration_id": 123,
"workflow_id": "<string>",
"record_time": "<string>",
"synchronizer_id": "<string>",
"effective_at": "<string>",
"offset": "<string>",
"root_event_ids": [
"<string>"
],
"events_by_id": {},
"external_transaction_hash": "<string>"
}
]
}
{
"error": "<string>"
}
Body
application/json
number
required
OpenAPI type:
integer (int64).string
required
string
required
OpenAPI type:
string (date-time).Only return updates with a record time strictly smaller than this time.string
OpenAPI type:
string (date-time).Only return updates with a record time equal to or greater than this time.number
required
OpenAPI type:
integer (int32).Return at most this many updates. The actual number of updates returned may be smaller.Responses
200
okapplication/json
UpdateHistoryItem[]
required
Show child attributes
Show child attributes
UpdateHistoryTransaction
Show child attributes
Show child attributes
string
required
The id of the update.
integer (int64)
required
The migration id of the synchronizer.
string
required
This transaction’s Daml workflow ID; a workflow ID can be associated with multiple transactions. If empty, no workflow ID was set.
string
required
The time at which the transaction was sequenced, with microsecond resolution, using ISO-8601 representation.
string
required
The id of the synchronizer through which this transaction was sequenced.
string
required
Ledger effective time, using ISO-8601 representation. This is the time returned by
getTime for all Daml executed as part of this transaction, both by the submitting participant and all confirming participants.string
required
The absolute offset. Note that this field may not be the same across nodes, and therefore should not be compared between SVs. However, within a single SV’s scan, it is monotonically, lexicographically increasing.
string[]
required
Roots of the transaction tree. These are guaranteed to occur as keys of the
events_by_id object.object
required
Changes to the ledger that were caused by this transaction, keyed by ID. Values are nodes of the transaction tree. Within a transaction, IDs may be referenced by
root_event_ids or child_event_ids in ExercisedEvent herein.string
For an externally signed transaction, contains the external transaction hash signed by the external party. Can be used to correlate an external submission with a committed transaction. This field is conditionally omitted from JSON when null (see OmitNullString).
UpdateHistoryReassignment
A contract reassignment between synchronizer. May be an assignment or unassignment.
Show child attributes
Show child attributes
string
required
The id of the update.
string
required
The absolute offset. Note that this field may not be the same across nodes, and therefore should not be compared between SVs.
string
required
The time at which the transaction was sequenced.
oneOf
required
The reassignment event. May be an assignment or unassignment.
Show child attributes
Show child attributes
UpdateHistoryAssignment
Show child attributes
Show child attributes
string
required
The party ID who submitted this reassignment
string
required
The id of the synchronizer from which the contract was reassigned
string
required
The id of the synchronizer to which the contract was reassigned
integer (int64)
required
The migration id of the target synchronizer
string
required
The id of the corresponding unassign event; this assignment will usually, but not always, occur after the so-identified unassignment event.
CreatedEvent
required
The corresponding contract create event
Show child attributes
Show child attributes
string
required
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.string
required
The ID of the created contract.
string
required
The template of the created contract.
string
required
The package name of the created contract.
object
required
The arguments that have been used to create the contract, in the form of JSON representation of a Daml record.
string (date-time)
required
Ledger effective time of the transaction that created the contract.
string[]
required
Signatories to the contract, in the form of party IDs.
string[]
required
Observers to the contract, in the form of party IDs.
integer (int64)
required
Each corresponding assigned and unassigned event has the same reassignment_counter. This strictly increases with each unassign command for the same contract. Creation of the contract corresponds to reassignment_counter 0.
UpdateHistoryUnassignment
Show child attributes
Show child attributes
string
required
The party who submitted this reassignment
string
required
The id of the synchronizer from which the contract was reassigned
integer (int64)
required
The migration id of the synchronizer from which the contract was reassigned
string
required
The id of the synchronizer to which the contract was reassigned
string
required
The id of the unassign event, to later be correlated to an assign event
integer (int64)
required
Each corresponding assigned and unassigned event has the same reassignment_counter. This strictly increases with each unassign command for the same contract. Creation of the contract corresponds to reassignment_counter 0.
string
required
The id of the unassigned contract
404
not foundapplication/json
string
required
History
Updated
0.6.0The POST /v0/backfilling/updates-before operation changed in this snapshot.
Updated
0.5.17The POST /v0/backfilling/updates-before operation changed in this snapshot.
Added
0.5.10