---
title: "Get Action Card"
method: GET
path: "/api/signals/action"
tags: ["Trade Signals"]
---

# Get Action Card

`GET /api/signals/action`

## Request

- Base URL: `https://api.zerogex.io` (the document declares no server; this is the origin it was published from)
- URL: `https://api.zerogex.io/api/signals/action`
- Auth: HTTP bearer

Latest **Action Card** — single, decisive trade instruction.

The Playbook Engine fuses Market Posture (the MSI regime), advanced
+ basic signals, and live structural levels into one Card per cycle.
A Card is either a specific trade (`BUY_PUT_DEBIT`, `SELL_CALL_SPREAD`,
`BUY_IRON_CONDOR`, etc.), a position-management directive, or
`STAND_DOWN` when no pattern matches current structure.

`STAND_DOWN` is an **earned** outcome, not equivocation — it ships
with a `near_misses[]` list naming the closest patterns and the
specific trigger conditions they failed.

Outside the regular session (09:30 ET to the close) the answer is always
`STAND_DOWN` with rationale "Market closed", empty `near_misses`, and
`context.session = "closed"`: no pattern is evaluated on a pre-market or
after-hours print.

**Params:** `underlying` (default `SPY`).
Returns 404 when no signal_score row exists for the symbol yet.

**Returns:** see `docs/playbook_catalog.md` §2 for the full schema.
Trade Card example:
```json
{
  "underlying": "SPY",
  "timestamp": "2026-05-01T18:42:13Z",
  "action": "SELL_CALL_SPREAD",
  "pattern": "call_wall_fade",
  "tier": "0DTE",
  "direction": "bearish",
  "confidence": 0.68,
  "size_multiplier": 0.6,
  "max_hold_minutes": 90,
  "legs": [
    {"expiry": "2026-05-01", "strike": 678.0, "right": "C", "side": "SELL", "qty": 1},
    {"expiry": "2026-05-01", "strike": 683.0, "right": "C", "side": "BUY",  "qty": 1}
  ],
  "entry":  {"ref_price": 678.40, "trigger": "at_touch"},
  "target": {"ref_price": 675.00, "kind": "level", "level_name": "max_pain"},
  "stop":   {"ref_price": 680.03, "kind": "premium_pct", "level_name": "call_wall_break"},
  "rationale": "Price $678.40 pinned at call wall $678.00, net GEX $7.1B, confirmed by trap_detection → call credit spread at the wall.",
  "context": {"...regime, msi, levels, signals_aligned..."},
  "alternatives_considered": []
}
```

STAND_DOWN example:
```json
{
  "underlying": "SPY",
  "timestamp": "...",
  "action": "STAND_DOWN",
  "pattern": "stand_down",
  "tier": "n/a",
  "direction": "non_directional",
  "confidence": 0.0,
  "rationale": "No tradable structure. Closest patterns: call_wall_fade.",
  "near_misses": [
    {"pattern": "call_wall_fade",
     "missing": ["price 0.45% from call_wall (needs <= 0.20%)"]}
  ],
  "context": {"msi": 32.5, "regime": "chop_range"}
}
```

**Notes.** The Card is computed on demand from the latest persisted
signal state and persisted when it is a trade. A pattern issues one Card
per idea: while its last Card on the symbol is inside its hold window it
stays quiet. Each pattern must also clear the entry bar its graded record
on the symbol has earned (`track_record` in `context`); a pattern that
has been losing there needs far more confidence or is paused.

## Query parameters

- `underlying` string

## Response `200`

Successful Response

- unknown

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/zerogex/apis/zerogex-api.md) · [All operations](https://skmtc.dev/zerogex/apis/zerogex-api/llms.txt) · [OpenAPI document](https://skmtc.dev/zerogex/apis/zerogex-api/revisions/753b26bf0592?raw)
