curl --request POST \
--url https://api.agg.market/execution/withdraw \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'x-app-id: <api-key>' \
--data '
{
"amountRaw": "50000000",
"tokenSymbol": "USDC",
"destinationAddress": "0x2f9a4c7e1b3d6f8a0c5e9b2d4f7a1c3e6b8d0f52",
"destinationChainId": 8453
}
'import requests
url = "https://api.agg.market/execution/withdraw"
payload = {
"amountRaw": "50000000",
"tokenSymbol": "USDC",
"destinationAddress": "0x2f9a4c7e1b3d6f8a0c5e9b2d4f7a1c3e6b8d0f52",
"destinationChainId": 8453
}
headers = {
"x-app-id": "<api-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-app-id': '<api-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
amountRaw: '50000000',
tokenSymbol: 'USDC',
destinationAddress: '0x2f9a4c7e1b3d6f8a0c5e9b2d4f7a1c3e6b8d0f52',
destinationChainId: 8453
})
};
fetch('https://api.agg.market/execution/withdraw', 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.agg.market/execution/withdraw",
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([
'amountRaw' => '50000000',
'tokenSymbol' => 'USDC',
'destinationAddress' => '0x2f9a4c7e1b3d6f8a0c5e9b2d4f7a1c3e6b8d0f52',
'destinationChainId' => 8453
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"x-app-id: <api-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://api.agg.market/execution/withdraw"
payload := strings.NewReader("{\n \"amountRaw\": \"50000000\",\n \"tokenSymbol\": \"USDC\",\n \"destinationAddress\": \"0x2f9a4c7e1b3d6f8a0c5e9b2d4f7a1c3e6b8d0f52\",\n \"destinationChainId\": 8453\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-app-id", "<api-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://api.agg.market/execution/withdraw")
.header("x-app-id", "<api-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"amountRaw\": \"50000000\",\n \"tokenSymbol\": \"USDC\",\n \"destinationAddress\": \"0x2f9a4c7e1b3d6f8a0c5e9b2d4f7a1c3e6b8d0f52\",\n \"destinationChainId\": 8453\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.agg.market/execution/withdraw")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-app-id"] = '<api-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"amountRaw\": \"50000000\",\n \"tokenSymbol\": \"USDC\",\n \"destinationAddress\": \"0x2f9a4c7e1b3d6f8a0c5e9b2d4f7a1c3e6b8d0f52\",\n \"destinationChainId\": 8453\n}"
response = http.request(request)
puts response.read_body{
"withdrawalId": "cmf3s7d9k00e1mw0l4n2x6pvh",
"status": "pending",
"requested": {
"tokenSymbol": "USDC",
"amountRaw": "50000000"
},
"completedAmountRaw": null,
"destination": {
"chainId": 8453,
"address": "0x2f9a4c7e1b3d6f8a0c5e9b2d4f7a1c3e6b8d0f52",
"tokenSymbol": "USDC"
},
"legs": [
{
"type": "bridge",
"status": "planned",
"sourceChainId": 137,
"destChainId": 8453,
"amountRaw": "50000000",
"txHash": null,
"bridgeOperationId": null,
"sourceTokenSymbol": "USDC",
"errorMessage": null
}
],
"expected": {
"outputRaw": "49930000",
"feeRaw": "70000",
"etaSeconds": 30
},
"pricingStatus": "quoted",
"errorMessage": null,
"sources": [
{
"sourceId": "cmf3s7d9m00e2mw0l8k5r1bqa",
"chainId": 137,
"tokenSymbol": "USDC",
"tokenAddress": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
"decimals": 6,
"amountRaw": "50000000",
"custodyKind": "DEPOSIT_WALLET",
"status": "pending",
"txHash": null,
"bridgeOperationId": null
}
]
}{
"message": "<string>"
}{
"message": "<string>"
}{
"message": "<string>"
}{
"message": "<string>"
}Withdraw funds
Withdraws funds through the normal transfer/bridge planner. An optional requestId UUID makes exact-amount requests replayable: the same owner/key and parameters return the original lifecycle without dispatching twice; changed parameters return 409. Do not combine requestId with max. Continue polling the returned withdrawalId through terminal settlement.
curl --request POST \
--url https://api.agg.market/execution/withdraw \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'x-app-id: <api-key>' \
--data '
{
"amountRaw": "50000000",
"tokenSymbol": "USDC",
"destinationAddress": "0x2f9a4c7e1b3d6f8a0c5e9b2d4f7a1c3e6b8d0f52",
"destinationChainId": 8453
}
'import requests
url = "https://api.agg.market/execution/withdraw"
payload = {
"amountRaw": "50000000",
"tokenSymbol": "USDC",
"destinationAddress": "0x2f9a4c7e1b3d6f8a0c5e9b2d4f7a1c3e6b8d0f52",
"destinationChainId": 8453
}
headers = {
"x-app-id": "<api-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-app-id': '<api-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
amountRaw: '50000000',
tokenSymbol: 'USDC',
destinationAddress: '0x2f9a4c7e1b3d6f8a0c5e9b2d4f7a1c3e6b8d0f52',
destinationChainId: 8453
})
};
fetch('https://api.agg.market/execution/withdraw', 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.agg.market/execution/withdraw",
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([
'amountRaw' => '50000000',
'tokenSymbol' => 'USDC',
'destinationAddress' => '0x2f9a4c7e1b3d6f8a0c5e9b2d4f7a1c3e6b8d0f52',
'destinationChainId' => 8453
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"x-app-id: <api-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://api.agg.market/execution/withdraw"
payload := strings.NewReader("{\n \"amountRaw\": \"50000000\",\n \"tokenSymbol\": \"USDC\",\n \"destinationAddress\": \"0x2f9a4c7e1b3d6f8a0c5e9b2d4f7a1c3e6b8d0f52\",\n \"destinationChainId\": 8453\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-app-id", "<api-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://api.agg.market/execution/withdraw")
.header("x-app-id", "<api-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"amountRaw\": \"50000000\",\n \"tokenSymbol\": \"USDC\",\n \"destinationAddress\": \"0x2f9a4c7e1b3d6f8a0c5e9b2d4f7a1c3e6b8d0f52\",\n \"destinationChainId\": 8453\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.agg.market/execution/withdraw")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-app-id"] = '<api-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"amountRaw\": \"50000000\",\n \"tokenSymbol\": \"USDC\",\n \"destinationAddress\": \"0x2f9a4c7e1b3d6f8a0c5e9b2d4f7a1c3e6b8d0f52\",\n \"destinationChainId\": 8453\n}"
response = http.request(request)
puts response.read_body{
"withdrawalId": "cmf3s7d9k00e1mw0l4n2x6pvh",
"status": "pending",
"requested": {
"tokenSymbol": "USDC",
"amountRaw": "50000000"
},
"completedAmountRaw": null,
"destination": {
"chainId": 8453,
"address": "0x2f9a4c7e1b3d6f8a0c5e9b2d4f7a1c3e6b8d0f52",
"tokenSymbol": "USDC"
},
"legs": [
{
"type": "bridge",
"status": "planned",
"sourceChainId": 137,
"destChainId": 8453,
"amountRaw": "50000000",
"txHash": null,
"bridgeOperationId": null,
"sourceTokenSymbol": "USDC",
"errorMessage": null
}
],
"expected": {
"outputRaw": "49930000",
"feeRaw": "70000",
"etaSeconds": 30
},
"pricingStatus": "quoted",
"errorMessage": null,
"sources": [
{
"sourceId": "cmf3s7d9m00e2mw0l8k5r1bqa",
"chainId": 137,
"tokenSymbol": "USDC",
"tokenAddress": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
"decimals": 6,
"amountRaw": "50000000",
"custodyKind": "DEPOSIT_WALLET",
"status": "pending",
"txHash": null,
"bridgeOperationId": null
}
]
}{
"message": "<string>"
}{
"message": "<string>"
}{
"message": "<string>"
}{
"message": "<string>"
}Authorizations
Your application ID. Required for all app-tier and user-tier routes.
JWT access token returned by POST /auth/verify. Required for user-tier routes.
Body
Amount to withdraw, as a positive integer string in the destination token's atomic units (6 decimals, so 1000000 = 1 USDC; 18 decimals on BNB Chain). Minimum is one whole token. Fees are deducted from this amount.
^[1-9][0-9]*$Stable-coin symbol the withdrawal is denominated in.
USDC, USDC.e, USDT Recipient address. EVM destinations: 0x-prefixed 20-byte hex. Solana: base58 (32–44 chars).
^(0x[a-fA-F0-9]{40}|[1-9A-HJ-NP-Za-km-z]{32,44})$Chain ID where the recipient address should receive funds.
x >= 1Optional idempotency key for an exact-amount transfer. Reuse with the identical body to recover a lost response. Not combined with max.
Cap to the deliverable maximum (withdraw-max intent).
Response
200
Withdrawal id. Poll it on the status endpoint.
Withdrawal status. pending: accepted, not started (the submit response always returns this). bridging: moving funds across chains. transferring: same-chain transfer in progress. Terminal: completed, partial (some sources delivered; see completedAmountRaw), failed.
pending, bridging, transferring, completed, partial, failed What is being withdrawn.
Show child attributes
Show child attributes
Estimated total delivered by the completed parts. null until the withdrawal is terminal. Integer string in the destination token's atomic units (6 decimals, so 1000000 = 1 USDC; 18 decimals on BNB Chain).
Where the funds are delivered.
Show child attributes
Show child attributes
Transfers that make up the withdrawal.
Show child attributes
Show child attributes
Quote for the withdrawal. null fields unless pricingStatus is quoted.
Show child attributes
Show child attributes
Fee quote state. quoted: expected holds a current quote. unquoted / quoting: no quote yet. unviable: at least one source is too small to cover its fees.
unquoted, quoting, quoted, unviable Why the withdrawal failed or only partly completed. null otherwise, and always null on the submit response (errors there are returned as HTTP errors).
Balances the withdrawal is funded from.
Show child attributes
Show child attributes