curl --request GET \
--url https://calibri.io/api/v2/atlas/account/bridge/withdraw/quote \
--header 'X-Auth-Apikey: <api-key>'import requests
url = "https://calibri.io/api/v2/atlas/account/bridge/withdraw/quote"
headers = {"X-Auth-Apikey": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Auth-Apikey': '<api-key>'}};
fetch('https://calibri.io/api/v2/atlas/account/bridge/withdraw/quote', 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://calibri.io/api/v2/atlas/account/bridge/withdraw/quote",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Auth-Apikey: <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"
"net/http"
"io"
)
func main() {
url := "https://calibri.io/api/v2/atlas/account/bridge/withdraw/quote"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Auth-Apikey", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://calibri.io/api/v2/atlas/account/bridge/withdraw/quote")
.header("X-Auth-Apikey", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://calibri.io/api/v2/atlas/account/bridge/withdraw/quote")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Auth-Apikey"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"amount": "50",
"chain_key": "ethereum",
"destination": "0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed",
"expires_at": "2026-09-24T10:05:00Z",
"fee": "3",
"max_cctp_fee": "0.01",
"min_amount": "20",
"quote_id": "6c1f0a52-…",
"receive": "46.99",
"safe": "0x0DECE7d83f8D47CD8dD8278c0F22c361C58577BD",
"safe_tx": {
"data": "0x8d80ff0a…",
"operation": 1,
"to": "0x40A2aCCbd92BCA938b02010E17A5b8929b49130D",
"value": "0"
}
}Quote a cross-chain withdrawal
Prices a withdrawal of amount USDC from your wallet on Polygon to destination on another network (chain_key, a chain from the bridge config), and returns the wallet transaction to sign for it (safe_tx: one batch that pays the fee, approves and burns the rest over Circle CCTP). Sign safe_tx and relay it through POST /account/wallet/relay with this quote_id before expires_at (5 minutes); a quote can be used once. fee is ours, max_cctp_fee the most Circle may keep, receive the minimum you receive. destination must be a checksummed address other than your wallet; a wallet (not passkey) account can withdraw only to its linked wallet. Refusals are 422 with code: below_minimum, withdrawals_disabled, chain_inactive, receive_not_positive, no_safe, no_wallet, destination_is_safe, destination_not_linked_wallet. Rate limited to 10 per minute.
curl --request GET \
--url https://calibri.io/api/v2/atlas/account/bridge/withdraw/quote \
--header 'X-Auth-Apikey: <api-key>'import requests
url = "https://calibri.io/api/v2/atlas/account/bridge/withdraw/quote"
headers = {"X-Auth-Apikey": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Auth-Apikey': '<api-key>'}};
fetch('https://calibri.io/api/v2/atlas/account/bridge/withdraw/quote', 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://calibri.io/api/v2/atlas/account/bridge/withdraw/quote",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Auth-Apikey: <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"
"net/http"
"io"
)
func main() {
url := "https://calibri.io/api/v2/atlas/account/bridge/withdraw/quote"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Auth-Apikey", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://calibri.io/api/v2/atlas/account/bridge/withdraw/quote")
.header("X-Auth-Apikey", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://calibri.io/api/v2/atlas/account/bridge/withdraw/quote")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Auth-Apikey"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"amount": "50",
"chain_key": "ethereum",
"destination": "0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed",
"expires_at": "2026-09-24T10:05:00Z",
"fee": "3",
"max_cctp_fee": "0.01",
"min_amount": "20",
"quote_id": "6c1f0a52-…",
"receive": "46.99",
"safe": "0x0DECE7d83f8D47CD8dD8278c0F22c361C58577BD",
"safe_tx": {
"data": "0x8d80ff0a…",
"operation": 1,
"to": "0x40A2aCCbd92BCA938b02010E17A5b8929b49130D",
"value": "0"
}
}Authorizations
HMAC-signed API key. Send X-Auth-Apikey, X-Auth-Nonce and X-Auth-Signature.
Query Parameters
Recipient on the destination chain, checksummed.
USDC to withdraw (fee included).
Destination chain key.
Response
What leaves your wallet, in USDC (fee included).
"50"
Destination chain key.
"ethereum"
The recipient, checksummed.
"0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed"
Sign and relay before this.
"2026-09-24T10:05:00Z"
Our fee, in USDC.
"3"
The most Circle may keep of the transfer, in USDC.
"0.01"
Smallest withdrawal to this chain, in USDC.
"20"
Relay the signed safe_tx with this id.
"6c1f0a52-…"
The minimum you receive on the destination chain, in USDC.
"46.99"
Your wallet (the Safe that signs), checksummed.
"0x0DECE7d83f8D47CD8dD8278c0F22c361C58577BD"
The wallet transaction to sign.
Show child attributes
Show child attributes