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 solver quotes 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 available solver quotes 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: [ … ] }, solver quote entries | 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 is the expected output and minimumDestinationAmount is the quoted minimum. Inspect the encoded route before funding. 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
