curl --request GET \
--url https://api.kraken.com/v0/insto/custody/tasks \
--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"
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', 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"
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))
}{
"result": [
{
"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": "Jane Doe",
"role": "admin",
"ip_address": "203.0.113.42",
"iiban": "ABCD EFGH IJKL MNOP"
},
"quorum_type": "vault",
"can_review": true,
"current_user_decision": "undecided",
"reviewer_statistics_label": "standard",
"instruction_types": [
"request_withdrawal"
],
"reviewer_statistics": {
"approved": 1,
"denied": 0,
"undecided": 2,
"current_count": 3,
"required_quorum": 2
},
"vault_info": {
"id": "VABCDEF234567A",
"name": "Treasury Vault",
"status": "active",
"subquorum_config": {
"groups": [
{
"id": "11111111-2222-4333-8444-555555555555",
"required": 2,
"members": [
{
"iiban": "ABCD EFGH IJKL MNOP",
"full_name": "Jane Doe",
"email": "jane.doe@example.com",
"role": "admin"
}
]
}
]
}
},
"subquorum_snapshot": {
"groups": [
{
"id": "11111111-2222-4333-8444-555555555555",
"required": 2,
"members": [
{
"iiban": "ABCD EFGH IJKL MNOP",
"full_name": "Jane Doe",
"email": "jane.doe@example.com",
"role": "admin"
}
]
}
]
},
"subquorum_approvals": [
{
"group_id": "11111111-2222-4333-8444-555555555555",
"approved_iibans": [
"ABCD EFGH IJKL MNOP"
]
}
]
}
],
"total": 42
}{
"type": "tag:kraken.com,2025:BadRequest",
"status": 400,
"title": "Bad Request",
"data": {
"message": "Unknown filter value for state: 'archived'."
},
"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 task, vault, or organization scope."
},
"detail": "The caller is not authorized to perform this action.",
"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": {},
"detail": "Failed to connect to upstream custody service.",
"instance": "https://debug.kraken.com/req/01HXYZABCDEF"
}List tasks
Returns a paginated list of custody tasks (approval requests) visible to the authenticated user, filtered by the supplied query parameters and ordered by the requested column. Multi-valued filters are OR-ed within a field and AND-ed across fields. The public task identifier is id, the approval UUID. Task objects do not return task_id or approval_id. T-prefixed identifiers are not accepted or returned.
Rate limit: 200 requests per 30 seconds per IP.
curl --request GET \
--url https://api.kraken.com/v0/insto/custody/tasks \
--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"
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', 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"
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))
}{
"result": [
{
"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": "Jane Doe",
"role": "admin",
"ip_address": "203.0.113.42",
"iiban": "ABCD EFGH IJKL MNOP"
},
"quorum_type": "vault",
"can_review": true,
"current_user_decision": "undecided",
"reviewer_statistics_label": "standard",
"instruction_types": [
"request_withdrawal"
],
"reviewer_statistics": {
"approved": 1,
"denied": 0,
"undecided": 2,
"current_count": 3,
"required_quorum": 2
},
"vault_info": {
"id": "VABCDEF234567A",
"name": "Treasury Vault",
"status": "active",
"subquorum_config": {
"groups": [
{
"id": "11111111-2222-4333-8444-555555555555",
"required": 2,
"members": [
{
"iiban": "ABCD EFGH IJKL MNOP",
"full_name": "Jane Doe",
"email": "jane.doe@example.com",
"role": "admin"
}
]
}
]
}
},
"subquorum_snapshot": {
"groups": [
{
"id": "11111111-2222-4333-8444-555555555555",
"required": 2,
"members": [
{
"iiban": "ABCD EFGH IJKL MNOP",
"full_name": "Jane Doe",
"email": "jane.doe@example.com",
"role": "admin"
}
]
}
]
},
"subquorum_approvals": [
{
"group_id": "11111111-2222-4333-8444-555555555555",
"approved_iibans": [
"ABCD EFGH IJKL MNOP"
]
}
]
}
],
"total": 42
}{
"type": "tag:kraken.com,2025:BadRequest",
"status": 400,
"title": "Bad Request",
"data": {
"message": "Unknown filter value for state: 'archived'."
},
"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 task, vault, or organization scope."
},
"detail": "The caller is not authorized to perform this action.",
"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": {},
"detail": "Failed to connect to upstream custody service.",
"instance": "https://debug.kraken.com/req/01HXYZABCDEF"
}Authorizations
Query Parameters
Restrict the result set to tasks owned by the specified organization, identified by its 16-char IIBAN. Defaults to the caller's organization when omitted.
"ABCD EFGH IJKL MNOP"
Maximum number of tasks to return in the page. Defaults to 100 when omitted.
100
Number of tasks to skip before the page begins, used together with limit for offset-based pagination. Defaults to 0 when omitted.
0
Restrict the result set to tasks in one or more lifecycle states. Allowed values: pending, approved, rejected, denied (alias of rejected), canceled, expired, failed, executed.
Restrict the result set to tasks for which the caller has made the specified decision. One of undecided, approved, denied.
"undecided"
Restrict the result set to the supplied task ids. Each value is an approval UUID (UUID v4). T-prefixed identifiers are not accepted. Matching is case-insensitive.
Restrict the result set to tasks scoped to the supplied vault IDs. Each value is a V-prefixed 14-char base32 identifier with a final check character.
Restrict the result set to tasks that contain one of the supplied action types. Accepts only the singular action names listed below (for example request_withdrawal, create_vault, update_subquorum). Multiple values are OR-ed.
update_subquorum, update_vault_user, update_vault_policy, request_withdrawal, remove_org_user, create_user, request_staking_allocation, update_withdrawal_address, update_user_permission, create_vault, update_vault, update_domain_policy, update_user_status, request_transfer_to_spot, create_api_user, update_api_user, request_staking_deallocation, request_custody_transfer_to_spot, request_pledge, request_pledge_release Include only tasks created at or after this RFC 3339 UTC timestamp (inclusive), e.g. 2026-01-15T12:34:56Z; the Z (UTC) offset is required.
Include only tasks created at or before this RFC 3339 UTC timestamp (inclusive), e.g. 2026-01-15T12:34:56Z; the Z (UTC) offset is required.
Include only tasks last updated at or after this RFC 3339 UTC timestamp (inclusive), e.g. 2026-01-15T12:34:56Z; the Z (UTC) offset is required.
Include only tasks last updated at or before this RFC 3339 UTC timestamp (inclusive), e.g. 2026-01-15T12:34:56Z; the Z (UTC) offset is required.
Include only tasks expiring at or after this RFC 3339 UTC timestamp (inclusive), e.g. 2026-01-15T12:34:56Z; the Z (UTC) offset is required.
Include only tasks expiring at or before this RFC 3339 UTC timestamp (inclusive), e.g. 2026-01-15T12:34:56Z; the Z (UTC) offset is required.
Ordering as a single field:direction token (direction optional, defaults to desc). Only one column is supported. Allowed fields: id, state, vault_id, created_at, updated_at, expires_at. Defaults to created_at:desc.
"created_at:desc"
Was this page helpful?