Tool Reference¶
Every tool requires a credential; the Scope column shows what a credential needs beyond being valid.
The catalogue changes as tools are added and retired. tools/list is authoritative — if something here is missing from it, the tool is gone.
Parameters marked ? are optional.
Market data¶
| Tool | Answers | Parameters |
|---|---|---|
e8_trade_asset_list |
What can I trade? | search?, assetClass? (forex, stocks, futures, cfd), limit? (max 100, default 50) |
e8_trade_asset_get |
What's the price and spec for one symbol? | symbol |
e8_trade_history |
Give me the candles. | symbol, resolution?, from?, to?, countBack? (max 500) |
e8_trade_chart |
Render a chart image. | symbol, period?, range? (1h, 6h, 24h, 7d, 30d), from?, to? |
Resolutions are 1, 5, 15, 60, 240, D, W, M — minutes, then day, week, month. Default is 60.
e8_trade_asset_get returns more than a price. isMarketOpen tells you whether the symbol is tradeable right now, nextOpenLabel says when it reopens, pricePrecision gives you the right number of decimals, and minSize / tickSize tell you what order sizes are legal. Any automation that places orders should read these rather than assume.
e8_trade_history takes either from/to (Unix seconds) or countBack, not both. countBack caps at 500 candles per call — for longer histories, page backwards with to.
Symbol namespaces¶
Symbols come back in raw form, and there are two families:
| Form | Venue | Example |
|---|---|---|
| Unprefixed | Centroid (CEX) | EURUSD, BTCUSD, XAUUSD |
HL_PERP_…, HL_SPOT_…, HL_HIP3_… |
Hyperliquid (DEX) | HL_PERP_BTC, HL_HIP3_TSLA |
The same underlying can appear in both families, as two separate tradeable symbols with their own prices and specs. HL_HIP3_… in particular is a synthetic market covering equities, indices, and commodities.
Match on what e8_trade_asset_list returns; never construct a ticker. Guessing TSLA when the symbol is HL_HIP3_TSLA produces a "symbol not found" that looks like an outage. And do not assume a symbol you used last month still exists in the same form — the universe changes.
The assetClass filter (forex, stocks, futures, cfd) is a separate taxonomy from these namespaces and does not map onto them one-to-one. If you want a specific universe, filter the returned list yourself rather than trusting the filter to mean what you assume.
Never quote an instrument count from memory — including any number you find in older documentation. Call the tool and report what came back.
News¶
| Tool | Answers | Parameters |
|---|---|---|
e8_news |
What happened? | limit? (max 50, default 20), timeWindow? (1H, 6H, 24H, 7D, ALL; default 7D), categoryId?, categoryName? |
e8_news_ticker |
Headlines only. | limit? (max 50, default 20) |
e8_news_categories |
What categories exist? | none |
categoryName matches case-insensitively on partial strings, so "forex" works without knowing the exact label.
Your accounts, positions, and orders¶
Scope: read:trade
| Tool | Answers | Parameters |
|---|---|---|
e8_accounts_list |
Which accounts do I have? | none |
e8_account_info |
Balance, equity, margin. | accountId? |
e8_positions_list |
What's open right now? | accountId? |
e8_orders_list |
Order history and pending orders. | accountId?, status?, symbol?, page?, pageSize? (max 100, default 50) |
e8_order_get |
One order in detail. | orderId |
status accepts PENDING, VALIDATED, MATCHING, FILLED, SETTLED, REJECTED, FAILED.
The accountId rule¶
Read this before writing any automation. accountId is optional only if you have exactly one active account. With two or more — a Demo and a Live, say — omitting it makes the call fail, not pick one.
Resolve it once at the start of your script and pass it everywhere:
Hard-coding the id is fine and safer, because it means a script written for Demo cannot silently start acting on Live.
Risk and performance¶
Scope: read:trade
| Tool | Answers | Parameters |
|---|---|---|
e8_account_limits |
How close am I to breaching? | accountId? |
e8_analytics_user |
How do I trade, across all accounts? | none |
e8_analytics_account |
Deep analytics for one account. | accountId, sections? |
e8_milestones_list |
What rewards exist? | none |
e8_milestone_progress |
How far along am I? | accountId? |
e8_account_limits¶
The most important tool on this page for anyone automating. Any loop that can place an order should call it first and stop if the room is thin; any monitoring loop is built on it. Recipes 2, 5, and 6 all gate on this single call.
The response:
{
"accountId": "...", "status": "ACTIVE",
"balance": 100000, "equity": 99120, "initialBalance": 100000,
"dailyStartBalance": 99800, "marginUsed": 2400, "freeMargin": 96720,
"pnl": { "today": -680, "total": -880, "realized": -200, "unrealized": -680 },
"limits": { "maxDailyLossPct": 5, "maxTotalLossPct": 10,
"profitTargetPct": 8, "marginStopOutPct": 50 },
"used": { "dailyDrawdownPct": 0.68, "totalDrawdownPct": 0.88,
"marginLevelPct": 4130 },
"room": { "dailyPct": 4.32, "totalPct": 9.12,
"profitPct": 8.88, "profitTargetAmount": 8000 },
"breached": { "daily": false, "total": false, "margin": false },
"positionsCount": 2
}
Read room carefully. room.dailyPct is percentage points of drawdown still available — maxDailyLossPct minus used.dailyDrawdownPct. In the example above, the limit is 5%, 0.68% is used, so 4.32 percentage points remain. It is not "percent of the limit remaining" — that would be 86%.
Gate your automations on the units the tool actually returns. A threshold of room.dailyPct < 2 means "within two percentage points of the daily limit", which is a sensible stand-down trigger. A threshold of room.dailyPct < 30 would never fire on a 5% limit.
breached.daily / .total / .margin are booleans — if any is true, stop trading and investigate rather than computing anything further. room.* fields are null when the corresponding limit is not configured, so check for null before comparing.
e8_analytics_account¶
The full payload runs 10–15 KB, which is a lot of context to hand an agent for one question. sections trims it to what you asked for, and downsamples long chart series to roughly 250 points:
Available sections include what_if, symbol_pnl, hold_times, consistency, recovery_speed, revenge_trading, behavioral_tilt, strategy, sl_tp_discipline, position_sizing, and the chart_data.* series (equity_curve, drawdown, daily_pnl, trade_pnl_values, rolling_winrate, hourly_performance, weekday_performance).
Unknown section names are ignored silently — if a response is missing something you asked for, check the spelling.
Note that this tool takes accountId as required, unlike its neighbours.
Dashboards¶
| Tool | Answers | Parameters |
|---|---|---|
e8_dashboard_get |
My dashboard layout. | none |
e8_dashboard_suggest |
Suggest widgets. | focus? (trading, analysis, monitoring, news, balanced), symbols?, maxWidgets? (max 12, default 6) |
Execution¶
Scope: trade:execute
| Tool | Does | Parameters |
|---|---|---|
e8_order_place |
Places an order. | see below |
e8_order_cancel |
Cancels a resting order. | orderId (must be PENDING or VALIDATED) |
e8_position_close |
Closes one position. | accountId?, symbol, positionId?, slippage? |
e8_positions_close_all |
Closes everything. | accountId?, slippage? |
e8_order_place¶
| Parameter | Meaning |
|---|---|
symbol |
e.g. EURUSD |
side |
buy or sell |
type |
market (default), limit, or stop |
amount |
Size in lots, not units |
limitPrice |
Required for limit and stop. The limit price, or the stop trigger |
stopLoss |
Attaches a protective stop after fill |
takeProfit |
Attaches a protective limit after fill |
slAmount |
Size the stop leg below amount for a partial close |
tpAmount |
Size the take-profit leg below amount for a partial close |
slippage |
Max slippage in basis points (0–1000) |
clientOrderId |
Your own id, for tracking and safe retries |
accountId |
Per the accountId rule above |
This is more capable than the web order panel. Brackets are attached automatically after the parent fills, and slAmount / tpAmount let you scale out — a 1.0 lot entry with tpAmount: 0.5 takes half off at target and leaves the rest running. Both leg sizes cap at the parent amount.
amount is lots. Sending 1000 because you were thinking in units is an order a thousand times larger than you meant. Validate size in your own code before the call, not after.
Market orders are refused when the symbol is closed, and the error names the next open time. Check isMarketOpen from e8_trade_asset_get first if you want to handle this gracefully rather than as an error.
type: "stop" may be disabled server-side depending on platform configuration. If you get an error saying stop orders are unavailable, that is why.
Closing positions¶
On a hedging account, one symbol can hold several independent tickets, so symbol alone does not identify what to close — pass positionId as well. On a netting account, or when a symbol has one ticket, symbol is enough and positionId is ignored.
e8_positions_close_all does exactly that, on the whole account, at market. It is the right kill switch for an automation that has lost the plot, and the wrong thing to call casually.
Next: Recipes puts these together, or Safety & Limits covers scopes and rate budgeting.