Make a Canton call
Submits one Canton call. type names the call and selects the shape of payload.
An unknown or missing type, or a payload missing a required field, is a 400. A field that does not belong to the selected type is ignored rather than rejected.
A 501 has two different causes, and the distinction is permanent rather than a build-order detail, so it belongs in the published spec:
NO CANTON CAPABILITY — specified so the contract is complete, but not available in v1: DTCC_END_INVESTOR_INVITE_CANCEL, DTCC_END_INVESTOR_OFFBOARD, DTCC_ALLOW_LIST_ADD, DTCC_ALLOW_LIST_REMOVE. TRANSFER_WITHDRAW has no owning service at all. NO HANDLER YET — the capability exists and the type is being wired one slice at a time.
ALLOCATION_WITHDRAW is implemented and answers 201 / 400 / 404 / 409.
curl --request POST \
--url https://api.fireblocks.io/v1/operations/canton/calls \
--header 'Content-Type: application/json' \
--data '
{
"type": "DTCC_PARTICIPANT_ONBOARDING",
"payload": {
"vaultAccountId": "12",
"asset": "CANTON",
"operator": "dtcc-operator::1220abc…",
"compliance": "dtcc-compliance::1220abc…",
"registrar": "dtcc-registrar::1220abc…",
"clientOnboarder": "dtcc-onboarder::1220abc…",
"upgrader": "dtcc-upgrader::1220abc…",
"expiresAt": "2026-12-31T23:59:59Z"
}
}
'import requests
url = "https://api.fireblocks.io/v1/operations/canton/calls"
payload = {
"type": "DTCC_PARTICIPANT_ONBOARDING",
"payload": {
"vaultAccountId": "12",
"asset": "CANTON",
"operator": "dtcc-operator::1220abc…",
"compliance": "dtcc-compliance::1220abc…",
"registrar": "dtcc-registrar::1220abc…",
"clientOnboarder": "dtcc-onboarder::1220abc…",
"upgrader": "dtcc-upgrader::1220abc…",
"expiresAt": "2026-12-31T23:59:59Z"
}
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
type: 'DTCC_PARTICIPANT_ONBOARDING',
payload: {
vaultAccountId: '12',
asset: 'CANTON',
operator: 'dtcc-operator::1220abc…',
compliance: 'dtcc-compliance::1220abc…',
registrar: 'dtcc-registrar::1220abc…',
clientOnboarder: 'dtcc-onboarder::1220abc…',
upgrader: 'dtcc-upgrader::1220abc…',
expiresAt: '2026-12-31T23:59:59Z'
}
})
};
fetch('https://api.fireblocks.io/v1/operations/canton/calls', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fireblocks.io/v1/operations/canton/calls",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'type' => 'DTCC_PARTICIPANT_ONBOARDING',
'payload' => [
'vaultAccountId' => '12',
'asset' => 'CANTON',
'operator' => 'dtcc-operator::1220abc…',
'compliance' => 'dtcc-compliance::1220abc…',
'registrar' => 'dtcc-registrar::1220abc…',
'clientOnboarder' => 'dtcc-onboarder::1220abc…',
'upgrader' => 'dtcc-upgrader::1220abc…',
'expiresAt' => '2026-12-31T23:59:59Z'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.fireblocks.io/v1/operations/canton/calls"
payload := strings.NewReader("{\n \"type\": \"DTCC_PARTICIPANT_ONBOARDING\",\n \"payload\": {\n \"vaultAccountId\": \"12\",\n \"asset\": \"CANTON\",\n \"operator\": \"dtcc-operator::1220abc…\",\n \"compliance\": \"dtcc-compliance::1220abc…\",\n \"registrar\": \"dtcc-registrar::1220abc…\",\n \"clientOnboarder\": \"dtcc-onboarder::1220abc…\",\n \"upgrader\": \"dtcc-upgrader::1220abc…\",\n \"expiresAt\": \"2026-12-31T23:59:59Z\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.fireblocks.io/v1/operations/canton/calls")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"DTCC_PARTICIPANT_ONBOARDING\",\n \"payload\": {\n \"vaultAccountId\": \"12\",\n \"asset\": \"CANTON\",\n \"operator\": \"dtcc-operator::1220abc…\",\n \"compliance\": \"dtcc-compliance::1220abc…\",\n \"registrar\": \"dtcc-registrar::1220abc…\",\n \"clientOnboarder\": \"dtcc-onboarder::1220abc…\",\n \"upgrader\": \"dtcc-upgrader::1220abc…\",\n \"expiresAt\": \"2026-12-31T23:59:59Z\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fireblocks.io/v1/operations/canton/calls")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"type\": \"DTCC_PARTICIPANT_ONBOARDING\",\n \"payload\": {\n \"vaultAccountId\": \"12\",\n \"asset\": \"CANTON\",\n \"operator\": \"dtcc-operator::1220abc…\",\n \"compliance\": \"dtcc-compliance::1220abc…\",\n \"registrar\": \"dtcc-registrar::1220abc…\",\n \"clientOnboarder\": \"dtcc-onboarder::1220abc…\",\n \"upgrader\": \"dtcc-upgrader::1220abc…\",\n \"expiresAt\": \"2026-12-31T23:59:59Z\"\n }\n}"
response = http.request(request)
puts response.read_body{
"transactionId": "5a1d8b0f-2c31-4c7e-9d0a-118e7b6c4a21",
"status": "SUBMITTED"
}{
"message": "<string>",
"code": 123
}{
"message": "<string>",
"code": 123
}{
"message": "<string>",
"code": 123
}{
"message": "<string>",
"code": 123
}{
"message": "<string>",
"code": 123
}Headers
A unique identifier for the request. If the request is sent multiple times with the same idempotency key, the server will return the same response as the first request. The idempotency key is valid for 24 hours.
Body
Response
The outgoing transaction that carries the call.
Was this page helpful?
curl --request POST \
--url https://api.fireblocks.io/v1/operations/canton/calls \
--header 'Content-Type: application/json' \
--data '
{
"type": "DTCC_PARTICIPANT_ONBOARDING",
"payload": {
"vaultAccountId": "12",
"asset": "CANTON",
"operator": "dtcc-operator::1220abc…",
"compliance": "dtcc-compliance::1220abc…",
"registrar": "dtcc-registrar::1220abc…",
"clientOnboarder": "dtcc-onboarder::1220abc…",
"upgrader": "dtcc-upgrader::1220abc…",
"expiresAt": "2026-12-31T23:59:59Z"
}
}
'import requests
url = "https://api.fireblocks.io/v1/operations/canton/calls"
payload = {
"type": "DTCC_PARTICIPANT_ONBOARDING",
"payload": {
"vaultAccountId": "12",
"asset": "CANTON",
"operator": "dtcc-operator::1220abc…",
"compliance": "dtcc-compliance::1220abc…",
"registrar": "dtcc-registrar::1220abc…",
"clientOnboarder": "dtcc-onboarder::1220abc…",
"upgrader": "dtcc-upgrader::1220abc…",
"expiresAt": "2026-12-31T23:59:59Z"
}
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
type: 'DTCC_PARTICIPANT_ONBOARDING',
payload: {
vaultAccountId: '12',
asset: 'CANTON',
operator: 'dtcc-operator::1220abc…',
compliance: 'dtcc-compliance::1220abc…',
registrar: 'dtcc-registrar::1220abc…',
clientOnboarder: 'dtcc-onboarder::1220abc…',
upgrader: 'dtcc-upgrader::1220abc…',
expiresAt: '2026-12-31T23:59:59Z'
}
})
};
fetch('https://api.fireblocks.io/v1/operations/canton/calls', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fireblocks.io/v1/operations/canton/calls",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'type' => 'DTCC_PARTICIPANT_ONBOARDING',
'payload' => [
'vaultAccountId' => '12',
'asset' => 'CANTON',
'operator' => 'dtcc-operator::1220abc…',
'compliance' => 'dtcc-compliance::1220abc…',
'registrar' => 'dtcc-registrar::1220abc…',
'clientOnboarder' => 'dtcc-onboarder::1220abc…',
'upgrader' => 'dtcc-upgrader::1220abc…',
'expiresAt' => '2026-12-31T23:59:59Z'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.fireblocks.io/v1/operations/canton/calls"
payload := strings.NewReader("{\n \"type\": \"DTCC_PARTICIPANT_ONBOARDING\",\n \"payload\": {\n \"vaultAccountId\": \"12\",\n \"asset\": \"CANTON\",\n \"operator\": \"dtcc-operator::1220abc…\",\n \"compliance\": \"dtcc-compliance::1220abc…\",\n \"registrar\": \"dtcc-registrar::1220abc…\",\n \"clientOnboarder\": \"dtcc-onboarder::1220abc…\",\n \"upgrader\": \"dtcc-upgrader::1220abc…\",\n \"expiresAt\": \"2026-12-31T23:59:59Z\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.fireblocks.io/v1/operations/canton/calls")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"DTCC_PARTICIPANT_ONBOARDING\",\n \"payload\": {\n \"vaultAccountId\": \"12\",\n \"asset\": \"CANTON\",\n \"operator\": \"dtcc-operator::1220abc…\",\n \"compliance\": \"dtcc-compliance::1220abc…\",\n \"registrar\": \"dtcc-registrar::1220abc…\",\n \"clientOnboarder\": \"dtcc-onboarder::1220abc…\",\n \"upgrader\": \"dtcc-upgrader::1220abc…\",\n \"expiresAt\": \"2026-12-31T23:59:59Z\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fireblocks.io/v1/operations/canton/calls")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"type\": \"DTCC_PARTICIPANT_ONBOARDING\",\n \"payload\": {\n \"vaultAccountId\": \"12\",\n \"asset\": \"CANTON\",\n \"operator\": \"dtcc-operator::1220abc…\",\n \"compliance\": \"dtcc-compliance::1220abc…\",\n \"registrar\": \"dtcc-registrar::1220abc…\",\n \"clientOnboarder\": \"dtcc-onboarder::1220abc…\",\n \"upgrader\": \"dtcc-upgrader::1220abc…\",\n \"expiresAt\": \"2026-12-31T23:59:59Z\"\n }\n}"
response = http.request(request)
puts response.read_body{
"transactionId": "5a1d8b0f-2c31-4c7e-9d0a-118e7b6c4a21",
"status": "SUBMITTED"
}{
"message": "<string>",
"code": 123
}{
"message": "<string>",
"code": 123
}{
"message": "<string>",
"code": 123
}{
"message": "<string>",
"code": 123
}{
"message": "<string>",
"code": 123
}