Skip to content

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:

e8_accounts_list  →  pick the account you mean  →  reuse its id

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 availablemaxDailyLossPct 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:

{ "accountId": "...", "sections": ["consistency", "chart_data.equity_curve"] }

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.