curl --request GET \
--url https://api.kraken.com/v0/insto/custody/tasks/activities/{activity_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/activities/{activity_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/activities/{activity_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/activities/{activity_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": "AABCDEFG23456A",
"created_at": "2026-01-15T12:34:56Z",
"type": "review_approved",
"state": "pending",
"task": {
"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"
},
"comment": "Transaction approved by finance team.",
"user": {
"full_name": "Alex Doe",
"role": "vault_admin",
"ip_address": "203.0.113.10",
"iiban": "ABCD EFGH IJKL MNOP"
},
"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,
"reviewer_statistics": {
"approved": 2,
"denied": 0,
"undecided": 1,
"current_count": 3,
"required_quorum": 2
},
"current_user_decision": "undecided",
"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"
}
]
}
]
}
},
"reviewer_statistics_label": "standard",
"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"
]
}
],
"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>"
}
}
]
}{
"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 activity by id
Returns a single task activity and the curated task it belongs to. The embedded task uses the same flat atomic instructions[] model as Get task by id. Domain and organization scope are derived from the activity’s task; there is no request org_iiban. Unknown, out-of-scope, and malformed activity identifiers all return 403.
Rate limit: 200 requests per 30 seconds per IP.
curl --request GET \
--url https://api.kraken.com/v0/insto/custody/tasks/activities/{activity_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/activities/{activity_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/activities/{activity_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/activities/{activity_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": "AABCDEFG23456A",
"created_at": "2026-01-15T12:34:56Z",
"type": "review_approved",
"state": "pending",
"task": {
"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"
},
"comment": "Transaction approved by finance team.",
"user": {
"full_name": "Alex Doe",
"role": "vault_admin",
"ip_address": "203.0.113.10",
"iiban": "ABCD EFGH IJKL MNOP"
},
"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,
"reviewer_statistics": {
"approved": 2,
"denied": 0,
"undecided": 1,
"current_count": 3,
"required_quorum": 2
},
"current_user_decision": "undecided",
"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"
}
]
}
]
}
},
"reviewer_statistics_label": "standard",
"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"
]
}
],
"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>"
}
}
]
}{
"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
Activity identifier, an A-prefixed 14-char base32 string.
"AABCDEFG23456A"
Response
The requested task activity and its embedded curated task.
Activity identifier, an A-prefixed 14-char base32 string.
"AABCDEFG23456A"
RFC 3339 UTC timestamp when the activity occurred.
"2026-01-15T12:34:56Z"
Activity action discriminator (lowercase), e.g. created, review_approved, review_denied, executed.
"review_approved"
Task state at the time of the activity (lowercase).
"pending"
Curated details of the task this activity belongs to. Uses flat atomic instructions[]; does not include payload, operations, or a nested activity timeline.
Show child attributes
Show child attributes
Reviewer-supplied comment, when present.
"Transaction approved by finance team."
Resolved user or API-key details for the actor, when available at read time.
Show child attributes
Show child attributes
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
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
The caller's own decision on this task. One of undecided, approved, denied.
"undecided"
Vault the task is scoped to. Omitted for domain-level tasks that do not target a specific vault.
Show child attributes
Show child attributes
Indicates which reviewer-tally field to consult. standard means use reviewer_statistics; multiquorum means use subquorum_approvals.
"standard"
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
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
Was this page helpful?