Eco Quotes V3 API
The Quotes V3 API from Eco — 9 operation(s) for quotes v3.
The Quotes V3 API from Eco — 9 operation(s) for quotes v3.
openapi: 3.0.0
info:
title: Eco Routes Quotes V1 Quotes V3 API
description: Eco Routes API documentation
version: '1.0'
contact: {}
servers:
- url: https://quotes.eco.com
description: Production
- url: https://quotes-preprod.eco.com
description: Preproduction
- url: https://quotes.staging.eco.com
description: Staging
- url: http://localhost:3000
description: Local
tags:
- name: Quotes V3
paths:
/api/v3/intents/intentStatus:
post:
operationId: IntentsController_getIntentStatus
summary: Get Intent Status
description: 'Query the current status of a cross-chain intent transaction. Provide one of: intentHash, intentCreatedHash, or fulfillmentHash to track the intent''s progress through the execution lifecycle.'
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/IntentStatusRequestV3DTO'
responses:
'200':
description: Successfully retrieved intent status and transaction details
content:
application/json:
schema:
$ref: '#/components/schemas/IntentStatusResponseV3DTO'
tags:
- Quotes V3
/api/v3/intents/status:
post:
operationId: IntentsController_getIntentStatusArray
summary: Get Intent Status Array
description: 'Query the status of multiple intents created in the same transaction. Returns an array of intent statuses ordered by creation event log index. Provide one of: intentHash, intentCreatedHash, or fulfillmentHash. Limited to 100 results.'
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/IntentStatusRequestV3DTO'
responses:
'200':
description: Successfully retrieved array of intent statuses ordered by log index
content:
application/json:
schema:
$ref: '#/components/schemas/IntentStatusArrayResponseV3DTO'
'404':
description: No intents found matching the search criteria
tags:
- Quotes V3
/api/v3/intents/intentsByAddress:
post:
operationId: IntentsController_getIntentsByAddress
summary: Get Intents By Address
description: Query intents by creator/funder addresses across EVM, Solana, and Tron chains. Supports pagination and date range filtering. At least one address array must be provided.
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/IntentsByAddressRequestV3DTO'
responses:
'200':
description: Successfully retrieved intents for the provided addresses
content:
application/json:
schema:
$ref: '#/components/schemas/IntentsResponseV3DTO'
tags:
- Quotes V3
/api/v3/intents/intentByHash:
post:
operationId: IntentsController_getIntentByHash
summary: Get Intent Activity By Hash
description: Lookup an intent by its hash and return full activity details including lifecycle events (fulfillment, refund). Searches across EVM, Solana, and Tron chains.
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/IntentByHashRequestV3DTO'
responses:
'200':
description: Successfully retrieved intent activity
content:
application/json:
schema:
$ref: '#/components/schemas/IntentByHashResponseV3DTO'
tags:
- Quotes V3
/api/v3/intents/refundableIntents:
post:
operationId: IntentsController_getRefundableIntents
summary: Get Refundable Intents
description: Query refundable intents (expired without fulfillment or refund) by creator/funder addresses across EVM, Solana, and Tron chains. At least one address array must be provided.
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/RefundableIntentsRequestV3DTO'
responses:
'200':
description: Successfully retrieved refundable intents for the provided addresses
content:
application/json:
schema:
$ref: '#/components/schemas/IntentsResponseV3DTO'
tags:
- Quotes V3
/api/v3/quotes/exactOut:
post:
operationId: QuotesV3Controller_getQuotes
summary: Get Exact Out Quotes
description: Retrieve exact out quotes from solvers for a cross-chain token swap. Returns detailed pricing, fees, contract addresses, and estimated fulfillment time for the requested swap.
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/QuotesRequestV3DTO'
responses:
'200':
description: Successfully retrieved exact out quotes with pricing and execution details
content:
application/json:
schema:
$ref: '#/components/schemas/QuotesResponseV3DTO'
tags:
- Quotes V3
/api/v3/quotes/exactIn:
post:
operationId: QuotesV3Controller_getReverseQuotes
summary: Get Exact In Quotes
description: Retrieve exact in quotes from solvers for a given intent. Exact in quotes allow you to specify what you want to offer and get quotes for what will be received and can only have transfer calls.
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/QuotesRequestV3DTO'
responses:
'201':
description: Successfully retrieved exact in quotes from solvers
content:
application/json:
schema:
$ref: '#/components/schemas/QuotesResponseV3DTO'
tags:
- Quotes V3
/api/v3/quotes/single:
post:
operationId: QuotesV3Controller_createQuote
summary: Get Single Quote
description: Retrieve the best quote for a cross-chain single token swap. Returns detailed pricing, fees, contract addresses, and estimated fulfillment time for the requested swap. This endpoint should only be used for intents intended to be published onchain.
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SingleRequestV3DTO'
responses:
'200':
description: Successfully retrieved quote with pricing and execution details
content:
application/json:
schema:
$ref: '#/components/schemas/SingleResponseV3DTO'
tags:
- Quotes V3
/api/v3/quotes/initiateGaslessIntent:
post:
operationId: QuotesV3Controller_initiateGaslessIntent
summary: Initiate Gasless Intent
description: Submit a gasless intent transaction using a previously obtained quote. This endpoint initiates the gasless execution of an intent with the specified solver.
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/InitiateGaslessIntentV3DTO'
responses:
'201':
description: Successfully initiated gasless intent transaction
content:
application/json:
schema:
$ref: '#/components/schemas/InitiateGaslessIntentResponseV3DTO'
tags:
- Quotes V3
components:
schemas:
IntentDataV3DTO:
type: object
properties:
sourceChainID:
type: number
description: Source chain ID where the intent was created
example: 42161
destinationChainID:
type: number
description: Destination chain ID where the intent will be fulfilled
example: 167000
creator:
type: string
description: Address that created the intent
example: '0x1234567890abcdef1234567890abcdef12345678'
refundRecipient:
type: string
description: Address that received the refund (only set when intent has been refunded)
example: '0x1234567890abcdef1234567890abcdef12345678'
deadline:
type: number
description: Unix timestamp when the intent expires and becomes refundable
example: 1730000000
createdAt:
type: number
description: Unix timestamp when the intent was created
example: 1729500000
sourceTransfers:
description: Array of reward token transfers (what the prover receives from the creator). Does not include recipients.
example:
- token: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
amount: '1000000'
type: array
items:
$ref: '#/components/schemas/SourceTransferV3DTO'
destinationTransfers:
description: Array of destination transfers (tokens and recipients on the destination chain). Always includes recipients.
example:
- token: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
amount: '1000000'
recipient: '0x054968e2f376192c69b8f30870d450519ff77ac8'
type: array
items:
$ref: '#/components/schemas/DestinationTransferV3DTO'
required:
- sourceChainID
- destinationChainID
- creator
- deadline
- createdAt
- sourceTransfers
- destinationTransfers
TransactionInfoV3DTO:
type: object
properties:
chainId:
type: number
description: Chain ID where this transaction occurred
example: 1
transactionHash:
type: string
description: Hash of the transaction
example: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef12'
blockExplorerUrl:
type: string
description: URL to view this transaction on a block explorer
example: https://etherscan.io/tx/0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef12
required:
- chainId
- transactionHash
- blockExplorerUrl
GaslessIntentDataV3DTO:
type: object
properties:
permit3:
description: Permit3 signature data for multi-chain token approvals
allOf:
- $ref: '#/components/schemas/Permit3DTO'
allowPartial:
type: boolean
description: Whether to allow partial funding of the intent
example: false
default: false
required:
- permit3
QuotesRequestV3DTO:
type: object
properties:
dAppID:
type: string
description: Unique identifier for the client application making the request
example: my-dapp
intentExecutionTypes:
type: array
description: Array of intent execution types to fetch quotes for
example:
- SELF_PUBLISH
items:
type: string
enum:
- SELF_PUBLISH
- GASLESS
quoteRequest:
description: Cross-chain token swap request details including source/destination tokens and addresses
allOf:
- $ref: '#/components/schemas/QuoteRequestV3DTO'
contracts:
description: Optional contract addresses to use for the cross-chain swap (will use defaults if not specified)
allOf:
- $ref: '#/components/schemas/QuotesV3RequestContractsDTO'
required:
- dAppID
- intentExecutionTypes
- quoteRequest
IntentByHashRequestV3DTO:
type: object
properties:
intentHash:
type: string
description: Intent hash to look up
example: 0xabc123...
required:
- intentHash
Permit3DTO:
type: object
properties:
chainId:
type: number
description: The original chain ID from the signature
example: 1
permitContract:
type: string
description: Address of the Permit3 contract
example: '0x1234567890123456789012345678901234567890'
owner:
type: string
description: Owner address of the tokens being permitted
example: '0x0987654321098765432109876543210987654321'
salt:
type: string
description: Unique salt value for the permit signature
example: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef'
signature:
type: string
description: Cryptographic signature for the permit
example: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1b'
deadline:
type: string
description: Expiration timestamp for the permit signature
example: '1234567890'
timestamp:
type: number
description: Unix timestamp when the permit was created
example: 1234567890
merkleRoot:
type: string
description: Merkle root hash representing all chain permit leaves
example: '0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd'
leaves:
description: Array of merkle tree leaf hashes for multi-chain permits
example:
- '0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890ab'
- '0xfedcba0987654321fedcba0987654321fedcba0987654321fedcba0987654321'
type: array
items:
type: string
allowanceOrTransfers:
description: Array of allowance or transfer data organized by chain for multi-chain permits
type: array
items:
$ref: '#/components/schemas/AllowanceOrTransferDTO'
required:
- chainId
- permitContract
- owner
- salt
- signature
- deadline
- timestamp
- merkleRoot
- leaves
- allowanceOrTransfers
RouteDataDTO:
type: object
properties:
originChainID:
type: string
description: Chain ID where the intent originates
example: '8453'
destinationChainID:
type: string
description: Chain ID where the intent will be executed
example: '10'
inboxContract:
type: string
description: Address of the inbox contract on the destination chain
example: '0x123abc456def789012345678901234567890abcd'
tokens:
description: Array of ERC20 tokens and amounts involved in the destination calls
type: array
items:
$ref: '#/components/schemas/TokenAmountDataDTO'
calls:
description: Array of contract calls to be executed on the destination chain
type: array
items:
$ref: '#/components/schemas/CallDataDTO'
salt:
type: string
description: Salt for the intent (used when initiating gasless intents or publishing onchain, set to '0x0' for quote requests)
example: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef'
required:
- originChainID
- destinationChainID
- inboxContract
- tokens
- calls
IntentsByAddressRequestV3DTO:
type: object
properties:
evmAddresses:
description: Array of EVM addresses (0x...) to filter intents by creator/funder
example:
- '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb'
type: array
items:
type: string
solanaAddresses:
description: Array of Solana addresses (base58) to filter intents by creator/funder
example:
- 9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM
type: array
items:
type: string
tronAddresses:
description: Array of Tron addresses (T...) to filter intents by creator/funder
example:
- TYASr5UV6HEcXatwdFQfmLVUqQQQMUxHLS
type: array
items:
type: string
startTimestamp:
type: number
description: 'Start timestamp (Unix seconds) for date range filter (default: 7 days ago)'
example: 1704067200
endTimestamp:
type: number
description: 'End timestamp (Unix seconds) for date range filter (default: now)'
example: 1704153600
RefundableIntentsRequestV3DTO:
type: object
properties:
evmAddresses:
description: Array of EVM addresses (0x...) to filter refundable intents by creator/funder
example:
- '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb'
type: array
items:
type: string
solanaAddresses:
description: Array of Solana addresses (base58) to filter refundable intents by creator/funder
example:
- 9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM
type: array
items:
type: string
tronAddresses:
description: Array of Tron addresses (T...) to filter refundable intents by creator/funder
example:
- TYASr5UV6HEcXatwdFQfmLVUqQQQMUxHLS
type: array
items:
type: string
IntentByHashResponseV3DTO:
type: object
properties:
data:
description: Intent activity details
allOf:
- $ref: '#/components/schemas/IntentActivityV3DTO'
required:
- data
TokenInfoV3DTO:
type: object
properties:
address:
type: string
description: Contract address of the token
example: '0xA0b86a33E6441e45C3b9d1C3D6a0b5be4b7b5b5a'
decimals:
type: number
description: Number of decimal places for the token
example: 6
symbol:
type: string
description: Token symbol or ticker
example: USDC
required:
- address
- decimals
- symbol
InitiateGaslessIntentResponseV3DTO:
type: object
properties:
data:
description: Gasless intent execution response data
allOf:
- $ref: '#/components/schemas/GaslessIntentExecutionResponseDTO'
required:
- data
SingleResponseV3DTO:
type: object
properties:
data:
description: Quote response data
allOf:
- $ref: '#/components/schemas/QuoteResponseV3DTO'
required:
- data
GaslessIntentExecutionResponseEntryDTO:
type: object
properties:
chainID:
type: number
description: Chain ID where the gasless intent was executed
example: 1
quoteIDs:
description: Array of quote IDs associated with this execution
example:
- quote_abc123def456
- quote_ghi789jkl012
type: array
items:
type: string
transactionHash:
type: string
description: Transaction hash of the executed gasless intent
example: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef'
error:
type: object
description: Error details if the gasless intent execution failed
example:
message: Insufficient balance
code: INSUFFICIENT_FUNDS
required:
- chainID
- quoteIDs
- transactionHash
FeeV3DTO:
type: object
properties:
name:
type: string
description: Name identifier for the fee type
example: Solver Fee
description:
type: string
description: Human-readable description of what this fee covers
example: Fee paid to the solver for executing the cross-chain swap
token:
description: Token information for the fee payment
allOf:
- $ref: '#/components/schemas/TokenInfoV3DTO'
amount:
type: string
description: Fee amount as a string representation of a bigint
example: '1000'
required:
- name
- description
- token
- amount
TransactionWithTransfersV3DTO:
type: object
properties:
chainId:
type: number
description: Chain ID where this transaction occurred
example: 42161
timestamp:
type: number
description: Unix timestamp of the transaction
example: 1729163645
txHash:
type: string
description: Transaction hash
example: '0xe1ffdcf09d5aa92a2d89b1b39db3f8cadf09428a296cce0d5e387595ac83d08f'
txLink:
type: string
description: Block explorer URL for this transaction
example: https://arbiscan.io/tx/0xe1ffdcf09d5aa92a2d89b1b39db3f8cadf09428a296cce0d5e387595ac83d08f
transfers:
type: array
description: Token transfers associated with this transaction. Source transfers (sendingTxs) do not include recipients. Destination transfers (receivingTxs) include recipients.
items:
oneOf:
- $ref: '#/components/schemas/SourceTransferV3DTO'
- $ref: '#/components/schemas/DestinationTransferV3DTO'
example:
- token: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
amount: '1000000'
recipient: '0x054968e2f376192c69b8f30870d450519ff77ac8'
required:
- chainId
- timestamp
- txHash
- txLink
- transfers
DestinationTransferV3DTO:
type: object
properties:
token:
type: string
description: Token address (use "0x" for native tokens)
example: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
amount:
type: string
description: Token amount as string
example: '1000000'
recipient:
type: string
description: Recipient address for this transfer
example: '0x9876543210abcdef9876543210abcdef98765432'
required:
- token
- amount
- recipient
QuoteRequestV3DTO:
type: object
properties:
sourceChainID:
type: number
description: Chain ID of the source network where tokens will be sent from
example: 1
destinationChainID:
type: number
description: Chain ID of the destination network where tokens will be received
example: 42161
sourceToken:
type: string
description: Contract address of the token being sent on the source chain
example: '0xA0b86a33E6441e45C3b9d1C3D6a0b5be4b7b5b5a'
destinationToken:
type: string
description: Contract address of the token to be received on the destination chain
example: '0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8'
sourceAmount:
type: string
description: Amount of source tokens to send, specified as a string representation of a bigint
example: '1000000'
funder:
type: string
description: Address that will provide the tokens and pay for the transaction
example: '0x742d35Cc6527C92b4A1F3a2a8b1c9b3e8c4c5b2a'
refundRecipient:
type: string
description: Address to receive refunds if the intent fails (defaults to funder if not specified)
example: '0x742d35Cc6527C92b4A1F3a2a8b1c9b3e8c4c5b2a'
recipient:
type: string
description: Address that will receive the tokens on the destination chain
example: '0x8Ba1c0a8B4A4b9e8A9f1a6B7c8d9e0F1234567890'
required:
- sourceChainID
- destinationChainID
- sourceToken
- destinationToken
- sourceAmount
- funder
- recipient
InitiateGaslessIntentV3DTO:
type: object
properties:
intentGroupID:
type: string
description: Unique identifier of the group of intents being used
example: group:01234567-89ab-cdef-0123-456789abcdef
dAppID:
type: string
description: Identifier for the client application initiating the gasless intent
example: my-dapp
intentEntries:
description: Array of intent request entries
type: array
items:
$ref: '#/components/schemas/GaslessIntentRequestIntentEntryDTO'
gaslessIntentData:
description: Gasless intent configuration containing permit signatures and execution parameters
allOf:
- $ref: '#/components/schemas/GaslessIntentDataV3DTO'
required:
- intentGroupID
- dAppID
- intentEntries
- gaslessIntentData
IntentStatusArrayResponseV3DTO:
type: object
properties:
data:
description: Array of intent statuses matching the search criteria (with log indexes and timestamps)
type: array
items:
$ref: '#/components/schemas/IntentStatusWithMetadataV3DTO'
required:
- data
IntentActivityV3DTO:
type: object
properties:
intentHash:
type: string
description: Intent hash (properly formatted with/without 0x prefix based on source chain)
example: 0xabc123...
sourceChainID:
type: number
description: Source chain ID where the intent was created
example: 1399811149
destinationChainID:
type: number
description: Destination chain ID where the intent will be fulfilled
example: 8453
creator:
type: string
description: Address that created the intent
example: 0x123...
funder:
type: string
description: Address that funded the intent (if different from creator)
example: 0x456...
recipient:
type: string
description: Destination address for the intent
example: 0x789...
deadline:
type: number
description: Unix timestamp when the intent expires and becomes refundable
example: 1730000000
createdAt:
type: number
description: Unix timestamp when the intent was created
example: 1729500000
version:
type: string
description: Intent version (from EVM indexer or "3.0.0-alpha.8" for Solana/Tron)
example: 1.7.13
params:
type: object
description: Raw intent parameters for frontend parsing
example: {}
createdTxHash:
type: string
description: Transaction hash of the intent creation
example: 0xabc...
contract:
type: string
description: Contract address that emitted the intent creation event
example: 0xdef...
isGasless:
type: boolean
description: Whether this is a gasless intent (funder is different from creator)
example: true
fulfillment:
description: Fulfillment event details (if intent was fulfilled)
allOf:
- $ref: '#/components/schemas/EventInfoDTO'
refund:
description: Refund event details (if intent was refunded)
allOf:
- $ref: '#/components/schemas/EventInfoDTO'
required:
- intentHash
- sourceChainID
- destinationChainID
- creator
- deadline
- createdAt
- version
- params
- createdTxHash
- contract
- isGasless
RewardDataDTO:
type: object
properties:
creator:
type: string
description: Address of the user creating this intent, this will be the recipient of a refund if the intent expires
example: '0x742d35Cc6634C0532925a3b8D56C85e83F9D18Fa'
proverContract:
type: string
description: Address of the prover contract that validates intent execution
example: '0x1234567890abcdef1234567890abcdef12345678'
deadline:
type: string
description: Unix timestamp deadline for when this intent expires (in seconds)
example: '1699123456'
nativeValue:
type: string
description: Native token amount offered (in wei)
example: '0'
tokens:
description: Array of ERC20 tokens and amounts offered on the origin chain for fulfilling the intent
type: array
items:
$ref: '#/components/schemas/TokenAmountDataDTO'
required:
- creator
- proverContract
- deadline
- nativeValue
- tokens
QuotesResponseV3DTO:
type: object
properties:
data:
description: Array of solver quote responses
type: array
items:
$ref: '#/components/schemas/SolverQuoteV2ResponseDTO'
required:
- data
QuoteResponseV3DTO:
type: object
properties:
quoteResponse:
description: Detailed quote information including tokens, amounts, fees, and timing
allOf:
- $ref: '#/components/schemas/QuoteResponseDataV3DTO'
contracts:
description: Contract addresses required for executing this cross-chain swap
allOf:
- $ref: '#/components/schemas/QuoteV3ResponseContractsDTO'
required:
- contracts
GaslessIntentRequestIntentEntryDTO:
type: object
properties:
routeData:
description: Route configuration specifying source and destination chains and transfer details
allOf:
- $ref: '#/components/schemas/RouteDataDTO'
rewardData:
description: Reward configuration defining tokens and amounts offered to solvers for executing the intent
allOf:
- $ref: '#/components/schemas/RewardDataDTO'
quoteID:
type: string
description: Unique identifier of the quote being used to initiate the gasless intent
example: quote:01234567-89ab-cdef-0123-456789abcdef
solverID:
type: string
description: Address of the solver that provided the quote
example: '0x742d35Cc6634C0532925a3b8D56C85e83F9D18Fa'
salt:
type: string
required:
- routeData
- rewardData
- quoteID
- solverID
- salt
IntentStatusRequestV3DTO:
type: object
properties:
intentHash:
type: string
description: Hash of the intent to query status for
intentCreatedHash:
type: string
description: Transaction hash of the intent creation transaction
fulfillmentHash:
type: string
description: Transaction hash of the intent fulfillment transaction
oneOf:
- required:
- intentHash
- required:
- intentCreatedHash
- required:
- fulfillmentHash
IntentsResponseV3DTO:
type: object
properties:
data:
description: Array of intents matching the request
type: array
items:
$ref: '#/components/schemas/IntentActivityV3DTO'
required:
- data
SingleRequestV3DTO:
type: object
properties:
dAppID:
type: string
description: Unique identifier for the client application making the request
example: my-dapp
quoteRequest:
description: Cross-chain token swap request details including source/destination tokens and addresses
allOf:
- $ref: '#/components/schemas/QuoteRequestV3DTO'
contracts:
description: Optional contract addresses to use for the cross-chain swap (will use defaults if not specified)
allOf:
- $ref: '#/components/schemas/QuotesV3RequestContractsDTO'
required:
- dAppID
- quoteRequest
TokenAmountDataDTO:
type: object
properties:
token:
type: string
description: Address of the ERC20 token contract
example: '0xA0b86a33E6441446C1c3df4c64B739C7e4a81ec0'
# --- truncated at 32 KB (45 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/eco/refs/heads/main/openapi/eco-quotes-v3-api-openapi.yml