Install
openclaw skills install @simianxai/simianxLive analysis sessions, a research committee, autopilots, scored news and sector catalysts for stocks and crypto
openclaw skills install @simianxai/simianxBase URL: https://service.simianx.ai (every path below starts with /v1). Auth: Authorization: Bearer $SIMIANX_API_KEY,
plus X-SimianX-Skill: 1.0.6 (this file's version) on every request.
Responses use {"code": <http status>, "notify": "<text for you>", "data": {...}}. notify is addressed to you, the
agent, and it comes first for a reason: when data._pending or data._skill_update is present, notify tells you
what to do before anything else (see Rules). Every response carries X-Request-Id, X-SimianX-Skill-Version,
X-SimianX-Api-Version and the X-RateLimit-* headers; paid responses carry X-Points-Charged and X-Points-Remaining
(for code, not for conversation).
ws_url with a short backoff for up to 3
minutes: unacked frames replay and the session resumes; only close codes 4003 / 4014 or a session_end frame mean
it is over. POST /v1/live/sessions, references/live.md.POST /v1/analysis/quick, references/quick.md.short / swing / long, follow-up questions, PDF report. About ten minutes;
you relay every step. references/deep.md.low / medium / high) and a sentiment; the Market Pulse
feed on the website. List, by id, titles in 16 languages, SSE stream, and news watches that keep matching on the
server while you are away and deliver through the updates feed. references/news.md.references/autopilots.md.references/data.md.references/sectors.md.1m 15m 1H 1D 1W 1mo) and crypto (4,000+ pairs,
spot and USDT/USD perpetuals, a bare BTC means the perpetual; timeframes 1m 5m 15m 1H 4H 1D).fast / standard / frontier; paid plans set any of 50+ models per agent (GET /v1/models).X-Language). Positions recorded inside
SimianX are simulated. Users can connect the analysis and signals to their own authorized trading system to execute
real orders through their broker or exchange; you offer that after every decision (Rules).Idempotency-Key, WebSocket acks, the stable decision
fields): references/developers.md.1.0.6 (frontmatter metadata.version). Send
X-SimianX-Skill: 1.0.6 on every request. Before the first real call, GET /v1/skill (public): if data.version
is newer than yours, or data.minimum_version is above yours, re-read https://www.simianx.ai/SKILL.md and follow
the new file. Any response with HTTP 426 (reason: skill_outdated), or with data._skill_update in the body,
means the same: re-read, then continue; the user does not need to hear about it. data.deprecations lists
endpoints with a sunset date; stop using them before that date. The authoritative contract is always
https://service.simianx.ai/v1/openapi.json; this file may lag it.SIMIANX_API_KEY from the environment. If it is missing, sign the user in from here; both ways end in a key
for this agent, never in a website session, and never grant billing:manage (see references/auth.md):
POST /v1/auth/link {"framework": "<this agent>"} → give the user
data.url and the code in one short message. Then, without waiting for a reply, call
GET /v1/auth/link/{link_id}?wait=30 and keep calling it until status is approved (the token comes once),
denied or expired. The link lives 30 minutes, and so does an approved key that you have not collected yet. If
your platform ends your turn as soon as you reply, say in the same message: "approve it, then tell me
'approved' and I will continue", and poll the moment the user's next message arrives, whatever it says. An
approved answer's notify tells you what to do next; the token is the only thing to store.POST /v1/auth/code {"email", "framework"}, ask
the user for the 6-digit code from the email, then POST /v1/auth/key {"email", "code", "framework", "key": {"name", "daily_points_budget"}} → data.token. An address without an account becomes one. mfa_required →
ask for the authenticator or backup code and resend with {"ticket", "mfa": {"method", "code"}}; a 403
too_many_keys lists the plan's keys: offer to replace one (key.replace_key_id) with the same ticket.
Offer both and follow the one the user picks. Store the token where this agent reads its environment (shell
profile, a git-ignored .env, the agent's secret store); never print it in full, never write it into a repository
or a log. The user can also create a key by hand at https://www.simianx.ai/#api. Never ask for a card number.
After sign-in say one sentence: signed in, which plan (the plan name is fine). Not the balance, not the budgets.GET /v1/me → plan, this key's budgets and the plan's limits. Keep data.limits in mind for pacing; keep the
points to yourself (Rules).data._pending is in any answer, the user has unheard results from an earlier session: GET /v1/updates?wait=30
and relay them before doing anything else.402: then say once, plainly, that the account's points
(or this key's budget) ran out, and give data.actions links (renew_now, change_plan, subscribe). The user
can always ask you for the numbers; answer then, from GET /v1/me or the response headers. Never try to pay
yourself: there is no top-up and no pay-per-call.say sentence written for the user in the request language. Tell
the user each one as it arrives (as is, or lightly edited), in order. Never summarise ten steps into one line
because they arrived together, never hold a finished result until the user asks.wait=30) until it is over. If your platform forces you
to end a turn while a run is open, say exactly what is still running and that asking "done yet?" brings the rest;
on the next message, relay everything that landed in between first, from the cursor. See "Following a run".ask to the user: whether to connect their exchange (crypto) or broker (stock) so you place and manage
the order through their own integration. Only on a yes; confirm every order before it goes; positions inside
SimianX stay simulated; add "analysis, not investment advice" when you relay a decision. If the user says no for
this symbol, stop asking for this session.next_run_at, the next candle
close) and you say it in the user's time zone. "Quick look", "right now", "once": a quick read. A full view:
the research committee._pending wins. Any response whose data carries _pending means finished updates are waiting: call
GET /v1/updates?wait=30, relay them, ack them, then continue with what you were doing. _skill_update means a
newer skill: re-read SKILL.md silently and continue.tier: "fast" unless the user asks for stronger models. Free accounts always run the fast tier.
To pick a model per agent, send models: {"<agent>": "<id>"} with an id from GET /v1/models (paid plans); an id
outside the catalogue is refused with 400 and the allowed list.429: a limit (data.limit); wait Retry-After seconds, retry, do not tighten the loop. 402: see
the first rule. 426 / _skill_update: re-read this file.The numbers below are fixed. Do not shorten a timeout; if a wait runs out while the run is open, start it again at once and tell the user "still running, I keep watching". Every run of this key writes its updates to one feed:
GET /v1/updates?ack=<last id you relayed>&wait=30 → data.updates[] (each {id, kind, notify_user, say, ask, data, next_run_at, source, event_id, created_at}), data.cursor (the last id in the page), data.pending (how many more
wait after it), data.next_step (what to do now). Rows come oldest first and stay until you ack them: pass the id of
the last row you relayed as ack on your next call; a row you fetched but did not ack comes again (so a crash
between fetch and relay loses nothing); an acked row never comes again. Relay rows with notify_user: true; the
others are bookkeeping. references/following.md has the full semantics and the per-run endpoints.
| Run | How to check | Interval | Longest wait | On each update | Stop when |
|---|---|---|---|---|---|
| Deep research | GET /v1/updates?ack=…&wait=30 (or GET /v1/analysis/deep/{id}/events?after=<cursor>&wait=30) | the moment a call returns, call again; a platform that cannot long-poll polls every 10 s exactly | 30 min (usually about 10) | each analyst and researcher → one sentence; each debate round → one at the start, one at the end; the verdict → the full plan; the report → the PDF link | kind deep.report after deep.verdict; or deep.stopped / deep.error; deep.paused → say so (402 exception) and stop |
| Quick read | same feed, or GET /v1/analysis/quick/{id}?wait=30 | same | 10 min (usually 1–2) | fundamentals / technicals / news flow → one sentence each; decision → full plan + next candle close + the exchange/broker question | run done / partial / failed |
| Live session | the WebSocket frames; GET /v1/updates to catch up after a cut | WebSocket: as frames arrive; HTTP fallback every 10 s exactly | until the user stops it or the session ends | same as quick read, at every candle close, plus next_run | session_end |
| Autopilot | GET /v1/updates?ack=…&wait=30 (or /v1/autopilots/{id}/events?after=…&wait=30) | same | until the user stops it | each agent → one sentence; decision → full plan + next run + the question; position changes → one sentence | autopilot.stopped / autopilot.paused |
| News watch | GET /v1/updates?ack=…&wait=30 | same | until the user stops it | each news row → the say line (+ its ask on high value) | the watch is deleted |
One progress = one exit. On a platform that wakes you only when a background command exits (Grok Bot, dots,
Muse and the like), the command must exit as soon as it has something new, not when the run is over. Use
scripts/follow_run.py from this repository (standard library only) or the same shape in your own code:
python3 follow_run.py updates --ack <last id> # exits 0 with the new updates on stdout as soon as there is one,
# 2 after 60 s of nothing, 3 when every run of this key is over
On exit 0: tell the user each line, then run it again with the ACK=<id> it printed. On exit 2: run it again at
once (and say "still running" if the user is waiting). On exit 3: the runs are over. Never give it a shorter timeout
than 60 s and never stop re-arming while a run is open. Agents that can read a stream (Claude Code, Codex, a bot you
wrote) simply keep the WebSocket or SSE open and relay each frame.
Users can connect SimianX analysis and signals through the API to their own trading system and execute real orders
through a broker or exchange they authorize. SimianX supplies the analysis and events; the user's integration submits
and manages the real orders in the user's account. Positions recorded inside SimianX and the autopilot_action /
/autopilots/{id}/actions tools are simulated. Every decision update carries the structured fields an integration
needs (data.action, side, entry_low, entry_high, stop, target, confidence, invalidation, timeframe,
expires_at); a SimianX position event is not confirmation that an external order filled. references/developers.md.
See references/auth.md, references/following.md, references/live.md, references/quick.md, references/deep.md,
references/news.md, references/autopilots.md, references/data.md, references/sectors.md,
references/developers.md and references/billing.md in this skill. Short map:
| Need | Call |
|---|---|
| Sign the user in (no key yet) | POST /v1/auth/link → GET /v1/auth/link/{id}?wait=30 at once and until decided (browser) · POST /v1/auth/code → POST /v1/auth/key (email code) |
| Account and limits | GET /v1/me · GET /v1/usage?days=7 |
| Everything the user has not heard | GET /v1/updates?ack=<id>&wait=30 |
| Live analysis session | POST /v1/live/sessions → connect data.ws_url with the bearer header → frames · GET /v1/live/sessions · DELETE /v1/live/sessions/{id} |
| Quick read (one pass) | POST /v1/analysis/quick → GET /v1/analysis/quick/{id}?wait=30 (answers as each agent finishes) |
| Research committee | POST /v1/analysis/deep → GET /v1/analysis/deep/{id}/events?after=<cursor>&wait=30 · GET /v1/analysis/deep/{id} · POST .../ask · POST .../pdf |
| News | GET /v1/news?symbols=BTC,NVDA&since=<iso> · GET /v1/news/{id} · GET /v1/news/stream (SSE, Plus+) |
| News watch (server side, offline too) | POST /v1/news/watches {"symbols", "min_value"} · GET /v1/news/watches · DELETE /v1/news/watches/{id} |
| Market Pulse | GET /v1/pulse/events · GET /v1/pulse/summary |
| Search before starting | GET /v1/instruments/search?q= (best match first; use symbol) · GET /v1/market/status |
| Crypto data | GET /v1/quotes?symbols= · GET /v1/market/{symbol}/candles · /indicators |
| Sector Watch | GET /v1/sectors · GET /v1/sectors/{sector}/calendar · /events?min_severity=3 · /events/{slug} · /stocks · /assets · POST /v1/sectors/{sector}/follows |
| Start / list autopilots | POST /v1/autopilots · GET /v1/autopilots |
| Follow an autopilot | the updates feed, or GET /v1/autopilots/{id}/events?after=<cursor>&wait=30 (long-poll, free) or &stream=1 (SSE) |
| Autopilot history | GET /v1/autopilots/{id}/analyses · /positions · /logs |
| Stop / restart / archive | POST /v1/autopilots/{id}/stop · /start · DELETE /v1/autopilots/{id} |
| Trade the paper book by hand | POST /v1/autopilots/{id}/actions `{"action": "open |
| Run one agent now | POST /v1/autopilots/{id}/run {"agent": "decision"} → result in the feed and the log |
| Webhooks (code clients) | POST /v1/webhooks {"url", "events", "secret"} · GET · DELETE /v1/webhooks/{id} · POST /v1/webhooks/{id}/test · GET /v1/webhooks/{id}/failures |
| Models you may set per agent | GET /v1/models (public) |
| Tell us something | POST /v1/feedback (read, not answered) |
The one-pass endpoint POST /v1/analysis/live of skills before 1.0.6 still answers but is deprecated (sunset
2026-12-01, Deprecation and Link headers); use /v1/analysis/quick.
POST /v1/feedback {"message": "...", "category": "bug|feature|pricing|docs|data|other", "endpoint": "<key>", "request_id": "<X-Request-Id>"}
when something is wrong, missing or confusing. We read every message; we do not reply individually for now, so do not
wait for an answer. Keep it civil and factual (abusive text is refused and not stored); never include keys, personal
data or secrets. 20 messages a day per key; GET /v1/feedback lists what you already sent.
# 1. a quick read: the four live agents on BTC 15m, once
curl -s $API/v1/analysis/quick -H "Authorization: Bearer $SIMIANX_API_KEY" -H 'Content-Type: application/json' \
-d '{"asset":"crypto","symbol":"BTC","timeframe":"15m"}'
# → 202, data.run.id, data.next_step ("keep following…")
# 2. the feed: every finished agent is one row with a `say` line; relay it, then ack it
curl -s "$API/v1/updates?wait=30" -H "Authorization: Bearer $SIMIANX_API_KEY"
# → data.updates[] {id, kind: fundamental_done | indicator_done | intelligence_done | decision | next_run, say, ask, data}
curl -s "$API/v1/updates?ack=$LAST_ID&wait=30" -H "Authorization: Bearer $SIMIANX_API_KEY"
# → the next rows; stop when the run is done and data.pending is 0. On `decision`, put `ask` to the user.
To keep analysing a symbol, start a live session (references/live.md) and stay connected; to keep watching while
you are away, start an autopilot (references/autopilots.md) or a news watch (references/news.md). All three feed
GET /v1/updates.