Skip to main content
POST
/
v0
/
insto
/
custody
/
vaults
/
{vault_id}
/
withdrawals
/
fee-quotes
Create withdrawal fee quote
curl --request POST \
  --url https://api.kraken.com/v0/insto/custody/vaults/{vault_id}/withdrawals/fee-quotes \
  --header 'Content-Type: application/json' \
  --header 'api-key: <api-key>' \
  --header 'api-nonce: <api-key>' \
  --header 'api-otp: <api-key>' \
  --header 'api-sign: <api-key>' \
  --data '
{
  "asset": "BTC",
  "asset_class": "currency",
  "amount": "0.5",
  "fee_included": false,
  "address_name": "My BTC Wallet"
}
'
import requests

url = "https://api.kraken.com/v0/insto/custody/vaults/{vault_id}/withdrawals/fee-quotes"

payload = {
"asset": "BTC",
"asset_class": "currency",
"amount": "0.5",
"fee_included": False,
"address_name": "My BTC Wallet"
}
headers = {
"api-key": "<api-key>",
"api-sign": "<api-key>",
"api-nonce": "<api-key>",
"api-otp": "<api-key>",
"Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'POST',
headers: {
'api-key': '<api-key>',
'api-sign': '<api-key>',
'api-nonce': '<api-key>',
'api-otp': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
asset: 'BTC',
asset_class: 'currency',
amount: '0.5',
fee_included: false,
address_name: 'My BTC Wallet'
})
};

fetch('https://api.kraken.com/v0/insto/custody/vaults/{vault_id}/withdrawals/fee-quotes', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
package main

import (
"fmt"
"strings"
"net/http"
"io"
)

func main() {

url := "https://api.kraken.com/v0/insto/custody/vaults/{vault_id}/withdrawals/fee-quotes"

payload := strings.NewReader("{\n \"asset\": \"BTC\",\n \"asset_class\": \"currency\",\n \"amount\": \"0.5\",\n \"fee_included\": false,\n \"address_name\": \"My BTC Wallet\"\n}")

req, _ := http.NewRequest("POST", url, payload)

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>")
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))

}
{
  "fee_quote_id": "QABCDEF234567A",
  "asset": "BTC",
  "asset_class": "currency",
  "fees": [
    {
      "fee_level": "normal",
      "fee_asset": "BTC",
      "fee_asset_class": "currency",
      "fee_amount": "0.0001"
    }
  ]
}
{
"type": "tag:kraken.com,2025:BadRequest",
"status": 400,
"title": "Bad Request",
"data": {
"message": "amount must be a positive decimal"
},
"detail": "Request failed validation: amount must be positive.",
"instance": "https://debug.kraken.com/req/01HXYZABCDEF"
}
{
"type": "tag:kraken.com,2025:PermissionDenied",
"status": 403,
"title": "Permission Denied",
"data": {
"message": "Caller lacks read access to vault VABCDEF234567A"
},
"detail": "The caller does not have access to the requested vault.",
"instance": "https://debug.kraken.com/req/01HXYZABCDEF"
}
{
"type": "tag:kraken.com,2025:AssetNotFound",
"status": 404,
"title": "Not Found",
"data": {
"message": "Asset BTC with class currency is not configured for withdrawal"
},
"detail": "Asset not found for the requested asset class.",
"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; retry with backoff.",
"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

vault_id
string
required

Vault identifier the withdrawal would be debited from, a V-prefixed 14-char base32 string with a final check character.

Example:

"VABCDEF234567A"

Body

application/json
asset
string
required

Asset code to be withdrawn (e.g. BTC, ETH, USD). Determines the asset the fee tiers are denominated in.

Example:

"BTC"

asset_class
string
required

Asset class of the withdrawn asset. Currently only currency is supported.

Example:

"currency"

amount
string
required

Withdrawal amount as a fixed-precision decimal string. Must be positive.

Example:

"0.5"

fee_included
boolean

Whether the fee should be deducted from amount (true) or charged on top (false). Defaults to false when omitted.

Example:

false

address_name
string

Optional name of a previously whitelisted destination address. When supplied, the quote is scoped to that address; some networks vary the fee by destination.

Example:

"My BTC Wallet"

Response

Fee quote generated successfully. The returned fee_quote_id can be passed as fee_quote_id on a request_withdrawal instruction to POST /v0/insto/custody/tasks to submit the withdrawal with one of the listed fee tiers.

fee_quote_id
string
required

Identifier of the generated fee quote. Pass this value as fee_quote_id when submitting the matching withdrawal. A Q-prefixed 14-char base32 string.

Example:

"QABCDEF234567A"

asset
string
required

Asset code the quote was generated for. Mirrors the asset supplied in the request.

Example:

"BTC"

asset_class
string
required

Asset class of the quoted asset. Currently always currency.

Example:

"currency"

fees
object[]
required

Available fee tiers for the quoted withdrawal. Each entry is a self-contained option the caller can pick when submitting the withdrawal.