| query | Yes | The validated input echoed back, i.e. the signal_id you asked for. | |
| status | Yes | Live status at call time. ACTIVE = published AND entry window still open, STALE = entry window closed (the hold horizon may still run), INVALIDATED = an invalidation condition triggered. Only ACTIVE is a current new-entry advice. | |
| version | No | Version of the advice this validation describes. | |
| economics | No | Estimated round-trip economics in percent of position value (1.8 = 1.8%). Taker = crossing the spread for an immediate fill; maker = a cheaper passive limit order that may never fill. Values the source cannot compute are null (e.g. for WATCH/NEUTRAL/AVOID, which have no concrete target). | |
| execution | No | Internal eligibility metadata of the UPSTREAM system — informational only, never a permission or prohibition for you. Upstream may block a candidate for its own reasons while the opportunity is perfectly publishable. | |
| signal_id | Yes | Stable id of the opportunity across versions; the input for every other call in the chain. | |
| checked_at | Yes | When we produced this answer (ISO 8601, UTC). The only ISO timestamp in the payload; every other timestamp is unix seconds. | |
| disclaimer | Yes | Our product boundary, verbatim in every paid advice response: market intelligence only, no execution, no custody, no position sizing, and opportunity_score is a heuristic rather than a calibrated win probability. | |
| spread_bps | Yes | Observed bid/ask spread in basis points; null when not measurable. A wide spread eats the net edge in economics. | |
| price_as_of | No | Unix seconds — when current_price was observed. | |
| data_quality | No | Quality of the market data behind this validation: GOOD = fresh and complete, DEGRADED = usable but partial or wide/uncertain, STALE = too old to rely on (treat the price-derived fields with caution). | |
| invalidation | No | Whether the advice's own invalidation conditions have triggered. | |
| source_as_of | Yes | Unix seconds — freshness of the upstream advice system's answer. | |
| current_price | Yes | Last observed price of the coin upstream; null when no usable price was available (then price_vs_entry_zone is UNKNOWN). | |
| next_check_after | No | Only present when status is not ACTIVE — unix seconds before which polling again is pointless (now + 1800). | |
| entry_valid_until | No | Unix seconds — end of the 30-minute new-entry window (not a position deadline; the hold horizon lives on the advice as expected_hold_until). | |
| source_disclaimer | No | Verbatim disclaimer of the upstream advice system, passed through unedited. | |
| publication_status | No | Publication state of the advice. PUBLISHED = live and current, STALE = retrievable history whose entry window closed, INVALIDATED = an invalidation condition triggered. Expired ids stay retrievable with their real status. | |
| price_vs_entry_zone | No | Where current_price sits relative to the advised entry zone: BELOW entry_zone.min, INSIDE the zone, ABOVE entry_zone.max (chasing), or UNKNOWN when there is no price or no concrete entry zone. | |
| recommended_next_call | Yes | Machine-readable next step in the chain (scan → signal → validate → evidence → check), so you can follow the workflow without documentation. null means there is explicitly nothing useful to call now; next_check_after then says when to come back. | |
| execution_blockers_changed | No | True when the upstream system's internal execution blockers differ from those published with the advice; informational only, never a permission. | |
| entry_window_remaining_seconds | No | Seconds left in that entry window; 0 or below means it closed and status is no longer ACTIVE. | |