curl --request POST \
--url https://app.sideshift.app/api/embed/accounts/currencies \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"action": "estimate",
"accountId": "<string>",
"destinationAmountCents": 10000000
}
'import requests
url = "https://app.sideshift.app/api/embed/accounts/currencies"
payload = {
"action": "estimate",
"accountId": "<string>",
"destinationAmountCents": 10000000
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({action: 'estimate', accountId: '<string>', destinationAmountCents: 10000000})
};
fetch('https://app.sideshift.app/api/embed/accounts/currencies', 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://app.sideshift.app/api/embed/accounts/currencies",
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([
'action' => 'estimate',
'accountId' => '<string>',
'destinationAmountCents' => 10000000
]),
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://app.sideshift.app/api/embed/accounts/currencies"
payload := strings.NewReader("{\n \"action\": \"estimate\",\n \"accountId\": \"<string>\",\n \"destinationAmountCents\": 10000000\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://app.sideshift.app/api/embed/accounts/currencies")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"action\": \"estimate\",\n \"accountId\": \"<string>\",\n \"destinationAmountCents\": 10000000\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/embed/accounts/currencies")
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 \"action\": \"estimate\",\n \"accountId\": \"<string>\",\n \"destinationAmountCents\": 10000000\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"operationId": "<string>",
"action": "convert",
"status": "pending",
"currency": "usd",
"destinationCurrency": "usd",
"amountCents": 123,
"destinationAmountCents": 123,
"receivedCents": 123,
"estimatedReceivedCents": 123,
"estimatedAt": "2023-11-07T05:31:56Z",
"rateLocked": false,
"fundingFeesIncluded": false,
"rate": "<string>",
"feeBps": 123,
"providerId": "<string>",
"message": "<string>"
}
}Estimate USD funding or convert a sub-account balance (pilot)
Off by default. Requires brand opt-in through PATCH /settings/currencies, platform rollout availability, and managed sub-account access. Estimate works before funding and returns the total USD needed for a target fiat conversion, including quoted conversion cost but excluding funding and withdrawal fees. It does not subtract existing balances. Quotes do not move funds or lock a rate. Fund the sub-account through the existing USD transfer endpoint with destinationBalance withdrawal, wait for completion, then quote and convert there. Conversion uses an explicit source amount and requires acceptance of execution-time pricing. Repeat the exact convert request and permanent idempotencyKey after a timeout. HTTP 200 does not imply completed settlement. Inspect data.status. Main-account conversion and native currency transfers are not supported here.
curl --request POST \
--url https://app.sideshift.app/api/embed/accounts/currencies \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"action": "estimate",
"accountId": "<string>",
"destinationAmountCents": 10000000
}
'import requests
url = "https://app.sideshift.app/api/embed/accounts/currencies"
payload = {
"action": "estimate",
"accountId": "<string>",
"destinationAmountCents": 10000000
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({action: 'estimate', accountId: '<string>', destinationAmountCents: 10000000})
};
fetch('https://app.sideshift.app/api/embed/accounts/currencies', 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://app.sideshift.app/api/embed/accounts/currencies",
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([
'action' => 'estimate',
'accountId' => '<string>',
'destinationAmountCents' => 10000000
]),
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://app.sideshift.app/api/embed/accounts/currencies"
payload := strings.NewReader("{\n \"action\": \"estimate\",\n \"accountId\": \"<string>\",\n \"destinationAmountCents\": 10000000\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://app.sideshift.app/api/embed/accounts/currencies")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"action\": \"estimate\",\n \"accountId\": \"<string>\",\n \"destinationAmountCents\": 10000000\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/embed/accounts/currencies")
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 \"action\": \"estimate\",\n \"accountId\": \"<string>\",\n \"destinationAmountCents\": 10000000\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"operationId": "<string>",
"action": "convert",
"status": "pending",
"currency": "usd",
"destinationCurrency": "usd",
"amountCents": 123,
"destinationAmountCents": 123,
"receivedCents": 123,
"estimatedReceivedCents": 123,
"estimatedAt": "2023-11-07T05:31:56Z",
"rateLocked": false,
"fundingFeesIncluded": false,
"rate": "<string>",
"feeBps": 123,
"providerId": "<string>",
"message": "<string>"
}
}Authorizations
Your SideShift Connect API key (sk_live_* or sk_test_*). Generate from Settings → Connect.
Body
- Option 1
- Option 2
- Option 3
"estimate"1 - 128Whop fiat ledger currencies. Conversion and payout eligibility require a successful provider quote.
usd, sgd, inr, aud, brl, cad, dkk, eur, nok, gbp, sek, chf, hkd, huf, jpy, mxn, myr, pln, czk, nzd, aed, cop, ron, thb, bgn, idr, dop, php, try, krw, twd, vnd, pkr, clp, uyu, ars, zar, dzd, tnd, mad, kes, kwd, jod, all, xcd, amd, bsd, bhd, bob, bam, khr, crc, xof, egp, etb, gmd, ghs, gtq, gyd, ils, jmd, mop, mga, mur, mdl, mnt, nad, ngn, mkd, omr, pyg, pen, qar, rwf, sar, rsd, lkr, tzs, ttd, uzs, rub, cny, kzt, awg 1 <= x <= 20000000