curl --request PATCH \
--url https://api.hel.io/v1/withdraw-details/{id} \
--header 'Content-Type: application/json' \
--data '
{
"ownerAddress": "<string>",
"recipient": "<string>",
"amount": "<string>",
"toCurrencyId": "<string>",
"sourceCurrencyId": "<string>",
"customerId": "<string>",
"slippageBps": 500
}
'import requests
url = "https://api.hel.io/v1/withdraw-details/{id}"
payload = {
"ownerAddress": "<string>",
"recipient": "<string>",
"amount": "<string>",
"toCurrencyId": "<string>",
"sourceCurrencyId": "<string>",
"customerId": "<string>",
"slippageBps": 500
}
headers = {"Content-Type": "application/json"}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
ownerAddress: '<string>',
recipient: '<string>',
amount: '<string>',
toCurrencyId: '<string>',
sourceCurrencyId: '<string>',
customerId: '<string>',
slippageBps: 500
})
};
fetch('https://api.hel.io/v1/withdraw-details/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.hel.io/v1/withdraw-details/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'ownerAddress' => '<string>',
'recipient' => '<string>',
'amount' => '<string>',
'toCurrencyId' => '<string>',
'sourceCurrencyId' => '<string>',
'customerId' => '<string>',
'slippageBps' => 500
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.hel.io/v1/withdraw-details/{id}"
payload := strings.NewReader("{\n \"ownerAddress\": \"<string>\",\n \"recipient\": \"<string>\",\n \"amount\": \"<string>\",\n \"toCurrencyId\": \"<string>\",\n \"sourceCurrencyId\": \"<string>\",\n \"customerId\": \"<string>\",\n \"slippageBps\": 500\n}")
req, _ := http.NewRequest("PATCH", url, payload)
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))
}HttpResponse<String> response = Unirest.patch("https://api.hel.io/v1/withdraw-details/{id}")
.header("Content-Type", "application/json")
.body("{\n \"ownerAddress\": \"<string>\",\n \"recipient\": \"<string>\",\n \"amount\": \"<string>\",\n \"toCurrencyId\": \"<string>\",\n \"sourceCurrencyId\": \"<string>\",\n \"customerId\": \"<string>\",\n \"slippageBps\": 500\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hel.io/v1/withdraw-details/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"ownerAddress\": \"<string>\",\n \"recipient\": \"<string>\",\n \"amount\": \"<string>\",\n \"toCurrencyId\": \"<string>\",\n \"sourceCurrencyId\": \"<string>\",\n \"customerId\": \"<string>\",\n \"slippageBps\": 500\n}"
response = http.request(request)
puts response.read_body{
"withdrawalDetailId": "<string>",
"token": "<string>",
"prepared": {
"kind": "raw",
"chain": "<string>",
"unsignedTx": "<string>"
},
"summary": {
"sourceToken": "<string>",
"sourceAmount": "<string>",
"destinationToken": "<string>",
"destinationAmount": "<string>",
"destinationAmountMin": "<string>",
"destinationAmountUsd": "<string>",
"destinationAmountMinUsd": "<string>",
"maxSlippageBps": 123,
"estimatedPriceImpact": 123,
"routerAddresses": [
"<string>"
],
"bridgeIds": [
"<string>"
],
"bridgeFee": {
"amount": "<string>",
"currency": {
"blockchain": {
"engine": {
"id": "<string>"
},
"id": "<string>",
"name": "<string>"
},
"id": "<string>",
"symbol": "<string>",
"name": "<string>",
"mintAddress": "<string>",
"coinMarketCapId": 123,
"decimals": 123,
"order": 123,
"minDecimals": 123,
"symbolPrefix": "<string>",
"features": [],
"iconUrl": "<string>"
}
},
"applicationFee": {
"amount": "<string>",
"currency": {
"blockchain": {
"engine": {
"id": "<string>"
},
"id": "<string>",
"name": "<string>"
},
"id": "<string>",
"symbol": "<string>",
"name": "<string>",
"mintAddress": "<string>",
"coinMarketCapId": 123,
"decimals": 123,
"order": 123,
"minDecimals": 123,
"symbolPrefix": "<string>",
"features": [],
"iconUrl": "<string>"
}
},
"protocolFee": {
"amount": "<string>",
"currency": {
"blockchain": {
"engine": {
"id": "<string>"
},
"id": "<string>",
"name": "<string>"
},
"id": "<string>",
"symbol": "<string>",
"name": "<string>",
"mintAddress": "<string>",
"coinMarketCapId": 123,
"decimals": 123,
"order": 123,
"minDecimals": 123,
"symbolPrefix": "<string>",
"features": [],
"iconUrl": "<string>"
}
},
"totalFee": {
"amount": "<string>",
"currency": {
"blockchain": {
"engine": {
"id": "<string>"
},
"id": "<string>",
"name": "<string>"
},
"id": "<string>",
"symbol": "<string>",
"name": "<string>",
"mintAddress": "<string>",
"coinMarketCapId": 123,
"decimals": 123,
"order": 123,
"minDecimals": 123,
"symbolPrefix": "<string>",
"features": [],
"iconUrl": "<string>"
}
},
"expiresAt": "2023-11-07T05:31:56Z"
}
}Update (Re-quote) a Withdrawal Detail
Re-quotes an existing withdrawal in place when inputs change or the quote expires. Returns a fresh token, prepared payload, and summary while reusing the same withdrawalDetailId.
curl --request PATCH \
--url https://api.hel.io/v1/withdraw-details/{id} \
--header 'Content-Type: application/json' \
--data '
{
"ownerAddress": "<string>",
"recipient": "<string>",
"amount": "<string>",
"toCurrencyId": "<string>",
"sourceCurrencyId": "<string>",
"customerId": "<string>",
"slippageBps": 500
}
'import requests
url = "https://api.hel.io/v1/withdraw-details/{id}"
payload = {
"ownerAddress": "<string>",
"recipient": "<string>",
"amount": "<string>",
"toCurrencyId": "<string>",
"sourceCurrencyId": "<string>",
"customerId": "<string>",
"slippageBps": 500
}
headers = {"Content-Type": "application/json"}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
ownerAddress: '<string>',
recipient: '<string>',
amount: '<string>',
toCurrencyId: '<string>',
sourceCurrencyId: '<string>',
customerId: '<string>',
slippageBps: 500
})
};
fetch('https://api.hel.io/v1/withdraw-details/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.hel.io/v1/withdraw-details/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'ownerAddress' => '<string>',
'recipient' => '<string>',
'amount' => '<string>',
'toCurrencyId' => '<string>',
'sourceCurrencyId' => '<string>',
'customerId' => '<string>',
'slippageBps' => 500
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.hel.io/v1/withdraw-details/{id}"
payload := strings.NewReader("{\n \"ownerAddress\": \"<string>\",\n \"recipient\": \"<string>\",\n \"amount\": \"<string>\",\n \"toCurrencyId\": \"<string>\",\n \"sourceCurrencyId\": \"<string>\",\n \"customerId\": \"<string>\",\n \"slippageBps\": 500\n}")
req, _ := http.NewRequest("PATCH", url, payload)
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))
}HttpResponse<String> response = Unirest.patch("https://api.hel.io/v1/withdraw-details/{id}")
.header("Content-Type", "application/json")
.body("{\n \"ownerAddress\": \"<string>\",\n \"recipient\": \"<string>\",\n \"amount\": \"<string>\",\n \"toCurrencyId\": \"<string>\",\n \"sourceCurrencyId\": \"<string>\",\n \"customerId\": \"<string>\",\n \"slippageBps\": 500\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hel.io/v1/withdraw-details/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"ownerAddress\": \"<string>\",\n \"recipient\": \"<string>\",\n \"amount\": \"<string>\",\n \"toCurrencyId\": \"<string>\",\n \"sourceCurrencyId\": \"<string>\",\n \"customerId\": \"<string>\",\n \"slippageBps\": 500\n}"
response = http.request(request)
puts response.read_body{
"withdrawalDetailId": "<string>",
"token": "<string>",
"prepared": {
"kind": "raw",
"chain": "<string>",
"unsignedTx": "<string>"
},
"summary": {
"sourceToken": "<string>",
"sourceAmount": "<string>",
"destinationToken": "<string>",
"destinationAmount": "<string>",
"destinationAmountMin": "<string>",
"destinationAmountUsd": "<string>",
"destinationAmountMinUsd": "<string>",
"maxSlippageBps": 123,
"estimatedPriceImpact": 123,
"routerAddresses": [
"<string>"
],
"bridgeIds": [
"<string>"
],
"bridgeFee": {
"amount": "<string>",
"currency": {
"blockchain": {
"engine": {
"id": "<string>"
},
"id": "<string>",
"name": "<string>"
},
"id": "<string>",
"symbol": "<string>",
"name": "<string>",
"mintAddress": "<string>",
"coinMarketCapId": 123,
"decimals": 123,
"order": 123,
"minDecimals": 123,
"symbolPrefix": "<string>",
"features": [],
"iconUrl": "<string>"
}
},
"applicationFee": {
"amount": "<string>",
"currency": {
"blockchain": {
"engine": {
"id": "<string>"
},
"id": "<string>",
"name": "<string>"
},
"id": "<string>",
"symbol": "<string>",
"name": "<string>",
"mintAddress": "<string>",
"coinMarketCapId": 123,
"decimals": 123,
"order": 123,
"minDecimals": 123,
"symbolPrefix": "<string>",
"features": [],
"iconUrl": "<string>"
}
},
"protocolFee": {
"amount": "<string>",
"currency": {
"blockchain": {
"engine": {
"id": "<string>"
},
"id": "<string>",
"name": "<string>"
},
"id": "<string>",
"symbol": "<string>",
"name": "<string>",
"mintAddress": "<string>",
"coinMarketCapId": 123,
"decimals": 123,
"order": 123,
"minDecimals": 123,
"symbolPrefix": "<string>",
"features": [],
"iconUrl": "<string>"
}
},
"totalFee": {
"amount": "<string>",
"currency": {
"blockchain": {
"engine": {
"id": "<string>"
},
"id": "<string>",
"name": "<string>"
},
"id": "<string>",
"symbol": "<string>",
"name": "<string>",
"mintAddress": "<string>",
"coinMarketCapId": 123,
"decimals": 123,
"order": 123,
"minDecimals": 123,
"symbolPrefix": "<string>",
"features": [],
"iconUrl": "<string>"
}
},
"expiresAt": "2023-11-07T05:31:56Z"
}
}api.hel.io/v1. For the development environment, use api.dev.hel.io/v1.withdrawalDetailId. Only withdrawal details in QUOTED state can be re-quoted; otherwise the API returns 409. Optional customerId is set on prepare only and is not applied on re-quote.The request body uses the same amount format as prepare — atomic units scaled by the source currency’s decimals value (see Withdrawals — Amounts).Path Parameters
The withdrawal detail ID from prepare.
Body
Holder's source wallet address. Format is lane-specific (e.g. Solana base58 for Solana raw, EVM checksummed address for EVM raw/hyperliquid).
Destination address on any supported chain.
Amount in atomic units as a decimal-free string. Scale using the source currency's decimals value (e.g. 1500000 for 1.5 USDC at 6 decimals; 150000000 for 1.5 USDC at 8 decimals on HyperCore).
^\d+$Destination currency Mongo ID.
Source currency Mongo ID from the withdrawal config.
Optional merchant identifier for the end user (max 255 characters). Persisted on prepare and echoed on the withdrawal detail and webhooks. Not applied on re-quote.
255Optional slippage tolerance in basis points (0–10000) forwarded to the swap/bridge provider. Defaults to 500 (5%) when omitted.
0 <= x <= 10000