curl --request POST \
--url https://v1.orchestrator.rhinestone.dev/quotes \
--header 'Content-Type: application/json' \
--header 'x-api-key: <x-api-key>' \
--header 'x-api-version: <x-api-version>' \
--data '
{
"destinationChainId": "eip155:8453",
"tokenRequests": [
{
"tokenAddress": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"amount": "1000000"
}
],
"account": {
"address": "0x579d5631f76126991c00fb8fe5467fa9d49e5f6a"
}
}
'import requests
url = "https://v1.orchestrator.rhinestone.dev/quotes"
payload = {
"destinationChainId": "eip155:8453",
"tokenRequests": [
{
"tokenAddress": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"amount": "1000000"
}
],
"account": { "address": "0x579d5631f76126991c00fb8fe5467fa9d49e5f6a" }
}
headers = {
"x-api-version": "<x-api-version>",
"x-api-key": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-api-version': '<x-api-version>',
'x-api-key': '<x-api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
destinationChainId: 'eip155:8453',
tokenRequests: [
{tokenAddress: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913', amount: '1000000'}
],
account: {address: '0x579d5631f76126991c00fb8fe5467fa9d49e5f6a'}
})
};
fetch('https://v1.orchestrator.rhinestone.dev/quotes', 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://v1.orchestrator.rhinestone.dev/quotes",
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([
'destinationChainId' => 'eip155:8453',
'tokenRequests' => [
[
'tokenAddress' => '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',
'amount' => '1000000'
]
],
'account' => [
'address' => '0x579d5631f76126991c00fb8fe5467fa9d49e5f6a'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <x-api-key>",
"x-api-version: <x-api-version>"
],
]);
$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://v1.orchestrator.rhinestone.dev/quotes"
payload := strings.NewReader("{\n \"destinationChainId\": \"eip155:8453\",\n \"tokenRequests\": [\n {\n \"tokenAddress\": \"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913\",\n \"amount\": \"1000000\"\n }\n ],\n \"account\": {\n \"address\": \"0x579d5631f76126991c00fb8fe5467fa9d49e5f6a\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-version", "<x-api-version>")
req.Header.Add("x-api-key", "<x-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://v1.orchestrator.rhinestone.dev/quotes")
.header("x-api-version", "<x-api-version>")
.header("x-api-key", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"destinationChainId\": \"eip155:8453\",\n \"tokenRequests\": [\n {\n \"tokenAddress\": \"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913\",\n \"amount\": \"1000000\"\n }\n ],\n \"account\": {\n \"address\": \"0x579d5631f76126991c00fb8fe5467fa9d49e5f6a\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://v1.orchestrator.rhinestone.dev/quotes")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-version"] = '<x-api-version>'
request["x-api-key"] = '<x-api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"destinationChainId\": \"eip155:8453\",\n \"tokenRequests\": [\n {\n \"tokenAddress\": \"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913\",\n \"amount\": \"1000000\"\n }\n ],\n \"account\": {\n \"address\": \"0x579d5631f76126991c00fb8fe5467fa9d49e5f6a\"\n }\n}"
response = http.request(request)
puts response.read_body{
"routes": [
{
"intentId": "<string>",
"expiresAt": 1733493192,
"estimatedFillTime": {
"seconds": 3
},
"settlementLayer": "RELAY",
"signData": {
"origin": [
{
"domain": {
"name": "<string>",
"version": "<string>",
"chainId": 123,
"verifyingContract": "<string>",
"salt": "<string>"
},
"types": {},
"primaryType": "PermitBatchWitnessTransferFrom",
"message": {}
}
],
"destination": {
"domain": {
"name": "<string>",
"version": "<string>",
"chainId": 123,
"verifyingContract": "<string>",
"salt": "<string>"
},
"types": {},
"primaryType": "PermitBatchWitnessTransferFrom",
"message": {}
},
"targetExecution": {
"domain": {
"name": "<string>",
"version": "<string>",
"chainId": 123,
"verifyingContract": "<string>",
"salt": "<string>"
},
"types": {},
"primaryType": "PermitBatchWitnessTransferFrom",
"message": {}
}
},
"cost": {
"input": [
{
"chainId": "eip155:8453",
"tokenAddress": "0xaf88d065e77c8cc2239327c5edb3a432268e5831",
"symbol": "USDC",
"decimals": 6,
"price": {
"usd": 1
},
"amount": "1050000"
}
],
"output": [
{
"chainId": "eip155:8453",
"tokenAddress": "0xaf88d065e77c8cc2239327c5edb3a432268e5831",
"symbol": "USDC",
"decimals": 6,
"price": {
"usd": 1
},
"amount": "1050000"
}
],
"fees": {
"total": {
"usd": 0.029
},
"breakdown": {
"gas": {
"usd": 0.029,
"sponsored": false
},
"bridge": {
"usd": 0.029,
"sponsored": false
},
"swap": {
"usd": 0.029,
"sponsored": false
},
"app": {
"usd": 0.029,
"sponsored": false
},
"protocol": {
"usd": 0.029,
"sponsored": false
},
"sponsorSurcharge": {
"usd": 0.029,
"sponsored": false
}
}
}
},
"tokenRequirements": {
"8453": {
"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913": {
"type": "approval",
"amount": "1000000",
"spender": "0x000000000022d473030f116ddee9f6b43ac78ba3"
}
}
},
"bridgeFill": {
"destinationChainId": 123,
"fillStatusTimeout": 1,
"type": "OFT",
"fillExpirationPeriod": 1
}
}
]
}{
"code": "VALIDATION_ERROR",
"message": "Invalid input",
"details": [
{
"message": "<string>",
"context": {}
}
]
}{
"code": "VALIDATION_ERROR",
"message": "Invalid input",
"details": [
{
"message": "<string>",
"context": {}
}
]
}{
"code": "VALIDATION_ERROR",
"message": "Invalid input",
"details": [
{
"message": "<string>",
"context": {}
}
]
}Create Quote
Computes a quote for an intent: token transfers, target executions, and cost breakdown. Returns a pre-ranked routes[] with per-route intentId to pass to POST /intents for execution.
curl --request POST \
--url https://v1.orchestrator.rhinestone.dev/quotes \
--header 'Content-Type: application/json' \
--header 'x-api-key: <x-api-key>' \
--header 'x-api-version: <x-api-version>' \
--data '
{
"destinationChainId": "eip155:8453",
"tokenRequests": [
{
"tokenAddress": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"amount": "1000000"
}
],
"account": {
"address": "0x579d5631f76126991c00fb8fe5467fa9d49e5f6a"
}
}
'import requests
url = "https://v1.orchestrator.rhinestone.dev/quotes"
payload = {
"destinationChainId": "eip155:8453",
"tokenRequests": [
{
"tokenAddress": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"amount": "1000000"
}
],
"account": { "address": "0x579d5631f76126991c00fb8fe5467fa9d49e5f6a" }
}
headers = {
"x-api-version": "<x-api-version>",
"x-api-key": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-api-version': '<x-api-version>',
'x-api-key': '<x-api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
destinationChainId: 'eip155:8453',
tokenRequests: [
{tokenAddress: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913', amount: '1000000'}
],
account: {address: '0x579d5631f76126991c00fb8fe5467fa9d49e5f6a'}
})
};
fetch('https://v1.orchestrator.rhinestone.dev/quotes', 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://v1.orchestrator.rhinestone.dev/quotes",
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([
'destinationChainId' => 'eip155:8453',
'tokenRequests' => [
[
'tokenAddress' => '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',
'amount' => '1000000'
]
],
'account' => [
'address' => '0x579d5631f76126991c00fb8fe5467fa9d49e5f6a'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <x-api-key>",
"x-api-version: <x-api-version>"
],
]);
$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://v1.orchestrator.rhinestone.dev/quotes"
payload := strings.NewReader("{\n \"destinationChainId\": \"eip155:8453\",\n \"tokenRequests\": [\n {\n \"tokenAddress\": \"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913\",\n \"amount\": \"1000000\"\n }\n ],\n \"account\": {\n \"address\": \"0x579d5631f76126991c00fb8fe5467fa9d49e5f6a\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-version", "<x-api-version>")
req.Header.Add("x-api-key", "<x-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://v1.orchestrator.rhinestone.dev/quotes")
.header("x-api-version", "<x-api-version>")
.header("x-api-key", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"destinationChainId\": \"eip155:8453\",\n \"tokenRequests\": [\n {\n \"tokenAddress\": \"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913\",\n \"amount\": \"1000000\"\n }\n ],\n \"account\": {\n \"address\": \"0x579d5631f76126991c00fb8fe5467fa9d49e5f6a\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://v1.orchestrator.rhinestone.dev/quotes")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-version"] = '<x-api-version>'
request["x-api-key"] = '<x-api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"destinationChainId\": \"eip155:8453\",\n \"tokenRequests\": [\n {\n \"tokenAddress\": \"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913\",\n \"amount\": \"1000000\"\n }\n ],\n \"account\": {\n \"address\": \"0x579d5631f76126991c00fb8fe5467fa9d49e5f6a\"\n }\n}"
response = http.request(request)
puts response.read_body{
"routes": [
{
"intentId": "<string>",
"expiresAt": 1733493192,
"estimatedFillTime": {
"seconds": 3
},
"settlementLayer": "RELAY",
"signData": {
"origin": [
{
"domain": {
"name": "<string>",
"version": "<string>",
"chainId": 123,
"verifyingContract": "<string>",
"salt": "<string>"
},
"types": {},
"primaryType": "PermitBatchWitnessTransferFrom",
"message": {}
}
],
"destination": {
"domain": {
"name": "<string>",
"version": "<string>",
"chainId": 123,
"verifyingContract": "<string>",
"salt": "<string>"
},
"types": {},
"primaryType": "PermitBatchWitnessTransferFrom",
"message": {}
},
"targetExecution": {
"domain": {
"name": "<string>",
"version": "<string>",
"chainId": 123,
"verifyingContract": "<string>",
"salt": "<string>"
},
"types": {},
"primaryType": "PermitBatchWitnessTransferFrom",
"message": {}
}
},
"cost": {
"input": [
{
"chainId": "eip155:8453",
"tokenAddress": "0xaf88d065e77c8cc2239327c5edb3a432268e5831",
"symbol": "USDC",
"decimals": 6,
"price": {
"usd": 1
},
"amount": "1050000"
}
],
"output": [
{
"chainId": "eip155:8453",
"tokenAddress": "0xaf88d065e77c8cc2239327c5edb3a432268e5831",
"symbol": "USDC",
"decimals": 6,
"price": {
"usd": 1
},
"amount": "1050000"
}
],
"fees": {
"total": {
"usd": 0.029
},
"breakdown": {
"gas": {
"usd": 0.029,
"sponsored": false
},
"bridge": {
"usd": 0.029,
"sponsored": false
},
"swap": {
"usd": 0.029,
"sponsored": false
},
"app": {
"usd": 0.029,
"sponsored": false
},
"protocol": {
"usd": 0.029,
"sponsored": false
},
"sponsorSurcharge": {
"usd": 0.029,
"sponsored": false
}
}
}
},
"tokenRequirements": {
"8453": {
"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913": {
"type": "approval",
"amount": "1000000",
"spender": "0x000000000022d473030f116ddee9f6b43ac78ba3"
}
}
},
"bridgeFill": {
"destinationChainId": 123,
"fillStatusTimeout": 1,
"type": "OFT",
"fillExpirationPeriod": 1
}
}
]
}{
"code": "VALIDATION_ERROR",
"message": "Invalid input",
"details": [
{
"message": "<string>",
"context": {}
}
]
}{
"code": "VALIDATION_ERROR",
"message": "Invalid input",
"details": [
{
"message": "<string>",
"context": {}
}
]
}{
"code": "VALIDATION_ERROR",
"message": "Invalid input",
"details": [
{
"message": "<string>",
"context": {}
}
]
}Headers
API version. Required; pinned to this document.
2026-04.blanc API key.
Body
Quote request. Chain ids are CAIP-2 strings (e.g. eip155:8453, solana:…, tron:…); bare numeric ids are rejected.
CAIP-2 chain identifier of the destination chain (EVM eip155:<id>, or non-EVM solana:…/tron:…)
^(eip155|solana|tron|hypercore):[-_a-zA-Z0-9]{1,32}$"eip155:8453"
A list of token requested on the target chain
Show child attributes
Show child attributes
Account details
Show child attributes
Show child attributes
Execution calls on the target chain.
Show child attributes
Show child attributes
Execution calls to perform before the claim on each origin chain, keyed by chain ID. Max 10 ops per chain, max 5 chains.
Show child attributes
Show child attributes
{
"8453": [
{
"to": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"value": "0",
"data": "0x"
}
]
}
The gas limit for the target chain executions
"100000"
Account access list specifying which chains and tokens an account may access
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Intent options
Show child attributes
Show child attributes
{
"settlementLayers": { "include": ["ECO"] },
"sponsorSettings": {
"gas": true,
"bridgeFees": true,
"swapFees": true
}
}
Response
OK
Response body for POST /quotes on the blanc API version
Route candidates ranked by the orchestrator's internal scoring (cheaper + faster wins). The first entry is the recommended route — most clients should submit it without inspecting the rest.
Show child attributes
Show child attributes
Was this page helpful?