ET10 Exchange API
Exchange 100+ cryptos for ET10 Liquidity Stream Tokens. Built for AI agents, DCA bots, and programmatic trading.
Quick Start
# List all supported tokens
curl https://cymetica.com/api/v1/rst/supported-tokens
# Get a quote: how much ET10 for 1 ETH?
curl "https://cymetica.com/api/v1/rst/0xYOUR_RST_ADDRESS/quote-token?token=ETH&amount=1"
# Get deposit address for BTC
curl https://cymetica.com/api/v1/rst/exchange-address/BTC
import requests
BASE = "https://cymetica.com/api/v1/rst"
# List supported tokens
tokens = requests.get(f"{BASE}/supported-tokens").json()
print(f"{len(tokens['tokens'])} tokens available")
# Get a quote for 0.5 ETH → ET10
quote = requests.get(f"{BASE}/0xRST_ADDRESS/quote-token",
params={"token": "ETH", "amount": "0.5"}).json()
print(f"0.5 ETH = {quote['rst_amount']} ET10")
const BASE = "https://cymetica.com/api/v1/rst";
// List supported tokens
const tokens = await fetch(`${BASE}/supported-tokens`).then(r => r.json());
console.log(`${tokens.tokens.length} tokens available`);
// Get a quote for 0.5 ETH → ET10
const quote = await fetch(
`${BASE}/0xRST_ADDRESS/quote-token?token=ETH&amount=0.5`
).then(r => r.json());
console.log(`0.5 ETH = ${quote.rst_amount} ET10`);
Authentication
Most ET10 exchange endpoints are public (token list, quotes, deposit addresses, status checks). Only deposit intent creation requires a Bearer token.
# Authenticated request (deposit intent)
curl -X POST https://cymetica.com/api/v1/rst/deposit-intent \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"rst_address":"0x...","token_symbol":"ETH"}'
Get your API key from /account → API Keys.
Public Endpoints
No authentication required. Use these for token discovery, price quotes, deposit addresses, and status tracking.
Returns all supported tokens with metadata including chain, address, decimals, and logo URL. ET10 price is fixed at $0.001.
Response Fields
curl https://cymetica.com/api/v1/rst/supported-tokens
import requests
tokens = requests.get("https://cymetica.com/api/v1/rst/supported-tokens").json()
for t in tokens["tokens"][:5]:
print(f"{t['symbol']:6s} {t['name']:20s} {t['chain']}")
const data = await fetch("https://cymetica.com/api/v1/rst/supported-tokens").then(r => r.json());
data.tokens.slice(0, 5).forEach(t =>
console.log(`${t.symbol} - ${t.name} (${t.chain})`)
);
Example Response
{
"tokens": [
{
"rank": 1,
"symbol": "BTC",
"name": "Bitcoin",
"address": "0x...",
"decimals": 8,
"chain": "Ethereum",
"chain_id": 1,
"category": "major",
"logoUrl": "https://s2.coinmarketcap.com/static/img/coins/64x64/1.png"
},
...
],
"rst_price_usd": "0.001"
}
Returns the platform's collection address for the token's chain. Send crypto to this address and ET10 is sent back to the sender's address automatically.
Path Parameters
Response Fields
curl https://cymetica.com/api/v1/rst/exchange-address/ETH
addr = requests.get("https://cymetica.com/api/v1/rst/exchange-address/ETH").json()
print(f"Send ETH to: {addr['deposit_address']} on {addr['chain']}")
const addr = await fetch("https://cymetica.com/api/v1/rst/exchange-address/ETH").then(r => r.json());
console.log(`Send ETH to: ${addr.deposit_address} on ${addr.chain}`);
Calculate how many ET10 you'll receive for a given token amount. Uses live CoinGecko prices.
Path Parameters
Query Parameters
Response Fields
curl "https://cymetica.com/api/v1/rst/0xRST_ADDRESS/quote-token?token=ETH&amount=1.5"
quote = requests.get(
"https://cymetica.com/api/v1/rst/0xRST_ADDRESS/quote-token",
params={"token": "ETH", "amount": "1.5"}
).json()
print(f"1.5 ETH (${quote['usd_value']}) = {quote['rst_amount']} ET10")
const quote = await fetch(
"https://cymetica.com/api/v1/rst/0xRST_ADDRESS/quote-token?token=ETH&amount=1.5"
).then(r => r.json());
console.log(`1.5 ETH ($${quote.usd_value}) = ${quote.rst_amount} ET10`);
Example Response
{
"token_symbol": "ETH",
"token_amount": "1.5",
"token_price_usd": "3200.50",
"usd_value": "4800.75",
"rst_amount": "4800750",
"rst_price_usd": "0.001"
}
Check the status of the most recent deposit for a token. Returns status from the last 2 hours. Use this for polling after sending crypto.
Path Parameters
Response Fields
curl https://cymetica.com/api/v1/rst/deposit-status/ETH
status = requests.get("https://cymetica.com/api/v1/rst/deposit-status/ETH").json()
print(f"Status: {status['status']}")
if status.get("tx_hash"):
print(f"Tx: https://etherscan.io/tx/{status['tx_hash']}")
const status = await fetch("https://cymetica.com/api/v1/rst/deposit-status/ETH").then(r => r.json());
console.log(`Status: ${status.status}`);
if (status.tx_hash) console.log(`Tx: https://etherscan.io/tx/${status.tx_hash}`);
Authenticated Endpoints
These endpoints require a Bearer token. Used for creating deposit intents and tracking individual user deposits.
Creates a deposit intent and returns the collection address. The platform watches for deposits and automatically sends ET10 back to the sender.
Request Body
Response Fields
curl -X POST https://cymetica.com/api/v1/rst/deposit-intent \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"rst_address":"0xRST_ADDRESS","token_symbol":"ETH"}'
intent = requests.post(
"https://cymetica.com/api/v1/rst/deposit-intent",
headers={"Authorization": "Bearer YOUR_TOKEN"},
json={"rst_address": "0xRST_ADDRESS", "token_symbol": "ETH"}
).json()
print(f"Send ETH to: {intent['deposit_address']}")
const intent = await fetch("https://cymetica.com/api/v1/rst/deposit-intent", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_TOKEN",
"Content-Type": "application/json"
},
body: JSON.stringify({ rst_address: "0xRST_ADDRESS", token_symbol: "ETH" })
}).then(r => r.json());
console.log(`Send ETH to: ${intent.deposit_address}`);
Check the status of a specific deposit intent. Users can only view their own intents.
curl https://cymetica.com/api/v1/rst/deposit-intent/42 \
-H "Authorization: Bearer YOUR_TOKEN"
status = requests.get(
"https://cymetica.com/api/v1/rst/deposit-intent/42",
headers={"Authorization": "Bearer YOUR_TOKEN"}
).json()
print(f"Intent #{status['id']}: {status['status']}")
List all deposit intents for the authenticated user (most recent first, max 50).
curl https://cymetica.com/api/v1/rst/deposit-intents \
-H "Authorization: Bearer YOUR_TOKEN"
Status Tracking
After sending crypto to the deposit address, poll the status endpoint to track progress. The state machine flows through these states:
rst_received and tx_hash populated.Polling Example
import time, requests
BASE = "https://cymetica.com/api/v1/rst"
# Poll every 10 seconds until completed or failed
while True:
status = requests.get(f"{BASE}/deposit-status/ETH").json()
print(f"Status: {status['status']}")
if status["status"] == "completed":
print(f"Received {status['rst_received']} ET10!")
print(f"Tx: https://etherscan.io/tx/{status['tx_hash']}")
break
elif status["status"] == "failed":
print("Deposit failed — contact support")
break
time.sleep(10)
MCP Integration
5 MCP tools for AI agents using Claude Desktop, Cursor, or any MCP-compatible client.
Claude Desktop Configuration
Add to your claude_desktop_config.json:
{
"mcpServers": {
"event-trader": {
"command": "uvx",
"args": ["event-trader-mcp"],
"env": {
"ET_API_URL": "https://cymetica.com",
"ET_API_KEY": "YOUR_API_KEY"
}
}
}
}
Once configured, ask Claude: "List all tokens I can exchange for ET10" or "Quote me 0.1 ETH to ET10".
DCA Bot Example
A complete Python script that performs dollar-cost averaging into ET10 with any supported token.
#!/usr/bin/env python3
"""ET10 DCA Bot — automated recurring purchases."""
import time
import requests
BASE = "https://cymetica.com/api/v1/rst"
RST_ADDRESS = "0xYOUR_RST_ADDRESS"
TOKEN = "ETH"
API_KEY = "YOUR_API_KEY"
HEADERS = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}
def buy_et10():
# 1. Get a quote
quote = requests.get(
f"{BASE}/{RST_ADDRESS}/quote-token",
params={"token": TOKEN, "amount": "0.01"}
).json()
print(f"Quote: 0.01 {TOKEN} = {quote['rst_amount']} ET10 (${quote['usd_value']})")
# 2. Create deposit intent
intent = requests.post(
f"{BASE}/deposit-intent",
headers=HEADERS,
json={"rst_address": RST_ADDRESS, "token_symbol": TOKEN}
).json()
print(f"Deposit address: {intent['deposit_address']} ({intent['chain']})")
# 3. Send crypto to the deposit address (use your wallet/web3 library here)
print(f"Send 0.01 {TOKEN} to {intent['deposit_address']}")
# 4. Poll for completion
for _ in range(60): # 10 minutes max
status = requests.get(f"{BASE}/deposit-status/{TOKEN}").json()
if status["status"] == "completed":
print(f"Received {status['rst_received']} ET10!")
print(f"Tx: https://etherscan.io/tx/{status['tx_hash']}")
return True
elif status["status"] == "failed":
print("Failed — check deposit")
return False
time.sleep(10)
return False
if __name__ == "__main__":
buy_et10()
Troubleshooting
Error Codes
| Code | Meaning | Action |
|---|---|---|
| 400 | Invalid token symbol or amount | Check supported tokens list |
| 400 | Token coming soon | Chain not yet supported for this token |
| 401 | Unauthorized | Add Bearer token for auth-required endpoints |
| 404 | ET10 not found | Verify the ET10 contract address |
| 429 | Rate limited | Wait and retry. Public: 30/min, Intents: 10/min |
| 503 | Exchange address unavailable | Chain wallet not configured. Try again later. |
| 503 | Price unavailable | CoinGecko price feed down. Retry in 60s. |
Rate Limits
| Endpoint | Limit | Window |
|---|---|---|
| supported-tokens | No limit | — |
| exchange-address | 30 requests | Per IP per minute |
| quote-token | 30 requests | Per IP per minute |
| deposit-status | 60 requests | Per IP per minute |
| deposit-intent | 10 requests | Per user per minute |