curl --request POST \
--url https://hip4-api.totalis.trade/v1/me/withdrawals \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"destination": "0x2222222222222222222222222222222222222222",
"amount": "15000000",
"vault_withdrawal": {
"amount": "10000000",
"expiry": "1790434800",
"salt": "4919131752989213764",
"signature": "0xefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef"
},
"payout_authorization": {
"valid_after": "1790433540",
"valid_before": "1790435100",
"authorization_signature": "0x9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e1b"
}
}
'import requests
url = "https://hip4-api.totalis.trade/v1/me/withdrawals"
payload = {
"destination": "0x2222222222222222222222222222222222222222",
"amount": "15000000",
"vault_withdrawal": {
"amount": "10000000",
"expiry": "1790434800",
"salt": "4919131752989213764",
"signature": "0xefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef"
},
"payout_authorization": {
"valid_after": "1790433540",
"valid_before": "1790435100",
"authorization_signature": "0x9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e1b"
}
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
destination: '0x2222222222222222222222222222222222222222',
amount: '15000000',
vault_withdrawal: {
amount: '10000000',
expiry: '1790434800',
salt: '4919131752989213764',
signature: '0xefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef'
},
payout_authorization: {
valid_after: '1790433540',
valid_before: '1790435100',
authorization_signature: '0x9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e1b'
}
})
};
fetch('https://hip4-api.totalis.trade/v1/me/withdrawals', 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://hip4-api.totalis.trade/v1/me/withdrawals",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'destination' => '0x2222222222222222222222222222222222222222',
'amount' => '15000000',
'vault_withdrawal' => [
'amount' => '10000000',
'expiry' => '1790434800',
'salt' => '4919131752989213764',
'signature' => '0xefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef'
],
'payout_authorization' => [
'valid_after' => '1790433540',
'valid_before' => '1790435100',
'authorization_signature' => '0x9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e1b'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$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://hip4-api.totalis.trade/v1/me/withdrawals"
payload := strings.NewReader("{\n \"destination\": \"0x2222222222222222222222222222222222222222\",\n \"amount\": \"15000000\",\n \"vault_withdrawal\": {\n \"amount\": \"10000000\",\n \"expiry\": \"1790434800\",\n \"salt\": \"4919131752989213764\",\n \"signature\": \"0xefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef\"\n },\n \"payout_authorization\": {\n \"valid_after\": \"1790433540\",\n \"valid_before\": \"1790435100\",\n \"authorization_signature\": \"0x9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e1b\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
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.post("https://hip4-api.totalis.trade/v1/me/withdrawals")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"destination\": \"0x2222222222222222222222222222222222222222\",\n \"amount\": \"15000000\",\n \"vault_withdrawal\": {\n \"amount\": \"10000000\",\n \"expiry\": \"1790434800\",\n \"salt\": \"4919131752989213764\",\n \"signature\": \"0xefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef\"\n },\n \"payout_authorization\": {\n \"valid_after\": \"1790433540\",\n \"valid_before\": \"1790435100\",\n \"authorization_signature\": \"0x9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e1b\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://hip4-api.totalis.trade/v1/me/withdrawals")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"destination\": \"0x2222222222222222222222222222222222222222\",\n \"amount\": \"15000000\",\n \"vault_withdrawal\": {\n \"amount\": \"10000000\",\n \"expiry\": \"1790434800\",\n \"salt\": \"4919131752989213764\",\n \"signature\": \"0xefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef\"\n },\n \"payout_authorization\": {\n \"valid_after\": \"1790433540\",\n \"valid_before\": \"1790435100\",\n \"authorization_signature\": \"0x9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e1b\"\n }\n}"
response = http.request(request)
puts response.read_body{
"withdrawal_id": "01998683-7a31-7e5a-a3c1-6f2b8d4e9a17",
"account": "0x1111111111111111111111111111111111111111",
"destination": "0x2222222222222222222222222222222222222222",
"amount": "15000000",
"shortfall_amount": "10000000",
"status": "VAULT_WITHDRAWAL_QUEUED",
"vault_operation_id": "0x3a7d1e9c5b2f8a4e6d1c9b3f7a5e2d8c4b1f6a9e3d7c2b5f8a1e4d9c6b3f7a20",
"payout_operation_id": null,
"payout_transaction_hash": null,
"updated_at": "2026-09-26T14:30:00.412000Z"
}{
"error": {
"code": "INVALID_REQUEST",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "NEVER"
}
}{
"error": {
"code": "INVALID_REQUEST",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "NEVER"
}
}{
"error": {
"code": "INVALID_REQUEST",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "NEVER"
}
}{
"error": {
"code": "INVALID_REQUEST",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "NEVER"
}
}{
"error": {
"code": "INVALID_REQUEST",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "NEVER"
}
}{
"error": {
"code": "INVALID_REQUEST",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "NEVER"
}
}{
"error": {
"code": "INVALID_REQUEST",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "NEVER"
}
}Create withdrawal
Withdraw USDC from your Totalis balance to an external address.
Requires a key for your account with funding:withdraw, sponsorship:use.
curl --request POST \
--url https://hip4-api.totalis.trade/v1/me/withdrawals \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"destination": "0x2222222222222222222222222222222222222222",
"amount": "15000000",
"vault_withdrawal": {
"amount": "10000000",
"expiry": "1790434800",
"salt": "4919131752989213764",
"signature": "0xefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef"
},
"payout_authorization": {
"valid_after": "1790433540",
"valid_before": "1790435100",
"authorization_signature": "0x9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e1b"
}
}
'import requests
url = "https://hip4-api.totalis.trade/v1/me/withdrawals"
payload = {
"destination": "0x2222222222222222222222222222222222222222",
"amount": "15000000",
"vault_withdrawal": {
"amount": "10000000",
"expiry": "1790434800",
"salt": "4919131752989213764",
"signature": "0xefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef"
},
"payout_authorization": {
"valid_after": "1790433540",
"valid_before": "1790435100",
"authorization_signature": "0x9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e1b"
}
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
destination: '0x2222222222222222222222222222222222222222',
amount: '15000000',
vault_withdrawal: {
amount: '10000000',
expiry: '1790434800',
salt: '4919131752989213764',
signature: '0xefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef'
},
payout_authorization: {
valid_after: '1790433540',
valid_before: '1790435100',
authorization_signature: '0x9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e1b'
}
})
};
fetch('https://hip4-api.totalis.trade/v1/me/withdrawals', 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://hip4-api.totalis.trade/v1/me/withdrawals",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'destination' => '0x2222222222222222222222222222222222222222',
'amount' => '15000000',
'vault_withdrawal' => [
'amount' => '10000000',
'expiry' => '1790434800',
'salt' => '4919131752989213764',
'signature' => '0xefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef'
],
'payout_authorization' => [
'valid_after' => '1790433540',
'valid_before' => '1790435100',
'authorization_signature' => '0x9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e1b'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$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://hip4-api.totalis.trade/v1/me/withdrawals"
payload := strings.NewReader("{\n \"destination\": \"0x2222222222222222222222222222222222222222\",\n \"amount\": \"15000000\",\n \"vault_withdrawal\": {\n \"amount\": \"10000000\",\n \"expiry\": \"1790434800\",\n \"salt\": \"4919131752989213764\",\n \"signature\": \"0xefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef\"\n },\n \"payout_authorization\": {\n \"valid_after\": \"1790433540\",\n \"valid_before\": \"1790435100\",\n \"authorization_signature\": \"0x9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e1b\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
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.post("https://hip4-api.totalis.trade/v1/me/withdrawals")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"destination\": \"0x2222222222222222222222222222222222222222\",\n \"amount\": \"15000000\",\n \"vault_withdrawal\": {\n \"amount\": \"10000000\",\n \"expiry\": \"1790434800\",\n \"salt\": \"4919131752989213764\",\n \"signature\": \"0xefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef\"\n },\n \"payout_authorization\": {\n \"valid_after\": \"1790433540\",\n \"valid_before\": \"1790435100\",\n \"authorization_signature\": \"0x9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e1b\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://hip4-api.totalis.trade/v1/me/withdrawals")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"destination\": \"0x2222222222222222222222222222222222222222\",\n \"amount\": \"15000000\",\n \"vault_withdrawal\": {\n \"amount\": \"10000000\",\n \"expiry\": \"1790434800\",\n \"salt\": \"4919131752989213764\",\n \"signature\": \"0xefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef\"\n },\n \"payout_authorization\": {\n \"valid_after\": \"1790433540\",\n \"valid_before\": \"1790435100\",\n \"authorization_signature\": \"0x9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e1b\"\n }\n}"
response = http.request(request)
puts response.read_body{
"withdrawal_id": "01998683-7a31-7e5a-a3c1-6f2b8d4e9a17",
"account": "0x1111111111111111111111111111111111111111",
"destination": "0x2222222222222222222222222222222222222222",
"amount": "15000000",
"shortfall_amount": "10000000",
"status": "VAULT_WITHDRAWAL_QUEUED",
"vault_operation_id": "0x3a7d1e9c5b2f8a4e6d1c9b3f7a5e2d8c4b1f6a9e3d7c2b5f8a1e4d9c6b3f7a20",
"payout_operation_id": null,
"payout_transaction_hash": null,
"updated_at": "2026-09-26T14:30:00.412000Z"
}{
"error": {
"code": "INVALID_REQUEST",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "NEVER"
}
}{
"error": {
"code": "INVALID_REQUEST",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "NEVER"
}
}{
"error": {
"code": "INVALID_REQUEST",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "NEVER"
}
}{
"error": {
"code": "INVALID_REQUEST",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "NEVER"
}
}{
"error": {
"code": "INVALID_REQUEST",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "NEVER"
}
}{
"error": {
"code": "INVALID_REQUEST",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "NEVER"
}
}{
"error": {
"code": "INVALID_REQUEST",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "NEVER"
}
}Authorizations
Scoped API key from the Totalis app settings. Each key acts for one account, yours or a maker's, and holds only scopes that account can use. Each operation lists the scopes it requires.
Headers
Lowercase UUIDv7 naming this command, unique per caller and route. A retry with the same key and body returns the original result; the same key with a different body returns 409 IDEMPOTENCY_KEY_REUSED.
^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$Body
The whole withdrawal in one request: pay amount from the embedded wallet to destination, topping the wallet up from the vault first when it cannot cover the amount. The owner signs the vault Exit for the shortfall and the USDC payout together; Totalis relays both, in order, and pays the gas.
External address that receives the USDC.
^0x[0-9a-f]{40}$Total amount to send, in atomic USDC (6 decimals); must be greater than zero.
39^(0|[1-9][0-9]*)$The embedded wallet's USDC EIP-3009 TransferWithAuthorization of exactly amount to destination. Its nonce is not sent: sign keccak256(abi.encode(keccak256("TOTALIS_PAYOUT_NONCE_V1"), chainId, vault, account, uint128(Idempotency-Key))), where account is the embedded wallet and Idempotency-Key is this request's key read as 16 bytes. The signature is therefore bound to this request and cannot start a second withdrawal. Choose the Idempotency-Key before you sign.
Show child attributes
Show child attributes
Signed Exit moving the exact shortfall (amount minus spendable wallet USDC) from the vault back to the embedded wallet. Required when there is a shortfall and forbidden when there is none; a mismatch returns 409 STATE_CONFLICT with retry REFRESH: re-read balances and sign again.
Show child attributes
Show child attributes
Response
Admitted, not yet paid: Totalis tops your wallet up from the vault if needed, relays the payout and pays the gas. Follow WITHDRAWAL_UPDATED on the account stream until PAYOUT_COMMITTED or FAILED. A retry with the same Idempotency-Key and body returns the withdrawal as it stands.
Server-assigned ID of this withdrawal.
^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$Embedded wallet that pays out.
^0x[0-9a-f]{40}$External address that receives the USDC.
^0x[0-9a-f]{40}$Total amount sent to destination, in atomic USDC (6 decimals).
39^(0|[1-9][0-9]*)$Part of amount first withdrawn from the vault to the wallet, in atomic USDC; "0" when the wallet already covered it.
39^(0|[1-9][0-9]*)$VAULT_WITHDRAWAL_QUEUED: the vault top-up is queued and the payout waits for it; PAYOUT_SUBMITTED: the payout is queued or relayed; PAYOUT_COMMITTED: destination received amount (terminal); FAILED: the withdrawal stopped and nothing left the Totalis balance: a vault top-up that committed stays in the wallet (terminal).
VAULT_WITHDRAWAL_QUEUED, PAYOUT_SUBMITTED, PAYOUT_COMMITTED, FAILED Operation of the vault top-up; null when there is no shortfall.
^0x[0-9a-f]{64}$Operation of the relayed payout; null until the vault top-up commits.
^0x[0-9a-f]{64}$HyperEVM transaction of the payout; null until it is broadcast.
^0x[0-9a-f]{64}$When the withdrawal last changed, RFC3339 UTC.
30^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}([.][0-9]{1,9})?Z$Was this page helpful?

