EventTrader

Prediction Market Platform
Menu
Trade
Home How It Works AI Hedge Fund Backtest Backtest Labs Exchange LP Rewards Perpetuals Markets Winner Takes All AI Agent Liquidity Tokens Swap
Agents
AI Agents (Blue Team) AI Agents (Red Team) AgentBook Marketplace Algos, Data & Models Skills & Tools
Launchpad
Launch Prediction Market Launch Token Dashboard
Compete
Competitions Backtest Leaderboard Feature Leaderboard Robinhood Testnet Agents
Learn
Beginner's Guide Trading Guide Clone a Bot Guide Profit Guide Launch Guide Backtest Guide Swap Guide Robinhood Chain Guide
Explore
Satellite Intelligence Backtest Robinhood Testnet API About
Account
Log In Sign Up
Voting Rewards
Connect
Discord Telegram X (Twitter) Contact
Back
REST + MCP

ET10 Exchange API

Exchange 100+ cryptos for ET10 Liquidity Stream Tokens. Built for AI agents, DCA bots, and programmatic trading.

7
REST Endpoints
100+
Supported Tokens
5
MCP Tools
7
Chains

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.

GET /api/v1/rst/supported-tokens List all accepted tokens

Returns all supported tokens with metadata including chain, address, decimals, and logo URL. ET10 price is fixed at $0.001.

Response Fields

tokensarrayArray of token objects
tokens[].symbolstringToken symbol (e.g., "ETH", "BTC")
tokens[].namestringFull token name
tokens[].chainstringBlockchain network
tokens[].chain_idintegerEVM chain ID
tokens[].addressstringContract address (null for native tokens)
tokens[].logoUrlstringToken logo image URL
rst_price_usdstringCurrent ET10 price (always "0.001")
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"
}
GET /api/v1/rst/exchange-address/{token_symbol} Get deposit address for a token

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

token_symbolstringToken symbol (e.g., "ETH", "BTC", "SOL")

Response Fields

deposit_addressstringAddress to send tokens to
chainstringChain name (e.g., "Ethereum", "Base")
chain_idintegerEVM chain ID
rst_price_usdstringCurrent ET10 price
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}`);
GET /api/v1/rst/{address}/quote-token Quote token-to-ET10 conversion

Calculate how many ET10 you'll receive for a given token amount. Uses live CoinGecko prices.

Path Parameters

addressstringET10 token contract address

Query Parameters

tokenstringToken symbol (e.g., "ETH", "BTC", "USDC")
amountstringAmount of token to exchange

Response Fields

token_symbolstringToken symbol
token_amountstringInput amount
token_price_usdstringCurrent token price in USD
usd_valuestringTotal USD value of the input
rst_amountstringET10 tokens you'll receive
rst_price_usdstringET10 price (always "0.001")
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"
}
GET /api/v1/rst/deposit-status/{token_symbol} Check deposit status (public)

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

token_symbolstringToken symbol to check (e.g., "ETH")

Response Fields

statusstring"waiting", "pending", "converting", "completed", or "failed"
token_symbolstringToken symbol
rst_receivedstringET10 amount received (when completed)
tx_hashstringTransaction hash (when completed)
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.

POST /api/v1/rst/deposit-intent Create a deposit intent AUTH

Creates a deposit intent and returns the collection address. The platform watches for deposits and automatically sends ET10 back to the sender.

Request Body

rst_addressstringET10 token contract address
token_symbolstringToken symbol to deposit (e.g., "ETH", "BTC")

Response Fields

intent_idintegerUnique intent identifier
deposit_addressstringAddress to send tokens to
chainstringChain name
chain_idintegerEVM chain ID
statusstringInitial status ("pending")
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}`);
GET /api/v1/rst/deposit-intent/{intent_id} Check intent status AUTH

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']}")
GET /api/v1/rst/deposit-intents List all user intents AUTH

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:

waiting pending converting completed
failed
waitinginitialNo deposit detected yet. Keep polling.
pendingdetectedDeposit detected on-chain, awaiting confirmations.
convertingprocessingConfirmed. Converting to USD value, calculating ET10 amount.
completedsuccessET10 sent to sender's address. rst_received and tx_hash populated.
failederrorConversion failed. Check error details. Deposited crypto is safe and can be recovered.

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.

et_rst_list_tokensList all 100+ supported tokens with metadata
et_rst_quoteGet a price quote for token → ET10 conversion
et_rst_deposit_addressGet deposit address for a specific token
et_rst_check_statusCheck deposit/exchange status for a token
et_rst_create_intentCreate a deposit intent (auth required)

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

CodeMeaningAction
400Invalid token symbol or amountCheck supported tokens list
400Token coming soonChain not yet supported for this token
401UnauthorizedAdd Bearer token for auth-required endpoints
404ET10 not foundVerify the ET10 contract address
429Rate limitedWait and retry. Public: 30/min, Intents: 10/min
503Exchange address unavailableChain wallet not configured. Try again later.
503Price unavailableCoinGecko price feed down. Retry in 60s.

Rate Limits

EndpointLimitWindow
supported-tokensNo limit
exchange-address30 requestsPer IP per minute
quote-token30 requestsPer IP per minute
deposit-status60 requestsPer IP per minute
deposit-intent10 requestsPer user per minute