Request public exact-in quotes
curl --request POST \
--url https://quotes.eco.com/api/v3/quotes/exactIn \
--header 'Content-Type: application/json' \
--data '
{
"dAppID": "your-app",
"intentExecutionTypes": [
"SELF_PUBLISH"
],
"quoteRequest": {
"sourceChainID": 10,
"destinationChainID": 8453,
"sourceToken": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"destinationToken": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"sourceAmount": "1000000",
"funder": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
"recipient": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"
}
}
'import requests
url = "https://quotes.eco.com/api/v3/quotes/exactIn"
payload = {
"dAppID": "your-app",
"intentExecutionTypes": ["SELF_PUBLISH"],
"quoteRequest": {
"sourceChainID": 10,
"destinationChainID": 8453,
"sourceToken": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"destinationToken": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"sourceAmount": "1000000",
"funder": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
"recipient": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"
}
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
dAppID: 'your-app',
intentExecutionTypes: ['SELF_PUBLISH'],
quoteRequest: {
sourceChainID: 10,
destinationChainID: 8453,
sourceToken: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',
destinationToken: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
sourceAmount: '1000000',
funder: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',
recipient: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8'
}
})
};
fetch('https://quotes.eco.com/api/v3/quotes/exactIn', 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://quotes.eco.com/api/v3/quotes/exactIn",
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([
'dAppID' => 'your-app',
'intentExecutionTypes' => [
'SELF_PUBLISH'
],
'quoteRequest' => [
'sourceChainID' => 10,
'destinationChainID' => 8453,
'sourceToken' => '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',
'destinationToken' => '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
'sourceAmount' => '1000000',
'funder' => '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',
'recipient' => '0x70997970C51812dc3A010C7d01b50e0d17dc79C8'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$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://quotes.eco.com/api/v3/quotes/exactIn"
payload := strings.NewReader("{\n \"dAppID\": \"your-app\",\n \"intentExecutionTypes\": [\n \"SELF_PUBLISH\"\n ],\n \"quoteRequest\": {\n \"sourceChainID\": 10,\n \"destinationChainID\": 8453,\n \"sourceToken\": \"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85\",\n \"destinationToken\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n \"sourceAmount\": \"1000000\",\n \"funder\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n \"recipient\": \"0x70997970C51812dc3A010C7d01b50e0d17dc79C8\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
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://quotes.eco.com/api/v3/quotes/exactIn")
.header("Content-Type", "application/json")
.body("{\n \"dAppID\": \"your-app\",\n \"intentExecutionTypes\": [\n \"SELF_PUBLISH\"\n ],\n \"quoteRequest\": {\n \"sourceChainID\": 10,\n \"destinationChainID\": 8453,\n \"sourceToken\": \"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85\",\n \"destinationToken\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n \"sourceAmount\": \"1000000\",\n \"funder\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n \"recipient\": \"0x70997970C51812dc3A010C7d01b50e0d17dc79C8\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://quotes.eco.com/api/v3/quotes/exactIn")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"dAppID\": \"your-app\",\n \"intentExecutionTypes\": [\n \"SELF_PUBLISH\"\n ],\n \"quoteRequest\": {\n \"sourceChainID\": 10,\n \"destinationChainID\": 8453,\n \"sourceToken\": \"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85\",\n \"destinationToken\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n \"sourceAmount\": \"1000000\",\n \"funder\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n \"recipient\": \"0x70997970C51812dc3A010C7d01b50e0d17dc79C8\"\n }\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"quoteID": "quote:ae2fe3f2-ca9b-4fc9-97c7-1d77250815e0",
"quoteResponseID": "quoteResponse:4ba1a3d5-366b-41d7-99b3-aad76dda92d9",
"solverID": "0x5Bc2DBb5db4a7AC63256e5fCD3ED4886C7dB4AE7",
"quoteData": {
"contracts": {
"sourcePortal": "0xEC000064576f9C95a8623Bc0eff3db6d296ea6df",
"destinationPortal": "0xEC000064576f9C95a8623Bc0eff3db6d296ea6df",
"prover": "0xeC00008537c1F26E739486BCFCC818d81234d5aD"
},
"quoteResponse": {
"intentExecutionType": "SELF_PUBLISH",
"sourceChainID": 10,
"destinationChainID": 10,
"finalDestinationChainID": 8453,
"sourceToken": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"destinationToken": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"sourceAmount": "1000000",
"destinationAmount": "969873",
"minimumDestinationAmount": "969873",
"funder": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
"refundRecipient": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
"recipient": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8",
"fees": [
{
"name": "Eco Protocol Fee",
"description": "Protocol fee for fulfilling intent on chain 8453",
"token": {
"address": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"decimals": 6,
"symbol": "USDC"
},
"amount": "30127",
"kinds": [
{
"kind": "protocol",
"amount": "30127",
"basis": "estimate"
}
]
}
],
"deadline": 1789528743,
"quoteExpiry": 1789528083,
"estimatedFulfillTimeSec": 30,
"encodedRoute": "0x0000000000000000000000000000000000000000000000000000000000000020…"
}
}
}
]
}Open quoting service
Open quoting service
Exact-input quotes from every solver without an API key, via the separate quotes.eco.com service.
POST
/
api
/
v3
/
quotes
/
exactIn
Request public exact-in quotes
curl --request POST \
--url https://quotes.eco.com/api/v3/quotes/exactIn \
--header 'Content-Type: application/json' \
--data '
{
"dAppID": "your-app",
"intentExecutionTypes": [
"SELF_PUBLISH"
],
"quoteRequest": {
"sourceChainID": 10,
"destinationChainID": 8453,
"sourceToken": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"destinationToken": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"sourceAmount": "1000000",
"funder": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
"recipient": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"
}
}
'import requests
url = "https://quotes.eco.com/api/v3/quotes/exactIn"
payload = {
"dAppID": "your-app",
"intentExecutionTypes": ["SELF_PUBLISH"],
"quoteRequest": {
"sourceChainID": 10,
"destinationChainID": 8453,
"sourceToken": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"destinationToken": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"sourceAmount": "1000000",
"funder": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
"recipient": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"
}
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
dAppID: 'your-app',
intentExecutionTypes: ['SELF_PUBLISH'],
quoteRequest: {
sourceChainID: 10,
destinationChainID: 8453,
sourceToken: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',
destinationToken: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
sourceAmount: '1000000',
funder: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',
recipient: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8'
}
})
};
fetch('https://quotes.eco.com/api/v3/quotes/exactIn', 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://quotes.eco.com/api/v3/quotes/exactIn",
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([
'dAppID' => 'your-app',
'intentExecutionTypes' => [
'SELF_PUBLISH'
],
'quoteRequest' => [
'sourceChainID' => 10,
'destinationChainID' => 8453,
'sourceToken' => '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',
'destinationToken' => '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
'sourceAmount' => '1000000',
'funder' => '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',
'recipient' => '0x70997970C51812dc3A010C7d01b50e0d17dc79C8'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$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://quotes.eco.com/api/v3/quotes/exactIn"
payload := strings.NewReader("{\n \"dAppID\": \"your-app\",\n \"intentExecutionTypes\": [\n \"SELF_PUBLISH\"\n ],\n \"quoteRequest\": {\n \"sourceChainID\": 10,\n \"destinationChainID\": 8453,\n \"sourceToken\": \"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85\",\n \"destinationToken\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n \"sourceAmount\": \"1000000\",\n \"funder\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n \"recipient\": \"0x70997970C51812dc3A010C7d01b50e0d17dc79C8\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
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://quotes.eco.com/api/v3/quotes/exactIn")
.header("Content-Type", "application/json")
.body("{\n \"dAppID\": \"your-app\",\n \"intentExecutionTypes\": [\n \"SELF_PUBLISH\"\n ],\n \"quoteRequest\": {\n \"sourceChainID\": 10,\n \"destinationChainID\": 8453,\n \"sourceToken\": \"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85\",\n \"destinationToken\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n \"sourceAmount\": \"1000000\",\n \"funder\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n \"recipient\": \"0x70997970C51812dc3A010C7d01b50e0d17dc79C8\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://quotes.eco.com/api/v3/quotes/exactIn")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"dAppID\": \"your-app\",\n \"intentExecutionTypes\": [\n \"SELF_PUBLISH\"\n ],\n \"quoteRequest\": {\n \"sourceChainID\": 10,\n \"destinationChainID\": 8453,\n \"sourceToken\": \"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85\",\n \"destinationToken\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n \"sourceAmount\": \"1000000\",\n \"funder\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n \"recipient\": \"0x70997970C51812dc3A010C7d01b50e0d17dc79C8\"\n }\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"quoteID": "quote:ae2fe3f2-ca9b-4fc9-97c7-1d77250815e0",
"quoteResponseID": "quoteResponse:4ba1a3d5-366b-41d7-99b3-aad76dda92d9",
"solverID": "0x5Bc2DBb5db4a7AC63256e5fCD3ED4886C7dB4AE7",
"quoteData": {
"contracts": {
"sourcePortal": "0xEC000064576f9C95a8623Bc0eff3db6d296ea6df",
"destinationPortal": "0xEC000064576f9C95a8623Bc0eff3db6d296ea6df",
"prover": "0xeC00008537c1F26E739486BCFCC818d81234d5aD"
},
"quoteResponse": {
"intentExecutionType": "SELF_PUBLISH",
"sourceChainID": 10,
"destinationChainID": 10,
"finalDestinationChainID": 8453,
"sourceToken": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"destinationToken": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"sourceAmount": "1000000",
"destinationAmount": "969873",
"minimumDestinationAmount": "969873",
"funder": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
"refundRecipient": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
"recipient": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8",
"fees": [
{
"name": "Eco Protocol Fee",
"description": "Protocol fee for fulfilling intent on chain 8453",
"token": {
"address": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"decimals": 6,
"symbol": "USDC"
},
"amount": "30127",
"kinds": [
{
"kind": "protocol",
"amount": "30127",
"basis": "estimate"
}
]
}
],
"deadline": 1789528743,
"quoteExpiry": 1789528083,
"estimatedFulfillTimeSec": 30,
"encodedRoute": "0x0000000000000000000000000000000000000000000000000000000000000020…"
}
}
}
]
}POST https://quotes.eco.com/api/v3/quotes/exactIn returns every solver’s quote for an exact-input transfer. No API key or account is needed.
It is a different service from the v1 API, with a different request and response format:
| Open quoting service | v1 API | |
|---|---|---|
| Host | quotes.eco.com | api.eco.com/v1 |
| Field names | dAppID, sourceChainID, sourceToken | dappId, source.chainId, source.token |
| Response | 201 with { data: [ … ] }, one entry per solver | 200 with one top-level quote object |
| Funding | Publish and fund the intent on the Portal with encodedRoute | Ready-to-send transaction, or gasless submit endpoints |
| Partner pricing | No | Yes, with an API key |
data carries quoteData.quoteResponse (amounts, fees, deadline, encodedRoute) and quoteData.contracts (the source and destination Portal and the prover). destinationAmount and minimumDestinationAmount are what the recipient receives. An empty data array means no solver quoted the route. The two formats are not interchangeable with v1.
Errors and limits
400: invalid fields, in the format{ statusCode, createdBy: "ValidationFilter", validationErrors }.dAppIDallows letters, digits, dots, underscores, and hyphens, up to 64 characters.429: rate limited, by Eco or by an upstream quote provider. HonorRetry-Afterwhen present.5xx: service failure. Retry with backoff.
Body
application/json
Unique identifier for the client application making the request
Example:
"your-app"
Array of intent execution types to fetch quotes for
Available options:
SELF_PUBLISH, GASLESS Example:
["SELF_PUBLISH"]
Cross-chain token swap request details including source/destination tokens and addresses
Show child attributes
Show child attributes
Optional contract addresses to use for the cross-chain swap (will use defaults if not specified)
Show child attributes
Show child attributes
Response
Successfully retrieved exact in quotes from solvers
Array of solver quote responses
Show child attributes
Show child attributes
