Skip to main content
GET
/
v0
/
insto
/
custody
/
tasks
/
{task_id}
Get task by id
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-otp: <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>",
"api-otp": "<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>',
'api-otp': '<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>")
req.Header.Add("api-otp", "<api-key>")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
{
  "task_id": "TABCDEF234567A",
  "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>"
      }
    }
  ],
  "approval_id": "1ef8cecf-5d7b-4f83-9640-96d74db0e858",
  "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

api-key
string
header
required
api-sign
string
header
required
api-nonce
string
header
required
api-otp
string
header
required

Path Parameters

task_id
string
required

Task identifier, a T-prefixed 14-char base32 string.

Example:

"TABCDEF234567A"

Response

Full details of the requested task.

task_id
string
required

Task identifier, a T-prefixed 14-char base32 string.

Example:

"TABCDEF234567A"

type
string
required

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.

Example:

"normalized_task"

state
string
required

Lifecycle state of the task. One of pending, approved, rejected, canceled, expired, failed, executed.

Example:

"pending"

created_at
string<date-time>
required

RFC 3339 UTC timestamp when the task was created.

Example:

"2026-01-15T12:34:56Z"

updated_at
string<date-time>
required

RFC 3339 UTC timestamp when the task was last updated.

Example:

"2026-01-15T12:35:56Z"

expires_at
string<date-time>
required

RFC 3339 UTC timestamp when the task expires if no decision is reached.

Example:

"2026-01-16T12:34:56Z"

initiator
object
required

User or API key that initiated the task.

quorum_type
string
required

Scope of the quorum required to advance the task. domain for org-wide quorum, vault for vault-scoped quorum.

Example:

"vault"

can_review
boolean
required

True if the caller may still cast a review decision on this task.

Example:

true

current_user_decision
string
required

The caller's own decision on this task. One of undecided, approved, denied.

Example:

"undecided"

activities
object[]
required

Chronological audit trail of actions taken against the task: creation, reviews, executions, and state transitions.

reviewer_statistics_label
string
required

Indicates which reviewer-tally field to consult. standard means use reviewer_statistics; multiquorum means use subquorum_approvals.

Example:

"standard"

instructions
(update_subquorum · object | update_vault_user · object | update_vault_policy · object | request_withdrawal · object | remove_org_user · object | create_user · object | update_withdrawal_address · object | update_user_permission · object | request_staking_allocation · object | request_transfer_to_spot · object | request_custody_transfer_to_spot · object | request_staking_deallocation · object | request_pledge · object | request_pledge_release · object | create_vault · object | update_vault · object | update_domain_policy · object | update_user_status · object | create_api_user · object | update_api_user · object)[]
required

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.

approval_id
string

Approval UUID, when the task is part of an approval flow.

Example:

"1ef8cecf-5d7b-4f83-9640-96d74db0e858"

reviewer_statistics
object

Tally of reviewer decisions for single-quorum tasks. Omitted for multi-quorum tasks. Use subquorum_approvals when reviewer_statistics_label is multiquorum.

vault_info
object

Vault the task is scoped to. Omitted for domain-level tasks that do not target a specific vault.

subquorum_snapshot
object

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.

subquorum_approvals
object[]

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.

result
object

Outcome of the task once it has been applied. Populated for task types that produce a result, such as user creation.