Appearance
5-Minute Quickstart
This guide walks through the minimum integration sequence:
- Load tokens.
- Load providers.
- Request a quote.
- Read quote results and errors.
Base URLs
- Production API:
https://api.hermes.ag
Prerequisites
- HTTP client (
curl,fetch, or equivalent)
API Limits
Default IP limits are applied per route:
/v1/tokens: 30 requests per 60 seconds/v1/tokens/:identifier: 60 requests per 60 seconds/v1/providers: 60 requests per 60 seconds/v1/quote: 30 requests per 60 seconds
Use response headers (RateLimit-Policy, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset) to track your current budget.
If you need higher limits, reach out on Discord.
1) Fetch Tokens
Use /v1/tokens to get token metadata and the instrumentAdmin values required for quote requests.
bash
curl "https://api.hermes.ag/v1/tokens"ts
const tokensResponse = await fetch('https://api.hermes.ag/v1/tokens');
if (!tokensResponse.ok) throw new Error(`tokens failed: ${tokensResponse.status}`);
const tokens = await tokensResponse.json();2) Fetch Providers
Use /v1/providers to get provider IDs you can pass to whitelistedProviders in quote requests.
bash
curl "https://api.hermes.ag/v1/providers"ts
const providersResponse = await fetch('https://api.hermes.ag/v1/providers');
if (!providersResponse.ok) throw new Error(`providers failed: ${providersResponse.status}`);
const providers = await providersResponse.json();3) Request a Quote
Call /v1/quote with required params:
inputInstrumentIdinputInstrumentAdminoutputInstrumentIdoutputInstrumentAdminamount(positive decimal string)recipient
Example:
bash
curl "https://api.hermes.ag/v1/quote?inputInstrumentId=Amulet&inputInstrumentAdmin=DSO::1220b1431ef217342db44d516bb9befde802be7d8899637d290895fa58880f19accc&outputInstrumentId=USDCx&outputInstrumentAdmin=decentralized-usdc-interchain-rep::12208115f1e168dd7e792320be9c4ca720c751a02a3053c7606e1c1cd3dad9bf60ef&amount=10&recipient=user-address"ts
const params = new URLSearchParams({
inputInstrumentId: 'Amulet',
inputInstrumentAdmin:
'DSO::1220b1431ef217342db44d516bb9befde802be7d8899637d290895fa58880f19accc',
outputInstrumentId: 'USDCx',
outputInstrumentAdmin:
'decentralized-usdc-interchain-rep::12208115f1e168dd7e792320be9c4ca720c751a02a3053c7606e1c1cd3dad9bf60ef',
amount: '10',
recipient: 'user-address',
});
const quoteResponse = await fetch(`https://api.hermes.ag/v1/quote?${params.toString()}`);
const quotePayload = await quoteResponse.json();
if (!quoteResponse.ok) {
throw new Error(JSON.stringify(quotePayload));
}4) Read Success and Error Responses
Success response shape:
requestId: stringtotalTimeMs: numberswapType: "exactIn"platformFeeBps: numberquotes: QuoteItem[]
Notes:
quotescan be empty when providers fail or no route is available.- Quotes are sorted by best
outAmountfirst. - Each
quotes[i]is aQuoteItem(one executable route variant). - Execute by branching on
quote.execution.executionMode:magicAddress: send toquote.execution.transferAddresswithout memo.transfer: send toquote.execution.transferAddressand includequote.execution.memo.
- Re-fetch a quote when amount, token pair, provider filter, or recipient changes.
Validation error (400) shape:
json
{
"error": "Invalid quote request",
"details": [
{
"field": "amount",
"message": "amount must be a positive decimal string"
}
]
}Rate limit error (429) shape:
json
{
"error": "Too Many Requests",
"details": "Rate limit exceeded for this route"
}Responses also include rate-limit headers:
RateLimit-PolicyX-RateLimit-LimitX-RateLimit-RemainingX-RateLimit-ResetRetry-After(only on429)
Next Step
Go to the Quote endpoint reference for full request and QuoteItem and execution-mode details.