curl --request GET \
--url https://api.kraken.com/v0/insto/custody/tasks/{task_id} \
--header 'api-key: <api-key>' \
--header 'api-nonce: <api-key>' \
--header 'api-sign: <api-key>'import requests
url = "https://api.kraken.com/v0/insto/custody/tasks/{task_id}"
headers = {
"api-key": "<api-key>",
"api-sign": "<api-key>",
"api-nonce": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'api-key': '<api-key>', 'api-sign': '<api-key>', 'api-nonce': '<api-key>'}
};
fetch('https://api.kraken.com/v0/insto/custody/tasks/{task_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.kraken.com/v0/insto/custody/tasks/{task_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("api-key", "<api-key>")
req.Header.Add("api-sign", "<api-key>")
req.Header.Add("api-nonce", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"id": "550e8400-e29b-41d4-a716-446655440000",
"type": "normalized_task",
"state": "pending",
"created_at": "2026-01-15T12:34:56Z",
"updated_at": "2026-01-15T12:35:56Z",
"expires_at": "2026-01-16T12:34:56Z",
"initiator": {
"full_name": "Alex Doe",
"role": "vault_admin",
"ip_address": "203.0.113.10",
"iiban": "ABCD EFGH IJKL MNOP"
},
"quorum_type": "vault",
"can_review": true,
"current_user_decision": "undecided",
"activities": [
{
"id": "9f8c3a1b-4d2e-4f5a-8e7c-1a2b3c4d5e6f",
"user_iiban": "ABCD EFGH IJKL MNOP",
"action": "review_approved",
"state": "pending",
"is_pending": false,
"timestamp": "2026-01-15T12:34:56Z",
"user_ip": "203.0.113.10",
"comment": "Transaction approved by finance team.",
"vault_id": "VABCDEF234567A",
"user": {
"full_name": "Alex Doe",
"role": "vault_admin",
"ip_address": "203.0.113.10",
"iiban": "ABCD EFGH IJKL MNOP"
}
}
],
"reviewer_statistics_label": "standard",
"instructions": [
{
"type": "update_subquorum",
"version": 123,
"vault_id": "<string>",
"groups": [
{
"id": "<string>",
"required": 123,
"members": [
{
"iiban": "<string>",
"full_name": "<string>",
"email": "<string>",
"role": "<string>"
}
]
}
],
"execution": {
"state": "<string>",
"started_at": "2026-01-15T12:34:56Z",
"completed_at": "2026-01-15T12:35:56Z",
"error": "<string>"
}
}
],
"reviewer_statistics": {
"approved": 2,
"denied": 0,
"undecided": 1,
"current_count": 3,
"required_quorum": 2
},
"vault_info": {
"id": "VABCDEF234567A",
"name": "My Vault",
"status": "active",
"subquorum_config": {
"groups": [
{
"id": "1ef8cecf-5d7b-4f83-9640-96d74db0e858",
"required": 2,
"members": [
{
"iiban": "ABCD EFGH IJKL MNOP",
"full_name": "Alex Doe",
"email": "alex.doe@example.com",
"role": "vault_admin"
}
]
}
]
}
},
"subquorum_snapshot": {
"groups": [
{
"id": "1ef8cecf-5d7b-4f83-9640-96d74db0e858",
"required": 2,
"members": [
{
"iiban": "ABCD EFGH IJKL MNOP",
"full_name": "Alex Doe",
"email": "alex.doe@example.com",
"role": "vault_admin"
}
]
}
]
},
"subquorum_approvals": [
{
"group_id": "1ef8cecf-5d7b-4f83-9640-96d74db0e858",
"approved_iibans": [
"ABCD EFGH IJKL MNOP"
]
}
],
"result": {
"users": [
{
"iiban": "AA88 N84G AET3 RAOA",
"role": "admin",
"attributes": [
"trader"
]
}
]
}
}{
"type": "tag:kraken.com,2025:BadRequest",
"status": 400,
"title": "Bad Request",
"data": {
"message": "Request failed validation."
},
"detail": "Request failed validation.",
"instance": "https://debug.kraken.com/req/01HXYZABCDEF"
}{
"type": "tag:kraken.com,2025:PermissionDenied",
"status": 403,
"title": "Forbidden",
"data": {
"message": "Caller lacks access to the requested resource."
},
"detail": "Caller lacks access to the requested resource.",
"instance": "https://debug.kraken.com/req/01HXYZABCDEF"
}{
"type": "tag:kraken.com,2025:gateway/ReadUpstream",
"status": 500,
"title": "Internal Server Error",
"data": "<unknown>",
"detail": "Failed to read response from upstream custody service.",
"instance": "https://debug.kraken.com/req/01HXYZABCDEF"
}{
"type": "tag:kraken.com,2025:gateway/Connect",
"status": 503,
"title": "Service Unavailable",
"data": "<unknown>",
"detail": "Downstream custody service is temporarily unreachable.",
"instance": "https://debug.kraken.com/req/01HXYZABCDEF"
}Get task by id
Returns the full details of a single task, including its instructions, the activity timeline, and reviewer/quorum state. Available only to callers in the task’s owning organization. Each task is exposed as a list of atomic instructions, where every entry describes a single change. Identify the task with id, the approval UUID. The response does not include task_id or approval_id. T-prefixed identifiers are not accepted or returned.
This endpoint is the audit record for who approved a task. activities lists each reviewer individually with their identity, decision, and timestamp; reviewer_statistics (or subquorum_approvals for multi-quorum policies) carries the aggregate approved, denied, undecided, and required-quorum counts. initiator names who raised the task. The same initiator object is also returned on the nested task of List/Get transaction when a task is linked; use this endpoint for the full approver audit (activities, quorum counters).
Rate limit: 200 requests per 30 seconds per IP.
curl --request GET \
--url https://api.kraken.com/v0/insto/custody/tasks/{task_id} \
--header 'api-key: <api-key>' \
--header 'api-nonce: <api-key>' \
--header 'api-sign: <api-key>'import requests
url = "https://api.kraken.com/v0/insto/custody/tasks/{task_id}"
headers = {
"api-key": "<api-key>",
"api-sign": "<api-key>",
"api-nonce": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'api-key': '<api-key>', 'api-sign': '<api-key>', 'api-nonce': '<api-key>'}
};
fetch('https://api.kraken.com/v0/insto/custody/tasks/{task_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.kraken.com/v0/insto/custody/tasks/{task_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("api-key", "<api-key>")
req.Header.Add("api-sign", "<api-key>")
req.Header.Add("api-nonce", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"id": "550e8400-e29b-41d4-a716-446655440000",
"type": "normalized_task",
"state": "pending",
"created_at": "2026-01-15T12:34:56Z",
"updated_at": "2026-01-15T12:35:56Z",
"expires_at": "2026-01-16T12:34:56Z",
"initiator": {
"full_name": "Alex Doe",
"role": "vault_admin",
"ip_address": "203.0.113.10",
"iiban": "ABCD EFGH IJKL MNOP"
},
"quorum_type": "vault",
"can_review": true,
"current_user_decision": "undecided",
"activities": [
{
"id": "9f8c3a1b-4d2e-4f5a-8e7c-1a2b3c4d5e6f",
"user_iiban": "ABCD EFGH IJKL MNOP",
"action": "review_approved",
"state": "pending",
"is_pending": false,
"timestamp": "2026-01-15T12:34:56Z",
"user_ip": "203.0.113.10",
"comment": "Transaction approved by finance team.",
"vault_id": "VABCDEF234567A",
"user": {
"full_name": "Alex Doe",
"role": "vault_admin",
"ip_address": "203.0.113.10",
"iiban": "ABCD EFGH IJKL MNOP"
}
}
],
"reviewer_statistics_label": "standard",
"instructions": [
{
"type": "update_subquorum",
"version": 123,
"vault_id": "<string>",
"groups": [
{
"id": "<string>",
"required": 123,
"members": [
{
"iiban": "<string>",
"full_name": "<string>",
"email": "<string>",
"role": "<string>"
}
]
}
],
"execution": {
"state": "<string>",
"started_at": "2026-01-15T12:34:56Z",
"completed_at": "2026-01-15T12:35:56Z",
"error": "<string>"
}
}
],
"reviewer_statistics": {
"approved": 2,
"denied": 0,
"undecided": 1,
"current_count": 3,
"required_quorum": 2
},
"vault_info": {
"id": "VABCDEF234567A",
"name": "My Vault",
"status": "active",
"subquorum_config": {
"groups": [
{
"id": "1ef8cecf-5d7b-4f83-9640-96d74db0e858",
"required": 2,
"members": [
{
"iiban": "ABCD EFGH IJKL MNOP",
"full_name": "Alex Doe",
"email": "alex.doe@example.com",
"role": "vault_admin"
}
]
}
]
}
},
"subquorum_snapshot": {
"groups": [
{
"id": "1ef8cecf-5d7b-4f83-9640-96d74db0e858",
"required": 2,
"members": [
{
"iiban": "ABCD EFGH IJKL MNOP",
"full_name": "Alex Doe",
"email": "alex.doe@example.com",
"role": "vault_admin"
}
]
}
]
},
"subquorum_approvals": [
{
"group_id": "1ef8cecf-5d7b-4f83-9640-96d74db0e858",
"approved_iibans": [
"ABCD EFGH IJKL MNOP"
]
}
],
"result": {
"users": [
{
"iiban": "AA88 N84G AET3 RAOA",
"role": "admin",
"attributes": [
"trader"
]
}
]
}
}{
"type": "tag:kraken.com,2025:BadRequest",
"status": 400,
"title": "Bad Request",
"data": {
"message": "Request failed validation."
},
"detail": "Request failed validation.",
"instance": "https://debug.kraken.com/req/01HXYZABCDEF"
}{
"type": "tag:kraken.com,2025:PermissionDenied",
"status": 403,
"title": "Forbidden",
"data": {
"message": "Caller lacks access to the requested resource."
},
"detail": "Caller lacks access to the requested resource.",
"instance": "https://debug.kraken.com/req/01HXYZABCDEF"
}{
"type": "tag:kraken.com,2025:gateway/ReadUpstream",
"status": 500,
"title": "Internal Server Error",
"data": "<unknown>",
"detail": "Failed to read response from upstream custody service.",
"instance": "https://debug.kraken.com/req/01HXYZABCDEF"
}{
"type": "tag:kraken.com,2025:gateway/Connect",
"status": 503,
"title": "Service Unavailable",
"data": "<unknown>",
"detail": "Downstream custody service is temporarily unreachable.",
"instance": "https://debug.kraken.com/req/01HXYZABCDEF"
}Authorizations
Path Parameters
Task identifier, an approval UUID (UUID v4). T-prefixed identifiers are not accepted or returned. Responses always emit lowercase. Requests accept any letter case.
"550e8400-e29b-41d4-a716-446655440000"
Response
Full details of the requested task.
Task identifier, an approval UUID (UUID v4). T-prefixed identifiers are not accepted or returned. Responses always emit lowercase. Requests accept any letter case.
"550e8400-e29b-41d4-a716-446655440000"
Coarse task-level discriminator. Every task is exposed in the instruction-normalized model, so this is always normalized_task. Read the per-instruction type inside instructions[] for the specific actions the task performs.
"normalized_task"
Lifecycle state of the task. One of pending, approved, rejected, canceled, expired, failed, executed.
"pending"
RFC 3339 UTC timestamp when the task was created.
"2026-01-15T12:34:56Z"
RFC 3339 UTC timestamp when the task was last updated.
"2026-01-15T12:35:56Z"
RFC 3339 UTC timestamp when the task expires if no decision is reached.
"2026-01-16T12:34:56Z"
User or API key that initiated the task.
Show child attributes
Show child attributes
Scope of the quorum required to advance the task. domain for org-wide quorum, vault for vault-scoped quorum.
"vault"
True if the caller may still cast a review decision on this task.
true
The caller's own decision on this task. One of undecided, approved, denied.
"undecided"
Chronological audit trail of actions taken against the task: creation, reviews, executions, and state transitions. This is the per-approver record. Each review entry names the reviewer through user_iiban and user, the decision through action (review_approved or review_denied), the task state at that point through state, and when the decision was cast through timestamp. Use it together with reviewer_statistics or subquorum_approvals, which carry only the aggregate counts.
Show child attributes
Show child attributes
Indicates which reviewer-tally field to consult. standard means use reviewer_statistics; multiquorum means use subquorum_approvals.
"standard"
List of atomic instructions that make up the task. Each entry describes a single change; batch changes are expanded into one entry per change.
A single atomic instruction. The type field selects the variant and identifies the instruction type.
- update_subquorum
- update_vault_user
- update_vault_policy
- request_withdrawal
- remove_org_user
- create_user
- update_withdrawal_address
- update_user_permission
- request_staking_allocation
- request_transfer_to_spot
- request_custody_transfer_to_spot
- request_staking_deallocation
- request_pledge
- request_pledge_release
- create_vault
- update_vault
- update_domain_policy
- update_user_status
- create_api_user
- update_api_user
Show child attributes
Show child attributes
Quorum counters for single-quorum tasks: how many assigned reviewers have approved, denied, or not yet decided, and how many approvals the task still needs. Omitted for multi-quorum tasks. Use subquorum_approvals when reviewer_statistics_label is multiquorum. For the individual reviewers behind these counters, read activities.
Show child attributes
Show child attributes
Vault the task is scoped to. Omitted for domain-level tasks that do not target a specific vault.
Show child attributes
Show child attributes
Subquorum policy snapshot taken when the task was created. Approvals are evaluated against this snapshot so a later policy change cannot retroactively invalidate decisions already cast.
Show child attributes
Show child attributes
Per-group approval tally for multi-quorum tasks. Each entry lists a group's ID and the IIBANs of members in that group who have approved so far.
Show child attributes
Show child attributes
Outcome of the task once it has been applied. Populated for task types that produce a result, such as user creation.
Show child attributes
Show child attributes
Was this page helpful?