curl --request POST \
--url https://api.eco.com/v1/quotes \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"type": "exact-in",
"source": {
"chainId": 8453,
"token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"amount": "1000000",
"funder": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"
},
"destination": {
"chainId": 10,
"token": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"recipient": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"
},
"slippage": 0.005,
"dappId": "your-app"
}
'{
"id": "quote:8a7cbdcd-2aed-40b0-ab08-c4c10af15f23",
"type": "exact-in",
"source": {
"chainId": 8453,
"token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"amount": "1000000",
"funder": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
"symbol": null,
"decimals": null
},
"destination": {
"chainId": 10,
"token": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"amountOut": "989500",
"minAmountOut": "989500",
"recipient": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8",
"symbol": null,
"decimals": null
},
"slippage": 0.005,
"fees": [
{
"type": "protocol",
"amount": "10500",
"token": {
"chainId": 8453,
"address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"symbol": "USDC",
"decimals": 6
},
"estimate": false
}
],
"steps": [
{
"type": "bridge",
"provider": "eco",
"from": {
"chainId": 8453,
"token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"amount": "1000000"
},
"to": {
"chainId": 10,
"token": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"amount": "989500"
},
"fees": [],
"estimatedDurationSec": 7,
"intents": [
{
"role": "local",
"intentHash": "0x3f1886e7c3a4cab62b4a0661e393600f0917d5a514652e96623b0f17ce0d3749",
"intent": {
"route": {
"salt": "0xec00ec00ec00ec00ec00ec00ec00ec00aaaf8940ec75ab106feed1a7498e986f",
"deadline": 1789523774,
"source": 8453,
"destination": 10,
"portal": "0xEC000064576f9C95a8623Bc0eff3db6d296ea6df",
"nativeAmount": "0",
"tokens": [
{
"token": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"amount": "989500"
}
],
"calls": [
{
"target": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"data": "0xa9059cbb00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c800000000000000000000000000000000000000000000000000000000000f193c",
"value": "0"
}
]
},
"reward": {
"deadline": 1789524404,
"creator": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
"prover": "0xec004Ab4870c4e177c66949329dCdb503CE41022",
"nativeAmount": "0",
"tokens": [
{
"token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"amount": "1000000"
}
]
}
}
}
]
}
],
"solver": {
"id": "0x1Da38A31F369343bdD33cCc48E89D165E8ab3450"
},
"intentHash": "0x3f1886e7c3a4cab62b4a0661e393600f0917d5a514652e96623b0f17ce0d3749",
"execution": {
"transaction": {
"type": "evm",
"chainId": 8453,
"to": "0xEC000064576f9C95a8623Bc0eff3db6d296ea6df",
"data": "0xdf00f8fa000000000000000000000000000000000000000000000000000000000000000a…",
"value": "0"
},
"intent": {
"route": {
"salt": "0xec00ec00ec00ec00ec00ec00ec00ec00aaaf8940ec75ab106feed1a7498e986f",
"deadline": 1789523774,
"source": 8453,
"destination": 10,
"portal": "0xEC000064576f9C95a8623Bc0eff3db6d296ea6df",
"nativeAmount": "0",
"tokens": [
{
"token": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"amount": "989500"
}
],
"calls": [
{
"target": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"data": "0xa9059cbb00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c800000000000000000000000000000000000000000000000000000000000f193c",
"value": "0"
}
]
},
"reward": {
"deadline": 1789524404,
"creator": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
"prover": "0xec004Ab4870c4e177c66949329dCdb503CE41022",
"nativeAmount": "0",
"tokens": [
{
"token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"amount": "1000000"
}
]
}
},
"vault": "0xf6358b8f1d0Ec04EBc9Fe8FdEe5e6791640D1c2F"
},
"expiresAt": 1789522904,
"signature": "0xedc90fdd27654dd49ac1087901450c9c5fdf444943f61faa8d787bee86304d821f06a5db4a67eddf5cf286014d6ec8bd33c64f9e072045a9f3c5e50cc28960fc1b",
"quotes": null
}Request a quote
Returns an executable quote for a stablecoin transfer, with the transaction to send, the intent, and the minimum output.
curl --request POST \
--url https://api.eco.com/v1/quotes \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"type": "exact-in",
"source": {
"chainId": 8453,
"token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"amount": "1000000",
"funder": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"
},
"destination": {
"chainId": 10,
"token": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"recipient": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"
},
"slippage": 0.005,
"dappId": "your-app"
}
'{
"id": "quote:8a7cbdcd-2aed-40b0-ab08-c4c10af15f23",
"type": "exact-in",
"source": {
"chainId": 8453,
"token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"amount": "1000000",
"funder": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
"symbol": null,
"decimals": null
},
"destination": {
"chainId": 10,
"token": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"amountOut": "989500",
"minAmountOut": "989500",
"recipient": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8",
"symbol": null,
"decimals": null
},
"slippage": 0.005,
"fees": [
{
"type": "protocol",
"amount": "10500",
"token": {
"chainId": 8453,
"address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"symbol": "USDC",
"decimals": 6
},
"estimate": false
}
],
"steps": [
{
"type": "bridge",
"provider": "eco",
"from": {
"chainId": 8453,
"token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"amount": "1000000"
},
"to": {
"chainId": 10,
"token": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"amount": "989500"
},
"fees": [],
"estimatedDurationSec": 7,
"intents": [
{
"role": "local",
"intentHash": "0x3f1886e7c3a4cab62b4a0661e393600f0917d5a514652e96623b0f17ce0d3749",
"intent": {
"route": {
"salt": "0xec00ec00ec00ec00ec00ec00ec00ec00aaaf8940ec75ab106feed1a7498e986f",
"deadline": 1789523774,
"source": 8453,
"destination": 10,
"portal": "0xEC000064576f9C95a8623Bc0eff3db6d296ea6df",
"nativeAmount": "0",
"tokens": [
{
"token": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"amount": "989500"
}
],
"calls": [
{
"target": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"data": "0xa9059cbb00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c800000000000000000000000000000000000000000000000000000000000f193c",
"value": "0"
}
]
},
"reward": {
"deadline": 1789524404,
"creator": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
"prover": "0xec004Ab4870c4e177c66949329dCdb503CE41022",
"nativeAmount": "0",
"tokens": [
{
"token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"amount": "1000000"
}
]
}
}
}
]
}
],
"solver": {
"id": "0x1Da38A31F369343bdD33cCc48E89D165E8ab3450"
},
"intentHash": "0x3f1886e7c3a4cab62b4a0661e393600f0917d5a514652e96623b0f17ce0d3749",
"execution": {
"transaction": {
"type": "evm",
"chainId": 8453,
"to": "0xEC000064576f9C95a8623Bc0eff3db6d296ea6df",
"data": "0xdf00f8fa000000000000000000000000000000000000000000000000000000000000000a…",
"value": "0"
},
"intent": {
"route": {
"salt": "0xec00ec00ec00ec00ec00ec00ec00ec00aaaf8940ec75ab106feed1a7498e986f",
"deadline": 1789523774,
"source": 8453,
"destination": 10,
"portal": "0xEC000064576f9C95a8623Bc0eff3db6d296ea6df",
"nativeAmount": "0",
"tokens": [
{
"token": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"amount": "989500"
}
],
"calls": [
{
"target": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"data": "0xa9059cbb00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c800000000000000000000000000000000000000000000000000000000000f193c",
"value": "0"
}
]
},
"reward": {
"deadline": 1789524404,
"creator": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
"prover": "0xec004Ab4870c4e177c66949329dCdb503CE41022",
"nativeAmount": "0",
"tokens": [
{
"token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"amount": "1000000"
}
]
}
},
"vault": "0xf6358b8f1d0Ec04EBc9Fe8FdEe5e6791640D1c2F"
},
"expiresAt": 1789522904,
"signature": "0xedc90fdd27654dd49ac1087901450c9c5fdf444943f61faa8d787bee86304d821f06a5db4a67eddf5cf286014d6ec8bd33c64f9e072045a9f3c5e50cc28960fc1b",
"quotes": null
}source.funder. type fixes either source.amount (exact-in) or destination.amount (exact-out); custom requires user-authored destination.calls. dappId is required. The response is a top-level quote object with the transaction to send from the funder (execution.transaction), the decoded intent, destination.amountOut and minAmountOut, fees, per-step intents, and expiresAt. signature verifies against the source chain’s quoteSigner from GET /v1/chains; the returned intentHash is the handle for GET /v1/intents/status.
An unsupported chain returns 422 chain-not-supported. Routes no solver will fill (unlisted tokens, unavailable liquidity, amounts above what solvers hold) currently return 502 solver-error.
Requires x-api-key. Partner pricing, attribution, and enabled features are tied to the key. Without a key the gateway answers 403 with a plain JSON body ({"Message": "User is not authorized ..."}); a key that is unknown, revoked, or not enabled for v1 answers 401 invalid-api-key. No requests-per-second quota is published. Handle 429 and honor Retry-After when present.
Examples use real mainnet token and contract addresses with placeholder wallets, hashes, signatures, and IDs.Authorizations
Body
Which amount is fixed. exact-in: source.amount is spent and destination.minAmountOut is guaranteed. exact-out: destination.amount arrives and the response's source.amount is the required input. custom: source.amount is spent and the supplied destination.calls execute on the destination chain.
exact-in, exact-out, custom Show child attributes
Show child attributes
Show child attributes
Show child attributes
Required. Attribution label for the integration. Does not authenticate and does not change pricing.
1 - 128Receives the source funds if the intent is refunded. Defaults to source.funder. Address on the source chain.
Decimal fraction of the destination amount: 0.005 = 0.5%. Range 0.0001-1; a percent-style 0.5 would mean 50%.
0.0001 <= x <= 1Show child attributes
Show child attributes
Response
The winning quote. Verify signature against the source chain's quoteSigner, then fund before expiresAt.
Quote ID, prefixed quote:. Status lookups take the bare UUID.
Echo of the request type.
exact-in, exact-out, custom Show child attributes
Show child attributes
Show child attributes
Show child attributes
Tolerance actually bound into destination.minAmountOut, as a decimal fraction
Fees charged for the whole quote, by type (gas, proving, protocol, gateway). estimate: false means the amount is binding.
Show child attributes
Show child attributes
Ordered legs of the route. Each step names its provider and lists the intents it is realized by, with the full decoded intent. A stitched-destination intent credits the recipient on a multi-hop route and is the one to track for delivery; bucket-candidate entries are alternative routes, not all of which fill.
Show child attributes
Show child attributes
The solver that will fulfil the intent.
Show child attributes
Show child attributes
Hash of the primary intent; the handle for GET /v1/intents/status?intentHash=. Null when every intent is listed under steps[].intents.
Everything needed to fund the quote: the ready-to-send transaction, the decoded intent (route and reward), and the vault the source Portal funds the intent through, which is also the counterparty for gasless submits. Sent as-is.
Show child attributes
Show child attributes
Quote expiry, Unix seconds. Covered by signature. Fund before it passes; afterwards request a new quote.
EIP-712 signature by the source chain's quoteSigner (see GET /v1/chains) over Quote(string id, bytes32[] intentHashes, uint64 expiresAt) with domain { name: "EcoQuoteV1", version: "1", chainId: source.chainId }. intentHashes is intentHash plus every steps[].intents[].intentHash, lowercased, de-duplicated, sorted ascending.
Every competing quote, ranked best first, when options.allQuotes is true; each entry is independently signed. Null otherwise. The top-level object is always the winner.
Show child attributes
Show child attributes
