from compass_api_sdk import CompassAPI, models
with CompassAPI(
api_key_auth="<YOUR_API_KEY_HERE>",
) as compass_api:
res = compass_api.earn.earn_swap(token_in="USDC", token_out="USDT", amount_in="0.01", owner="0x06A9aF046187895AcFc7258450B15397CAc67400", chain=models.EarnSwapRequestChain.BASE, slippage="0.5", gas_sponsorship=False, pricing=models.EarnSwapRequestPricing.AUTO)
# Handle response
print(res)import { CompassApiSDK } from "@compass-labs/api-sdk";
const compassApiSDK = new CompassApiSDK({
apiKeyAuth: "<YOUR_API_KEY_HERE>",
});
async function run() {
const result = await compassApiSDK.earn.earnSwap({
tokenIn: "USDC",
tokenOut: "USDT",
amountIn: "0.01",
slippage: "0.5",
owner: "0x06A9aF046187895AcFc7258450B15397CAc67400",
chain: "base",
gasSponsorship: false,
pricing: "auto",
});
console.log(result);
}
run();curl --request POST \
--url https://api.compasslabs.ai/v2/earn/swap \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"owner": "0x06A9aF046187895AcFc7258450B15397CAc67400",
"chain": "base",
"token_in": "USDC",
"token_out": "USDT",
"amount_in": "0.01",
"slippage": "0.5",
"gas_sponsorship": false,
"pricing": "auto"
}
'const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
owner: '0x06A9aF046187895AcFc7258450B15397CAc67400',
chain: 'base',
token_in: 'USDC',
token_out: 'USDT',
amount_in: '0.01',
slippage: '0.5',
gas_sponsorship: false,
pricing: 'auto'
})
};
fetch('https://api.compasslabs.ai/v2/earn/swap', 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.compasslabs.ai/v2/earn/swap",
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([
'owner' => '0x06A9aF046187895AcFc7258450B15397CAc67400',
'chain' => 'base',
'token_in' => 'USDC',
'token_out' => 'USDT',
'amount_in' => '0.01',
'slippage' => '0.5',
'gas_sponsorship' => false,
'pricing' => 'auto'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <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.compasslabs.ai/v2/earn/swap"
payload := strings.NewReader("{\n \"owner\": \"0x06A9aF046187895AcFc7258450B15397CAc67400\",\n \"chain\": \"base\",\n \"token_in\": \"USDC\",\n \"token_out\": \"USDT\",\n \"amount_in\": \"0.01\",\n \"slippage\": \"0.5\",\n \"gas_sponsorship\": false,\n \"pricing\": \"auto\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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.compasslabs.ai/v2/earn/swap")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"owner\": \"0x06A9aF046187895AcFc7258450B15397CAc67400\",\n \"chain\": \"base\",\n \"token_in\": \"USDC\",\n \"token_out\": \"USDT\",\n \"amount_in\": \"0.01\",\n \"slippage\": \"0.5\",\n \"gas_sponsorship\": false,\n \"pricing\": \"auto\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.compasslabs.ai/v2/earn/swap")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"owner\": \"0x06A9aF046187895AcFc7258450B15397CAc67400\",\n \"chain\": \"base\",\n \"token_in\": \"USDC\",\n \"token_out\": \"USDT\",\n \"amount_in\": \"0.01\",\n \"slippage\": \"0.5\",\n \"gas_sponsorship\": false,\n \"pricing\": \"auto\"\n}"
response = http.request(request)
puts response.read_body{
"estimated_amount_out": "2485.123456",
"swap_provider": "market",
"transaction": {
"chainId": "0x2105",
"data": "0x8d80ff0a0000000000000000000000000000000000000000000000000000000000000020",
"from": "0x4A83b4413CF41C3244027e1590E35a0F48403F0c",
"gas": "0x7a120",
"maxFeePerGas": "0x59682f00",
"maxPriorityFeePerGas": "0x3b9aca00",
"nonce": "0x5",
"to": "0x6B90E8B4E3E971E74C1A47a3a20976377E2dB4b1",
"value": "0x0"
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Swap tokens
Swap one token for another inside an Earn Account.
Exchanges tokens the Earn Account already holds in a single atomic transaction, so funds never leave it, and can be chained with other actions through the bundle endpoint (for example, swap ETH to USDC and deposit the USDC into a vault at once). Returns an unsigned transaction to sign and the expected output amount.
from compass_api_sdk import CompassAPI, models
with CompassAPI(
api_key_auth="<YOUR_API_KEY_HERE>",
) as compass_api:
res = compass_api.earn.earn_swap(token_in="USDC", token_out="USDT", amount_in="0.01", owner="0x06A9aF046187895AcFc7258450B15397CAc67400", chain=models.EarnSwapRequestChain.BASE, slippage="0.5", gas_sponsorship=False, pricing=models.EarnSwapRequestPricing.AUTO)
# Handle response
print(res)import { CompassApiSDK } from "@compass-labs/api-sdk";
const compassApiSDK = new CompassApiSDK({
apiKeyAuth: "<YOUR_API_KEY_HERE>",
});
async function run() {
const result = await compassApiSDK.earn.earnSwap({
tokenIn: "USDC",
tokenOut: "USDT",
amountIn: "0.01",
slippage: "0.5",
owner: "0x06A9aF046187895AcFc7258450B15397CAc67400",
chain: "base",
gasSponsorship: false,
pricing: "auto",
});
console.log(result);
}
run();curl --request POST \
--url https://api.compasslabs.ai/v2/earn/swap \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"owner": "0x06A9aF046187895AcFc7258450B15397CAc67400",
"chain": "base",
"token_in": "USDC",
"token_out": "USDT",
"amount_in": "0.01",
"slippage": "0.5",
"gas_sponsorship": false,
"pricing": "auto"
}
'const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
owner: '0x06A9aF046187895AcFc7258450B15397CAc67400',
chain: 'base',
token_in: 'USDC',
token_out: 'USDT',
amount_in: '0.01',
slippage: '0.5',
gas_sponsorship: false,
pricing: 'auto'
})
};
fetch('https://api.compasslabs.ai/v2/earn/swap', 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.compasslabs.ai/v2/earn/swap",
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([
'owner' => '0x06A9aF046187895AcFc7258450B15397CAc67400',
'chain' => 'base',
'token_in' => 'USDC',
'token_out' => 'USDT',
'amount_in' => '0.01',
'slippage' => '0.5',
'gas_sponsorship' => false,
'pricing' => 'auto'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <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.compasslabs.ai/v2/earn/swap"
payload := strings.NewReader("{\n \"owner\": \"0x06A9aF046187895AcFc7258450B15397CAc67400\",\n \"chain\": \"base\",\n \"token_in\": \"USDC\",\n \"token_out\": \"USDT\",\n \"amount_in\": \"0.01\",\n \"slippage\": \"0.5\",\n \"gas_sponsorship\": false,\n \"pricing\": \"auto\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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.compasslabs.ai/v2/earn/swap")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"owner\": \"0x06A9aF046187895AcFc7258450B15397CAc67400\",\n \"chain\": \"base\",\n \"token_in\": \"USDC\",\n \"token_out\": \"USDT\",\n \"amount_in\": \"0.01\",\n \"slippage\": \"0.5\",\n \"gas_sponsorship\": false,\n \"pricing\": \"auto\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.compasslabs.ai/v2/earn/swap")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"owner\": \"0x06A9aF046187895AcFc7258450B15397CAc67400\",\n \"chain\": \"base\",\n \"token_in\": \"USDC\",\n \"token_out\": \"USDT\",\n \"amount_in\": \"0.01\",\n \"slippage\": \"0.5\",\n \"gas_sponsorship\": false,\n \"pricing\": \"auto\"\n}"
response = http.request(request)
puts response.read_body{
"estimated_amount_out": "2485.123456",
"swap_provider": "market",
"transaction": {
"chainId": "0x2105",
"data": "0x8d80ff0a0000000000000000000000000000000000000000000000000000000000000020",
"from": "0x4A83b4413CF41C3244027e1590E35a0F48403F0c",
"gas": "0x7a120",
"maxFeePerGas": "0x59682f00",
"maxPriorityFeePerGas": "0x3b9aca00",
"nonce": "0x5",
"to": "0x6B90E8B4E3E971E74C1A47a3a20976377E2dB4b1",
"value": "0x0"
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Body
Swap one token held in the Earn Account for another, in a single atomic transaction.
Token to sell (input). Provide a token symbol from a limited set (e.g., 'USDC') or any token address.
"USDC"
"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
Token to buy (output). Provide a token symbol from a limited set (e.g., 'USDT') or any token address.
"USDT"
"0xdAC17F958D2ee523a2206206994597C13D831ec7"
Human-readable amount of token_in to swap (token units, not wei).
x > 01.5
The owner's wallet address.
"0x06A9aF046187895AcFc7258450B15397CAc67400"
Target blockchain network where the swap will execute.
arbitrum, base, bsc, ethereum, hyperevm, tempo "base"
Action type identifier for swap operations.
"V2_SWAP"Maximum slippage tolerance as a percentage (e.g., 0.5 = 0.5%).
0.5
Optionally request gas sponsorship. If true, EIP-712 typed data will be returned that must be signed by the owner and submitted to the 'Prepare gas-sponsored transaction' endpoint (/gas_sponsorship/prepare). Firm-priced builds may be sponsored: the sponsor must broadcast before quote_expires_at.
false
Swap routing policy. 'auto': on chains with a market route the swap is priced by the market aggregator and bounded by slippage (the default behaviour); on HyperEVM, where only firm pricing is available, it is a firm zero-slippage quote that fills exactly or reverts. 'firm': always a firm quote; refused with a typed 409 when no firm quote covers the pair right now, never silently priced at market. 'market': always the market route; refused with 422 on HyperEVM. Read swap_provider on the response for the route that actually priced the build, and quote_expires_at for a firm quote's deadline.
auto, firm, market "auto"
Response
Successful Response
Estimated amount of output token received from the swap. Exact on firm builds (a firm quote fills at this amount or reverts); a quote-time estimate on market builds, where slippage sets how far below it the enforced minimum output sits.
^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$Unsigned transaction for direct execution. Present when gas_sponsorship=false.
Show child attributes
Show child attributes
{
"chainId": "0x2105",
"data": "0x1688f0b900000000000000000000000029fcb43b46531bca003ddc8fcb67ffe91900c762000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000675f4a3d",
"from": "0x4A83b4413CF41C3244027e1590E35a0F48403F0c",
"gas": "0x7a120",
"maxFeePerGas": "0x59682f00",
"maxPriorityFeePerGas": "0x3b9aca00",
"nonce": "0x5",
"to": "0x4e1DCf7AD4e460CfD30791CCC4F9c8a4f820ec67",
"value": "0x0"
}
EIP-712 typed data for gas-sponsored execution. Present when gas_sponsorship=true.
Show child attributes
Show child attributes
{
"domain": {
"chainId": 8453,
"verifyingContract": "0x6B90E8B4E3E971E74C1A47a3a20976377E2dB4b1"
},
"message": {
"baseGas": "0",
"data": "0x8d80ff0a0000000000000000000000000000000000000000000000000000000000000020",
"gasPrice": "0",
"gasToken": "0x0000000000000000000000000000000000000000",
"nonce": "7",
"operation": 1,
"refundReceiver": "0x0000000000000000000000000000000000000000",
"safeTxGas": "0",
"to": "0x93C23AAE4793C14D6DF35D2A2A2234204e1559dA",
"value": "0"
},
"primaryType": "SafeTx",
"types": {
"EIP712Domain": [
{ "name": "chainId", "type": "uint256" },
{
"name": "verifyingContract",
"type": "address"
}
],
"SafeTx": [
{ "name": "to", "type": "address" },
{ "name": "value", "type": "uint256" },
{ "name": "data", "type": "bytes" },
{ "name": "operation", "type": "uint8" },
{ "name": "safeTxGas", "type": "uint256" },
{ "name": "baseGas", "type": "uint256" },
{ "name": "gasPrice", "type": "uint256" },
{ "name": "gasToken", "type": "address" },
{
"name": "refundReceiver",
"type": "address"
},
{ "name": "nonce", "type": "uint256" }
]
}
}
Which route priced the swap. 'market': a DEX aggregator, slippage-bounded. 'firm': a zero-slippage quote that fills exactly or reverts. Always present; this is the authoritative signal, since pricing is only what was requested.
market, firm Deadline of the firm swap quote. The transaction (or the sponsor's broadcast of the signed typed data) must be included before it or the swap reverts on-chain; refresh by re-calling this endpoint and discarding the previous payload. Null on market builds.
Was this page helpful?