Active trading signals for the current user (with Skill Overlay applied), in customer-facing shape: coordinates (entry/target/stop), decision (ENTER/WAIT/SKIP), action_gate posture (GO/WATCH/HOLD — a stance, not an order command), progress, MTF verdict, and a plain-language summary_ko line. risk_reward_ratio is computed on the DISPLAYED coordinates (after overlay). Signals are retained rather than cut when they age (turn-retention policy) — read freshness_state (open|aged) / age_bars / freshness_sec before treating an old PENDING row as current. Filtered by symbols / min_progress / action_gate. Before placing any order through any execution tool, check the intent with decker.validate_intent.
Parameters5
symbols
array
optional
Symbol filter (e.g. ['BTCUSDT','ETHUSDT']). Omit for all.
min_progress
number
optional
Minimum progress_pct (0-100).
action_gate
string
optional
Engine action gate filter (3-layer grammar: gate = transition posture, not an order command). Rows where the engine emitted no gate for this bar (effective_action_gate null, e.g. KRX daily) are excluded when this filter is set.
timeframe
string
optional
Signal horizon filter (30m=scalp, 1h=swing, 4h/8h/1d=position). The same symbol can hold OPPOSITE directions on different horizons — omit to get the latest active signal regardless of horizon (its timeframe field says which one you got).
limit
integer
optional
Raw schema
{
"type": "object",
"properties": {
"symbols": {
"type": "array",
"items": {
"type": "string"
},
"description": "Symbol filter (e.g. ['BTCUSDT','ETHUSDT']). Omit for all."
},
"min_progress": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Minimum progress_pct (0-100)."
},
"action_gate": {
"type": "string",
"enum": [
"GO",
"WATCH",
"HOLD"
],
"description": "Engine action gate filter (3-layer grammar: gate = transition posture, not an order command). Rows where the engine emitted no gate for this bar (effective_action_gate null, e.g. KRX daily) are excluded when this filter is set."
},
"timeframe": {
"type": "string",
"enum": [
"30m",
"1h",
"4h",
"8h",
"1d"
],
"description": "Signal horizon filter (30m=scalp, 1h=swing, 4h/8h/1d=position). The same symbol can hold OPPOSITE directions on different horizons — omit to get the latest active signal regardless of horizon (its timeframe field says which one you got)."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 20
}
}
}
decker.get_reading
AI-synthesized market reading for a symbol/timeframe, in customer-facing language: current state description, directional bias scores, bidirectional break targets, MTF verdict per timeframe, and an execution hint (stance + long/short setups). Engine-native raw fields are NOT exposed here — use the REST raw contract (GET /public/reading) or decker.get_market_state for those.
The engine's VIEW for a symbol — the same composed card the daily briefing sends (single composer, verbatim): overall verdict, big/main timeframe alignment, the current game narrative in plain language, coordinates (baseline ref_price / target / invalidation), 'at this price, this view', and recent self-scoring verdicts (receipts). layer=STATE_VIEW: a market-state reading, NOT a trade instruction. Prefer this over get_market_state when you want the interpreted view instead of raw engine fields. Before placing any order through any execution tool, check the intent with decker.validate_intent.
Parameters2
symbol
string
required
e.g. BTCUSDT, XYZ_GOLDUSD (crypto + HL TradFi synthetics; KRX daily lineage not yet covered by view v1)
tf
string
optional
Optional view timeframe — the grounded narrative is composed on this TF's bar (e.g. '1h' when the user asks about the 1-hour picture). Omit for the engine's default action TF (usually 4h, same as the daily briefing card).
Raw schema
{
"type": "object",
"properties": {
"symbol": {
"type": "string",
"description": "e.g. BTCUSDT, XYZ_GOLDUSD (crypto + HL TradFi synthetics; KRX daily lineage not yet covered by view v1)"
},
"tf": {
"type": "string",
"enum": [
"30m",
"1h",
"4h",
"8h",
"1d"
],
"description": "Optional view timeframe — the grounded narrative is composed on this TF's bar (e.g. '1h' when the user asks about the 1-hour picture). Omit for the engine's default action TF (usually 4h, same as the daily briefing card)."
}
},
"required": [
"symbol"
]
}
decker.get_market_state
Market State v0 — current engine structural state for a symbol/timeframe (latest evaluated bar, persisted engine emit read as-is, zero recompute). DOMAIN FRAME (why this engine exists): the market is read as a TARGET GAME — every coordinate comes from a *verified anchor* (a past level where a triggered move actually succeeded). The `game` block tells you the context that matters: game.status = forming_target (new anchor set, awaiting test) | testing_target (price is testing whether the declared target holds) | direction_resolved (game decided, price traveling); game.target = WHO is being judged (anchor id/phase/band); game.progress_dest = where price goes if the move proceeds (the opposing verified anchor to conquer); game.reverse_dest = where it goes if the move fails (the opposite house — also the stop logic's home); game.why_gate = full gate derivation chain; game.zt_regime = output canonicality (restored = deterministic delta lineage). action_gate alone (GO/WATCH/HOLD) is only a posture — the game context is the information. RAW CONTRACT: fields are engine-native vocabulary (c_state, hold_reason, R_* risk enums …), NOT customer-facing prose — for a human-language view use decker.get_view (with tf) or decker.get_reading. layer=STATE: this is a market-state reading, NOT a trade instruction. Absent fields are null (engine did not emit that axis — no filling). Before placing any order through any execution tool, check the intent with decker.validate_intent.
Market State v0 — per-bar state timeline for a symbol/timeframe (same schema as decker.get_market_state, except each item carries a SLIM `game` tag {status, target_id, zt_regime, provenance} instead of the full game block — read status transitions across bars to see how the target game unfolded (forming → testing → resolved/failed); ascending by bar_ts). Bars the engine did not emit are simply absent (honest gaps, no filling).
Parameters4
symbol
string
required
e.g. BTCUSDT
timeframe
string
required
since
string
optional
ISO8601 lower bound on bar_ts (exclusive). Optional.
Trading skill catalog + currently active overlay for this user. Returns 3 base skills (conservative_v0/standard_v0/aggressive_v0) and the user's selected one.
Parameters
No parameters.
Raw schema
{
"type": "object",
"properties": {}
}
decker.set_skill_overlay
Change active trading skill overlay for this user. Immediately affects all subsequent get_signals calls and downstream channels.
Pre-trade gate check for a proposed order intent. Call this BEFORE placing any order through any execution tool (e.g. a broker MCP's review→place flow). Checks the intent (symbol + side) against Decker's deterministic market state: engine action_gate (GO/WATCH/HOLD — a transition posture, not an order command), current structural state, and the active signal's direction / invalidation (stop) coordinates. Returns a stance reading, NOT an approval or rejection: the vocabulary is the engine gate as-is plus a mechanical side_alignment (aligned/opposed vs the active signal's direction). covered=false means the engine does not emit state for this symbol — treat as unknown, not as HOLD. The order decision and responsibility remain with the calling agent/user. Every check is persisted to an auditable decision ledger (check_id).
Parameters4
symbol
string
required
e.g. BTCUSDT, SILVER, 테슬라 — aliases resolve to the engine symbol (XYZ_SILVERUSD, XYZ_TSLAUSD, …).
side
string
required
Proposed order direction (buy/long = +, sell/short = -).
order_type
string
optional
Optional, informational (market/limit/…) — recorded in the ledger, does not change the state verdict.
timeframe
string
optional
Gate horizon. Omit = the active signal's timeframe if one exists, else the engine's default action TF (4h).
Raw schema
{
"type": "object",
"properties": {
"symbol": {
"type": "string",
"description": "e.g. BTCUSDT, SILVER, 테슬라 — aliases resolve to the engine symbol (XYZ_SILVERUSD, XYZ_TSLAUSD, …)."
},
"side": {
"type": "string",
"enum": [
"buy",
"long",
"sell",
"short"
],
"description": "Proposed order direction (buy/long = +, sell/short = -)."
},
"order_type": {
"type": "string",
"description": "Optional, informational (market/limit/…) — recorded in the ledger, does not change the state verdict."
},
"timeframe": {
"type": "string",
"enum": [
"30m",
"1h",
"4h",
"8h",
"1d"
],
"description": "Gate horizon. Omit = the active signal's timeframe if one exists, else the engine's default action TF (4h)."
}
},
"required": [
"symbol",
"side"
]
}
▶️ Play — non-custodial execution (16s) · Click Order · wallet-sign · custody 0. Decker relays your signature only (revocable agent wallet, EIP-712). For information only — not investment advice.
Every morning (08:00 KST): the engine's view per symbol — baseline, what winning and losing look like, and a pick you can answer. Evening: the same view scored against what actually happened — hits and misses alike, on the record.We stamp our wrong calls too.
▶️ Play — KRX (16s) · Same deterministic engine on KOSPI + KOSDAQ. Portfolio states — ADD / HOLD / REDUCE / EXIT, not buy/sell. Daily closing-bell checkup at 16:30 KST · @krxdeckerbot.
Three things that make it different
1. progress_pct — every signal has a lifecycle.
A signal at 25% progress is a different trade than the same signal at 80%. Most tools just say "BUY"; Decker tells you where in the move you are.
code
Entry Target
0%──────────33%──────────50%──────────67%──────────83%────────100%
Wait Entry Active Late TP Final TP Exit
2. GO / WATCH / HOLD — three gates, not binary.
Gate
Meaning
GO
Structure confirmed — entry conditions met
WATCH
Signal forming — monitor, no entry yet
HOLD
Active position — no new entry signal
WATCH is the gate most tools skip. It's why users enter too early.
Beta (now): all authenticated users get PRO for free via BETA_TIER_OVERRIDE=PRO. No payment required.
Web sign-up and Telegram bot are always free for the basics.
For developers
Building a bot, app, or agent on top of Decker? Everything you need — REST endpoints, MCP server (Claude / Cursor / Codex), Python SDK, OpenClaw skill, self-host — lives in one place:
# 60-second smoke test (no auth needed)
curl https://api.decker-ai.com/api/v1/public/demo
bash
# With an API key (decker-ai.com → Settings → API Keys, or Telegram /apikey)
curl "https://api.decker-ai.com/api/v1/public/signals/BTCUSDT/latest?timeframe=1h" \
-H "X-API-Key: dk_live_xxx"
The demo returns the composed view — the same card our daily briefing sends:
json
{"layer":"STATE_VIEW","symbol":"BTCUSDT","ref_price":63650.0,"lines":["■ BTC — 층간 힘겨루기: 주 판 아래쪽 · 지금 판 위쪽","…"],"wait_target":"...","invalidation":"...","verdict_recent":[{"briefing_date":"2026-07-05","slot":"morning","verdict":"hit"}],"provenance":{"composer":"briefing_story.compose_card"}}
Add to Claude Desktop / Cursor (MCP): guided 2-minute setup with per-client config → decker-ai.com/mcp.
Cursor (~/.cursor/mcp.json) takes a remote server directly:
Claude Desktop / Codex reach it through the mcp-remote bridge (needs Node/npx) — see decker-ai.com/mcp or DEVELOPER_README.md (endpoints · auth · rate limits · MCP 7 tools · SDK · OpenClaw · self-host).
Running a multi-agent crew (TradingAgents / LangGraph / AutoGen)? Give your analysts one deterministic market-state instrument — with receipts — instead of re-deriving structure per prompt: → docs/integrations/multi-agent-frameworks.md
How the engine works (one diagram)
code
Raw OHLCV candles
↓ Sequence Labeler → every candle gets a role (anchor / test / signal)
↓ State Machine → C_SET → B_FORMING → B_SET → A_FORMING → W_PENDING
↓ Operation Gate → GO · WATCH · HOLD
↓ RULES Engine → 9-layer YAML rulebook → strategy + ranked choices
↓ AI Consultation → LLM translates structural state → plain language
↓
"67% progress. B-leg confirmed. Recommended: 30% partial TP or hold to target."
No price prediction. No black box. Every output traces to a formal structural cause.
We don't publish a headline win rate. Backtest numbers without method
and sample size are marketing, not evidence — and easy to cherry-pick.
What we stand on instead:
Deterministic & reproducible. Same input → same output, always.
The rules path has zero LLM in it, so a signal is not a model's opinion —
it's a formal structural verdict you can re-derive.
Auditable. Every read carries its provenance (composer + the versioned
rulebook contract) and traces back to the exact engine emit. The full
RULES.yaml is open, so you can re-derive any verdict yourself.
Scored in public, daily. The morning briefing's view is graded against
what actually happened that evening — hits and misses alike, on the record.
→ decker-ai.com/briefing · a GitHub Action
stamps the daily scorecard straight into this repo: TRACK_RECORD.md
This repository is the public hub for Decker AI — SDK, samples, rulebook, architecture docs, OpenClaw skill packages.
Production application code runs in a private monorepo. All listed endpoints, channels, and the web app are live.
Built by gigshow (Dohyung Kim · 김도형) — founder. Open to investor / partnership conversations.