curl --request GET \
--url https://api.satora.io/quoteimport requests
url = "https://api.satora.io/quote"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.satora.io/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://api.satora.io/quote",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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://api.satora.io/quote"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.satora.io/quote")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.satora.io/quote")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"exchange_rate": "<string>",
"gasless_network_fee": 1,
"max_amount": 1,
"min_amount": 1,
"net_source_amount": "<string>",
"net_target_amount": "<string>",
"network_fee": 1,
"protocol_fee": 1,
"protocol_fee_rate": 123,
"source_amount": "<string>",
"target_amount": "<string>",
"bridge_fee": 1
}{
"error": "<string>"
}Get a quote for swapping BTC to/from EVM tokens
Specify exactly one of source_amount or target_amount. Amounts are in the smallest unit of the respective token (satoshis for BTC, raw units for EVM tokens).
curl --request GET \
--url https://api.satora.io/quoteimport requests
url = "https://api.satora.io/quote"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.satora.io/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://api.satora.io/quote",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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://api.satora.io/quote"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.satora.io/quote")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.satora.io/quote")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"exchange_rate": "<string>",
"gasless_network_fee": 1,
"max_amount": 1,
"min_amount": 1,
"net_source_amount": "<string>",
"net_target_amount": "<string>",
"network_fee": 1,
"protocol_fee": 1,
"protocol_fee_rate": 123,
"source_amount": "<string>",
"target_amount": "<string>",
"bridge_fee": 1
}{
"error": "<string>"
}Query Parameters
Source blockchain (e.g., "Arkade", "Lightning", "Bitcoin", "Polygon", "Ethereum", "Arbitrum") Supported blockchain networks. EVM chains serialize to their chain ID as a string (e.g. "137" for Polygon). Rootstock is "30" on a mainnet daemon and "31" on a testnet daemon.
Arkade, Lightning, Bitcoin, 137, 1, 42161, 30, 31 Source token: contract address for EVM tokens, or "btc" for BTC
Target blockchain Supported blockchain networks. EVM chains serialize to their chain ID as a string (e.g. "137" for Polygon). Rootstock is "30" on a mainnet daemon and "31" on a testnet daemon.
Arkade, Lightning, Bitcoin, 137, 1, 42161, 30, 31 Target token: contract address for EVM tokens, or "btc" for BTC
Amount in smallest unit of source token (mutually exclusive with target_amount)
Amount in smallest unit of target token (mutually exclusive with source_amount)
Optional: CCTP bridge destination chain (e.g., "Base", "Optimism"). When set, the CCTP forwarding fee is deducted from the target amount.
Optional: CCTP bridge source chain (e.g., "Optimism", "Base", "Solana"). Set when the user's source USDC originates on another CCTP chain and hops to Arbitrum via CCTPv2 before the HTLC is created. The quote internally runs the DEX calculation on Arbitrum-native USDC and accounts for the fast-transfer fee deducted on the burn.
true when the recipient's USDC token account on the destination
chain does NOT yet exist and Circle's forwarder needs to create it
(only meaningful for non-EVM destinations like Solana — adds
~$0.05 of ATA rent to forwardFee). false (default) confirms
the recipient already holds USDC, and is correct for all EVM
destinations. Solana callers are responsible for probing the
destination chain and setting this correctly.
Optional referral code for tracking.
Optional per-swap fee surcharge in basis points (0..=max_extra_fee_bps configured on the matching developer key). Rejected with 400 if it exceeds the per-key cap.
x >= 0Response
Return a quote for swapping BTC to/from EVM tokens
Exchange rate: how much of the EVM token you get/pay per BTC
Gasless network fee estimate (in satoshis) — covers the additional gas the server pays to execute the DEX swap on behalf of the user (redeemAndExecute via the coordinator contract).
x >= 0Maximum BTC value of the swap in satoshis
x >= 0Minimum BTC value of the swap in satoshis
x >= 0Net source amount: what the user actually sends including all fees.
Equals source_amount when the user provided source_amount;
otherwise source_amount + fees_in_source_units.
Net target amount: what the user actually receives after all fees.
Equals target_amount when the user provided target_amount;
otherwise target_amount - fees_in_target_units.
Network fee estimate (in satoshis) — covers server-paid gas for HTLC create/claim + BTC mining fee when applicable.
x >= 0Protocol fee (in satoshis)
x >= 0Protocol fee rate (as decimal, e.g., 0.0025 = 0.25%)
Pre-calculated source amount in smallest unit of source token (pre-fee).
Pre-calculated target amount in smallest unit of target token (pre-fee).
CCTP bridge forwarding fee in USDC smallest units (6 decimals). Only present when bridge_target_chain was specified in the quote request.
x >= 0