{"openapi":"3.1.0","info":{"title":"Synapse API","version":"1.0.0","summary":"The engine's calls and the reasoning behind them, as events.","description":"Synapse publishes decisions, not market data. Every call carries the reasoning behind it, and every stand-down carries the gate that said no and why.\n\nPayloads never include quotes, chains, bars, greeks or GEX profiles, and never include sizing, fills or account data. Every subscriber receives the identical payload at the identical moment.\n\nOrder intents describe a trade as a structure plus a pricing rule. Your own client prices it against your own broker's quotes and places it with your own keys. Synapse never holds broker credentials.\n\nThe API, webhooks and the MCP server are part of the Desk plan. Make a key on the API page (synapseengine.ai/signal/api) and send it as `Authorization: Bearer <key>`. A key works while its Desk plan is active, up to 120 requests a minute and 3 open streams.\n\nEverything marked live is served today. Event types marked planned are the roadmap and are not delivered yet.\n\nDesign: docs/synapse_api_design.md."},"servers":[{"url":"https://synapseengine.ai/api/v1","description":"Production. Desk API key required."}],"security":[{"apiKey":[]}],"tags":[{"name":"Stream","description":"Live events over server-sent events, plus replay to fill gaps."},{"name":"Calls","description":"Every call the engine made, blocked or let expire, with its reasoning trace."},{"name":"Sessions","description":"Per-day state of each book and of the signal stack."},{"name":"Webhooks","description":"Register HTTPS endpoints that receive signed event deliveries."},{"name":"Studies","description":"The member desk's fourteen studies as data: the engine call and its notes, the spread finder, the closing imbalance, the projected close, GEX, order flow, value area, voids, expected move, key levels, the chop meter and the event clock. Derived reads and SPX levels only."},{"name":"MCP","description":"The same reads as Model Context Protocol tools, for Claude and other AI agents."}],"paths":{"/stream":{"get":{"operationId":"streamEvents","tags":["Stream"],"summary":"Subscribe to live events","description":"Server-sent events for today's session. Each message's `id` is the event id. Reconnect with `Last-Event-ID` to resume without gaps; each connection closes after about a minute and EventSource clients reconnect on their own. A comment ping arrives every 15 seconds. At most 3 open streams per key. `emitted_ts` minus `decision_ts` is the engine-side latency; compare `emitted_ts` to your clock for transport latency.","x-status":"live","parameters":[{"$ref":"#/components/parameters/LastEventId"},{"$ref":"#/components/parameters/BooksFilter"},{"name":"types","in":"query","required":false,"description":"Only deliver these event types. Default: all.","style":"form","explode":false,"schema":{"type":"array","items":{"$ref":"#/components/schemas/EventType"}}}],"responses":{"200":{"description":"An open event stream.","content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/Event"},"example":"retry: 3000\n: session 2026-09-25, resuming after seq 0\n\nid: evt_2026-09-25_000002\nevent: call.fired\ndata: {\"id\":\"evt_2026-09-25_000002\",\"seq\":2,\"schema\":\"v1\",\"type\":\"call.fired\",\"book\":\"peregrine\",\"session\":\"2026-09-25\",\"call_id\":\"PEREGRINE-2026-09-25-0940C\",\"decision_ts\":\"2026-09-25T13:41:07.214Z\",\"emitted_ts\":\"2026-09-25T13:41:07.214Z\",\"data\":{\"side\":\"call\",\"strike_spx\":7690,\"first_trend_ts\":\"2026-09-25T13:40:00.000Z\",\"structure\":\"long_option\",\"strike_relation\":\"1_itm\",\"entry_window\":{\"opens\":\"2026-09-25T13:41:00.000Z\",\"closes\":\"2026-09-25T13:42:00.000Z\"},\"exit_rule\":{\"kind\":\"time\",\"at_et\":\"15:58\"},\"order_intent\":{\"underlying\":\"SPX\",\"roots\":[\"SPXW\",\"XSP\"],\"expiry\":\"0DTE\",\"legs\":[{\"right\":\"C\",\"strike_relation\":\"1_itm\",\"ratio\":1,\"action\":\"BUY_TO_OPEN\"}],\"entry_window\":{\"opens\":\"2026-09-25T13:41:00.000Z\",\"closes\":\"2026-09-25T13:42:00.000Z\"},\"pricing_rule\":null,\"exit_rule\":{\"kind\":\"time\",\"at_et\":\"15:58\"},\"cancel_if\":[\"window_closed\"]}}}\n\n: ping\n"}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/events":{"get":{"operationId":"listEvents","tags":["Stream"],"summary":"Replay a session's events","description":"Every event after a sequence number, in order. Use it when `seq` on the stream skips a number, or to rebuild a day from scratch.","x-status":"live","parameters":[{"name":"session","in":"query","required":true,"description":"Trading day, America/New_York.","schema":{"type":"string","format":"date"},"example":"2026-09-25"},{"name":"after_seq","in":"query","required":false,"description":"Return events with `seq` greater than this.","schema":{"type":"integer","minimum":0,"default":0}},{"$ref":"#/components/parameters/Limit"}],"responses":{"200":{"description":"A page of events.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventPage"},"example":{"session":"2026-09-25","events":[{"id":"evt_2026-09-25_000001","seq":1,"schema":"v1","type":"call.blocked","book":"phoenix","session":"2026-09-25","call_id":"PHOENIX-2026-09-25-1006P","decision_ts":"2026-09-25T14:06:00.000Z","emitted_ts":"2026-09-25T14:07:41.502Z","data":{"side":"put","strike_spx":7640,"structure":"butterfly","gate":"iv_atm # below floor #","reason":"iv_atm 13.5% below floor 15.0%; low-IV regime"}},{"id":"evt_2026-09-25_000002","seq":2,"schema":"v1","type":"call.fired","book":"peregrine","session":"2026-09-25","call_id":"PEREGRINE-2026-09-25-0940C","decision_ts":"2026-09-25T13:41:07.214Z","emitted_ts":"2026-09-25T13:41:07.214Z","data":{"side":"call","strike_spx":7690,"first_trend_ts":"2026-09-25T13:40:00.000Z","structure":"long_option","strike_relation":"1_itm","entry_window":{"opens":"2026-09-25T13:41:00.000Z","closes":"2026-09-25T13:42:00.000Z"},"exit_rule":{"kind":"time","at_et":"15:58"},"order_intent":{"underlying":"SPX","roots":["SPXW","XSP"],"expiry":"0DTE","legs":[{"right":"C","strike_relation":"1_itm","ratio":1,"action":"BUY_TO_OPEN"}],"entry_window":{"opens":"2026-09-25T13:41:00.000Z","closes":"2026-09-25T13:42:00.000Z"},"pricing_rule":null,"exit_rule":{"kind":"time","at_et":"15:58"},"cancel_if":["window_closed"]}}}],"next_seq":2}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/calls":{"get":{"operationId":"listCalls","tags":["Calls"],"summary":"List calls","description":"Calls in a date range, newest first. Blocked and expired calls are included: a stand-down is a decision too.","x-status":"live","parameters":[{"name":"from","in":"query","required":false,"schema":{"type":"string","format":"date"}},{"name":"to","in":"query","required":false,"schema":{"type":"string","format":"date"}},{"$ref":"#/components/parameters/BooksFilter"},{"name":"status","in":"query","required":false,"schema":{"$ref":"#/components/schemas/CallStatus"}},{"name":"cursor","in":"query","required":false,"description":"`next_cursor` from the previous page.","schema":{"type":"string"}},{"$ref":"#/components/parameters/Limit"}],"responses":{"200":{"description":"A page of calls.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CallPage"},"example":{"calls":[{"call_id":"PHOENIX-2026-09-25-1006P","book":"phoenix","session":"2026-09-25","status":"blocked","side":"put","strike_spx":7640,"structure":"butterfly","strike_relation":null,"first_trend_ts":null,"fired_at":null,"decided_at":"2026-09-25T14:06:00.000Z","exited_at":null,"gate":"iv_atm # below floor #","reason":"iv_atm 13.5% below floor 15.0%; low-IV regime","entry_window":null,"exit_rule":null,"order_intent":null,"event_ids":["evt_2026-09-25_000001"]},{"call_id":"PEREGRINE-2026-09-25-0940C","book":"peregrine","session":"2026-09-25","status":"fired","side":"call","strike_spx":7690,"structure":"long_option","strike_relation":"1_itm","first_trend_ts":"2026-09-25T13:40:00.000Z","fired_at":"2026-09-25T13:41:07.214Z","decided_at":"2026-09-25T13:41:07.214Z","exited_at":null,"gate":null,"reason":null,"entry_window":{"opens":"2026-09-25T13:41:00.000Z","closes":"2026-09-25T13:42:00.000Z"},"exit_rule":{"kind":"time","at_et":"15:58"},"order_intent":{"underlying":"SPX","roots":["SPXW","XSP"],"expiry":"0DTE","legs":[{"right":"C","strike_relation":"1_itm","ratio":1,"action":"BUY_TO_OPEN"}],"entry_window":{"opens":"2026-09-25T13:41:00.000Z","closes":"2026-09-25T13:42:00.000Z"},"pricing_rule":null,"exit_rule":{"kind":"time","at_et":"15:58"},"cancel_if":["window_closed"]},"event_ids":["evt_2026-09-25_000002"]}],"next_cursor":null}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/calls/{call_id}":{"get":{"operationId":"getCall","tags":["Calls"],"summary":"Get a call","x-status":"live","parameters":[{"$ref":"#/components/parameters/CallId"}],"responses":{"200":{"description":"The call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Call"},"example":{"call_id":"PEREGRINE-2026-09-25-0940C","book":"peregrine","session":"2026-09-25","status":"fired","side":"call","strike_spx":7690,"structure":"long_option","strike_relation":"1_itm","first_trend_ts":"2026-09-25T13:40:00.000Z","fired_at":"2026-09-25T13:41:07.214Z","decided_at":"2026-09-25T13:41:07.214Z","exited_at":null,"gate":null,"reason":null,"entry_window":{"opens":"2026-09-25T13:41:00.000Z","closes":"2026-09-25T13:42:00.000Z"},"exit_rule":{"kind":"time","at_et":"15:58"},"order_intent":{"underlying":"SPX","roots":["SPXW","XSP"],"expiry":"0DTE","legs":[{"right":"C","strike_relation":"1_itm","ratio":1,"action":"BUY_TO_OPEN"}],"entry_window":{"opens":"2026-09-25T13:41:00.000Z","closes":"2026-09-25T13:42:00.000Z"},"pricing_rule":null,"exit_rule":{"kind":"time","at_et":"15:58"},"cancel_if":["window_closed"]},"event_ids":["evt_2026-09-25_000002"]}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/calls/{call_id}/trace":{"get":{"operationId":"getCallTrace","tags":["Calls"],"summary":"Get a call's reasoning trace","description":"The gates in the order the engine evaluated them, each with pass or fail and the value that decided it, the candidate strikes with their sub-scores, and the verdict. This is the same record the engine keeps for its own audit, reduced to an allow-list of fields.","x-status":"live","parameters":[{"$ref":"#/components/parameters/CallId"}],"responses":{"200":{"description":"The trace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Trace"},"example":{"call_id":"PEREGRINE-2026-09-25-0940C","book":"peregrine","session":"2026-09-25","verdict":"fired","decided_at":"2026-09-25T13:41:07.214Z","steps":[{"seq":2,"id":"evt_2026-09-25_000002","type":"call.fired","at":"2026-09-25T13:41:07.214Z","emitted_at":"2026-09-25T13:41:07.214Z","gate":null,"reason":null}],"reasoning":{"as_of":"2026-09-25T14:30:00.000Z","headline":"LOCAL LEG: UP","session":"SESSION: TREND DAY","call":{"words":"UP while above 7,684","direction":"up"},"day":{"tag":"FIRST TREND","text":"First trend up at 09:40 ET."},"levels":{"trigger":7684,"invalidation":7671,"condition":"holds above the opening range"},"why":{"reason":"Trend formed above the open with flow confirming.","setup":"First trend at 09:40.","caution":"Pin at 7,700 overhead."}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/sessions/{date}":{"get":{"operationId":"getSession","tags":["Sessions"],"summary":"Get a session","description":"Where each book stands and whether the signal stack is healthy. The engine halts itself when a component goes degenerate, and says so here.","x-status":"live","parameters":[{"name":"date","in":"path","required":true,"description":"Trading day, America/New_York, or `today`.","schema":{"type":"string","pattern":"^(today|\\d{4}-\\d{2}-\\d{2})$"}}],"responses":{"200":{"description":"The session.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Session"},"example":{"date":"2026-09-25","trading_day":true,"status":"open","books":[{"book":"peregrine","status":"fired","call_id":"PEREGRINE-2026-09-25-0940C","updated_at":"2026-09-25T13:41:07.214Z"},{"book":"phoenix","status":"blocked","call_id":"PHOENIX-2026-09-25-1006P","updated_at":"2026-09-25T14:06:00.000Z"}],"calls":[{"call_id":"PHOENIX-2026-09-25-1006P","book":"phoenix","session":"2026-09-25","status":"blocked","side":"put","strike_spx":7640,"structure":"butterfly","strike_relation":null,"first_trend_ts":null,"fired_at":null,"decided_at":"2026-09-25T14:06:00.000Z","exited_at":null,"gate":"iv_atm # below floor #","reason":"iv_atm 13.5% below floor 15.0%; low-IV regime","entry_window":null,"exit_rule":null,"order_intent":null,"event_ids":["evt_2026-09-25_000001"]},{"call_id":"PEREGRINE-2026-09-25-0940C","book":"peregrine","session":"2026-09-25","status":"fired","side":"call","strike_spx":7690,"structure":"long_option","strike_relation":"1_itm","first_trend_ts":"2026-09-25T13:40:00.000Z","fired_at":"2026-09-25T13:41:07.214Z","decided_at":"2026-09-25T13:41:07.214Z","exited_at":null,"gate":null,"reason":null,"entry_window":{"opens":"2026-09-25T13:41:00.000Z","closes":"2026-09-25T13:42:00.000Z"},"exit_rule":{"kind":"time","at_et":"15:58"},"order_intent":{"underlying":"SPX","roots":["SPXW","XSP"],"expiry":"0DTE","legs":[{"right":"C","strike_relation":"1_itm","ratio":1,"action":"BUY_TO_OPEN"}],"entry_window":{"opens":"2026-09-25T13:41:00.000Z","closes":"2026-09-25T13:42:00.000Z"},"pricing_rule":null,"exit_rule":{"kind":"time","at_et":"15:58"},"cancel_if":["window_closed"]},"event_ids":["evt_2026-09-25_000002"]}],"next_seq":2,"health":{"status":"healthy","as_of":"2026-09-25T14:29:12.000Z","components":[{"name":"vwap","ok":true,"status":"ok"},{"name":"gex","ok":true,"status":"ok"},{"name":"cvd","ok":true,"status":"ok"}]},"reasoning":{"as_of":"2026-09-25T14:30:00.000Z","headline":"LOCAL LEG: UP","session":"SESSION: TREND DAY","call":{"words":"UP while above 7,684","direction":"up"},"day":{"tag":"FIRST TREND","text":"First trend up at 09:40 ET."},"levels":{"trigger":7684,"invalidation":7671,"condition":"holds above the opening range"},"why":{"reason":"Trend formed above the open with flow confirming.","setup":"First trend at 09:40.","caution":"Pin at 7,700 overhead."}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/webhooks":{"get":{"operationId":"listWebhooks","tags":["Webhooks"],"summary":"List webhook endpoints","x-status":"live","responses":{"200":{"description":"Registered endpoints for this key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookList"}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}},"post":{"operationId":"createWebhook","tags":["Webhooks"],"summary":"Register a webhook endpoint","description":"Deliveries are signed with HMAC-SHA256 using the secret returned here, which is shown once. Non-2xx responses are retried with exponential backoff for 24 hours; dedupe on `X-Synapse-Event-Id`.","x-status":"live","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreate"},"example":{"url":"https://example.com/synapse/hook","events":["call.fired","call.blocked","exit.signal","session.halted"],"description":"order router"}}}},"responses":{"201":{"description":"Created. The secret appears only in this response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreated"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/Invalid"}}}},"/webhooks/{webhook_id}":{"delete":{"operationId":"deleteWebhook","tags":["Webhooks"],"summary":"Remove a webhook endpoint","x-status":"live","parameters":[{"$ref":"#/components/parameters/WebhookId"}],"responses":{"204":{"description":"Removed. Deliveries in flight may still arrive once."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/webhooks/{webhook_id}/test":{"post":{"operationId":"testWebhook","tags":["Webhooks"],"summary":"Send a test delivery","description":"Sends one signed `webhook.test` event (with `test: true`) to the endpoint now, once and without retries, and reports what it answered, so you can verify the signature check end to end.","x-status":"live","parameters":[{"$ref":"#/components/parameters/WebhookId"}],"responses":{"202":{"description":"Attempted.","content":{"application/json":{"schema":{"type":"object","required":["event_id","delivered","status_code"],"properties":{"event_id":{"type":"string"},"delivered":{"type":"boolean","description":"True when the endpoint answered 2xx."},"status_code":{"type":["integer","null"]},"error":{"type":["string","null"]},"ms":{"type":"integer"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/studies":{"get":{"operationId":"listStudies","tags":["Studies"],"summary":"List studies","x-status":"live","description":"All fourteen studies, or the ones named in `ids`. Read now for the session the desk shows: today from the 09:30 open, else the last session as it closed. Every price is SPX points. A study the desk pauses on delayed engine data has no data here either, and every study carries a note with its tested record or why it is empty. These are derived reads: no option quotes, no prices computed from them, no implied vol and no GEX profile.","parameters":[{"name":"ids","in":"query","required":false,"description":"Comma-separated study ids, for example `gex,flow`. Default all.","schema":{"type":"string"}}],"responses":{"200":{"description":"The studies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Studies"},"example":{"session":"2026-10-07","session_status":"closed","last_session":true,"delayed":false,"as_of":"2026-10-07T19:56:22.150Z","studies":[{"id":"call","name":"Engine call","group":"engine","beta":false,"description":"The engine's call in five words, with its strength.","default_slot":0,"status":"final","as_of":"2026-10-07T19:56:22.150Z","data":{"call":"CHOP","side":null,"trend":false,"meaning":"No clear direction. SPX is moving sideways.","text":"No clear direction. SPX is moving sideways.","since":"2026-10-07T17:40:52.793Z","strength":null,"target":null,"late":null,"context":["SPX is up 17 pts from the open, and has given back 12% of it since the 13:25 high.","It's below yesterday's low of 7,806."]},"note":"Strength: how big and how clean the move is right now. TREND fills 3-5 bars, LEAN 1-3. Not a probability."},{"id":"notes","name":"What the engine sees","group":"engine","beta":false,"description":"The engine's running notes: why the call is what it is.","default_slot":1,"status":"final","as_of":"2026-10-07T19:42:20.276Z","data":{"notes":[{"at":"2026-10-07T19:42:20.276Z","kind":"watching","text":"Still no directional conviction since 13:40. SPX up 12 pts on the session, below the prior-day low at 7,806. Session efficiency 0.10 against the 0.10 needed to name a tilt; no one-way leg past 0.20% yet.","call":"CHOP"},{"at":"2026-10-07T19:26:54.927Z","kind":"watching","text":"Still no directional conviction since 13:40. SPX up 15 pts on the session, below the prior-day low at 7,806. Session efficiency 0.13 against the 0.10 needed to name a tilt; no one-way leg past 0.20% yet.","call":"CHOP"}]},"note":null},{"id":"side","name":"Today's calls","group":"engine","beta":false,"description":"Every change of call today, with market updates a tap away.","default_slot":2,"status":"final","as_of":"2026-10-07T17:40:52.793Z","data":{"calls":[{"at":"2026-10-07T17:40:52.793Z","call":"CHOP","side":null,"strength":null},{"at":"2026-10-07T17:26:50.687Z","call":"CALL TREND","side":"call","strength":4}]},"note":"Each time the engine's call changed, newest first."},{"id":"spread","name":"Synapse Spread Finder","group":"engine","beta":true,"description":"Each directional call priced as a 10-wide SPX spread.","default_slot":3,"status":"final","as_of":null,"data":{"call":"CHOP","side":null,"current":null,"missing":"CHOP names no direction, so there is no spread. One posts with the next CALL or PUT call.","earlier":[],"record":null},"note":"Fires with every CALL or PUT call: a 10-wide SPX spread, one strike in the money, held to the close. Entry prices stay on the desk: the API publishes no option quotes."},{"id":"moc","name":"Closing imbalance","group":"engine","beta":true,"description":"Which way the closing auction leans, read off /ES at 15:51.","default_slot":4,"status":"empty","as_of":null,"data":null,"note":"No closing-auction read this session."},{"id":"close","name":"Projected close","group":"engine","beta":false,"description":"Where the options market prices today's close.","default_slot":5,"status":"empty","as_of":null,"data":null,"note":"The projected close is read in session; it posts after the open."},{"id":"gex","name":"GEX map","group":"structure","beta":true,"description":"SPX dealer gamma by strike, the pin and the walls.","default_slot":null,"status":"empty","as_of":null,"data":null,"note":"The SPX dealer-gamma map posts a few minutes after the open."},{"id":"flow","name":"Order flow","group":"structure","beta":true,"description":"SPX futures buying vs selling since the open, against price.","default_slot":null,"status":"final","as_of":"2026-10-07T19:56:22.150Z","data":{"tone":"warn","headline":"Divergence: price up, selling","detail":"Net delta −8,715 contracts since the open, against SPX's direction.","cvd":-8715},"note":"Measured on /ES, described for SPX. Price and delta moving apart is a warning the engine weighs, not a call."},{"id":"value","name":"Value area","group":"structure","beta":true,"description":"VWAP, POC and the value area, and where SPX sits in them.","default_slot":null,"status":"final","as_of":"2026-10-07T19:56:22.150Z","data":{"spx":7802.2,"vwap":7785.1,"poc":7800.4,"vah":7806.5,"val":7774.1,"zone":"Inside value","above_vwap":true},"note":null},{"id":"voids","name":"Liquidity voids","group":"structure","beta":true,"description":"Unfilled SPX price gaps above and below. Levels only.","default_slot":null,"status":"final","as_of":"2026-10-07T19:56:22.150Z","data":{"spx":7802.3,"open":[{"lo":7801.23,"hi":7801.37,"side":"below","away_pts":0.93,"born_at":"15:55"},{"lo":7775.74,"hi":7776.05,"side":"below","away_pts":26.25,"born_at":"11:30"}],"filled":[{"lo":7800.97,"hi":7801.19,"at":"13:25"},{"lo":7801.06,"hi":7801.24,"at":"14:10"}]},"note":"Levels only: in our test, void fills matched ordinary pullbacks, with no directional edge."},{"id":"move","name":"Expected move","group":"range","beta":true,"description":"The implied move left today, and how much is used.","default_slot":null,"status":"empty","as_of":null,"data":null,"note":"The expected move posts after the open."},{"id":"levels","name":"Key levels","group":"range","beta":true,"description":"Prior day, overnight, and the trend's must-hold level.","default_slot":null,"status":"final","as_of":"2026-10-07T19:56:22.150Z","data":{"spx":7802.3,"levels":[{"label":"Prior high","level":7844.52,"must_hold":false},{"label":"Overnight high","level":7828.18,"must_hold":false}]},"note":null},{"id":"chop","name":"Chop meter","group":"range","beta":true,"description":"Session efficiency against the line to name a direction.","default_slot":null,"status":"final","as_of":"2026-10-07T19:56:22.150Z","data":{"efficiency":0.13,"named":false,"efficient":true,"moving":false,"out_run":false,"no_room":false,"names_direction_at":0.1,"drops_at":0.07,"words":"Efficient enough, but SPX has stopped moving, so the engine names no direction: the call stays CHOP until SPX moves again."},"note":null},{"id":"events","name":"Event clock","group":"range","beta":false,"description":"Macro releases and OpEx this week, with countdowns.","default_slot":null,"status":"live","as_of":"2026-10-08T00:56:19.526Z","data":{"events":[{"name":"CPI","when_et":"Wed, 10/14 08:30","in":"6d 11h","impact":"high","soon":false},{"name":"PPI","when_et":"Thu, 10/15 08:30","in":"7d 11h","impact":"medium","soon":false}]},"note":"Macro releases and OpEx in the next ten days."}]}}}},"400":{"$ref":"#/components/responses/Invalid"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/studies/{study_id}":{"get":{"operationId":"getStudy","tags":["Studies"],"summary":"Get a study","x-status":"live","description":"One study, in the same envelope as the list. Read now for the session the desk shows: today from the 09:30 open, else the last session as it closed. Every price is SPX points. A study the desk pauses on delayed engine data has no data here either, and every study carries a note with its tested record or why it is empty. These are derived reads: no option quotes, no prices computed from them, no implied vol and no GEX profile.","parameters":[{"name":"study_id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/StudyId"}}],"responses":{"200":{"description":"The study.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Studies"},"example":{"session":"2026-10-07","session_status":"closed","last_session":true,"delayed":false,"as_of":"2026-10-07T19:56:22.150Z","studies":[{"id":"flow","name":"Order flow","group":"structure","beta":true,"description":"SPX futures buying vs selling since the open, against price.","default_slot":null,"status":"final","as_of":"2026-10-07T19:56:22.150Z","data":{"tone":"warn","headline":"Divergence: price up, selling","detail":"Net delta −8,715 contracts since the open, against SPX's direction.","cvd":-8715},"note":"Measured on /ES, described for SPX. Price and delta moving apart is a warning the engine weighs, not a call."}]}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/mcp":{"post":{"operationId":"mcp","tags":["MCP"],"summary":"MCP server (Streamable HTTP)","x-status":"live","description":"A Model Context Protocol server over Streamable HTTP, protocol versions 2024-11-05 through 2025-11-25. Send one JSON-RPC message per POST; every reply is a single JSON body and no session is kept.\n\nTwo ways to authenticate. Claude on the web, Desktop and mobile (and any MCP client with OAuth) signs in: add a custom connector with this URL, and the 401 points the client at OAuth discovery (`/.well-known/oauth-protected-resource/api/v1/mcp`), where it registers or identifies itself, the member signs in and allows it, and the client gets a token bound to this endpoint. Or send a Desk API key as `Authorization: Bearer <key>`.\n\nTools, all read-only: `get_session` (a session's books, calls, and today's live read and health), `list_calls` (calls across a date range), `get_call` (one call with its trace), `list_events` (the raw journal after a seq) and `get_studies` (the desk's fourteen studies, or the `ids` asked for, as `/studies` returns them).\n\nClaude Code: `claude mcp add --transport http synapse https://synapseengine.ai/api/v1/mcp`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"One JSON-RPC 2.0 request or notification."},"example":{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_session","arguments":{"date":"2026-09-29"}}}}}},"responses":{"200":{"description":"The JSON-RPC response.","content":{"application/json":{"schema":{"type":"object"}}}},"202":{"description":"A notification was accepted."},"401":{"$ref":"#/components/responses/Unauthorized"},"405":{"description":"GET: this server offers no server-initiated stream."}}}}},"webhooks":{"call.fired":{"post":{"operationId":"onCallFired","summary":"The engine called a trade","description":"Carries the order intent. The entry window opens one minute after the trend first prints and closes a minute later, so act on this event, not on a poll.","x-status":"live","parameters":[{"$ref":"#/components/parameters/SignatureHeader"},{"$ref":"#/components/parameters/EventIdHeader"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CallFiredEvent"},"example":{"id":"evt_2026-09-25_000002","seq":2,"schema":"v1","type":"call.fired","book":"peregrine","session":"2026-09-25","call_id":"PEREGRINE-2026-09-25-0940C","decision_ts":"2026-09-25T13:41:07.214Z","emitted_ts":"2026-09-25T13:41:07.214Z","data":{"side":"call","strike_spx":7690,"first_trend_ts":"2026-09-25T13:40:00.000Z","structure":"long_option","strike_relation":"1_itm","entry_window":{"opens":"2026-09-25T13:41:00.000Z","closes":"2026-09-25T13:42:00.000Z"},"exit_rule":{"kind":"time","at_et":"15:58"},"order_intent":{"underlying":"SPX","roots":["SPXW","XSP"],"expiry":"0DTE","legs":[{"right":"C","strike_relation":"1_itm","ratio":1,"action":"BUY_TO_OPEN"}],"entry_window":{"opens":"2026-09-25T13:41:00.000Z","closes":"2026-09-25T13:42:00.000Z"},"pricing_rule":null,"exit_rule":{"kind":"time","at_et":"15:58"},"cancel_if":["window_closed"]}}}}}},"responses":{"2XX":{"$ref":"#/components/responses/Acknowledged"}}}},"call.blocked":{"post":{"operationId":"onCallBlocked","summary":"A gate stopped a call","description":"Names the gate and, where the gate is a number, the value and threshold that decided it.","x-status":"live","parameters":[{"$ref":"#/components/parameters/SignatureHeader"},{"$ref":"#/components/parameters/EventIdHeader"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CallBlockedEvent"},"example":{"id":"evt_2026-09-29_000002","seq":2,"schema":"v1","type":"call.blocked","book":"phoenix","session":"2026-09-29","call_id":"PHOENIX-2026-09-29-1120P","decision_ts":"2026-09-29T15:20:00.000Z","emitted_ts":"2026-09-29T15:21:58.159Z","data":{"side":"put","strike_spx":7660,"structure":"butterfly","gate":"iv_atm # below floor #","reason":"iv_atm 13.5% below floor 15.0%; low-IV regime"}}}}},"responses":{"2XX":{"$ref":"#/components/responses/Acknowledged"}}}},"call.armed":{"post":{"operationId":"onCallArmed","summary":"A call is forming","description":"The side is known and the listed conditions are still outstanding. Use it to warm up your client; never trade on it.","x-status":"planned","parameters":[{"$ref":"#/components/parameters/SignatureHeader"},{"$ref":"#/components/parameters/EventIdHeader"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CallArmedEvent"}}}},"responses":{"2XX":{"$ref":"#/components/responses/Acknowledged"}}}},"call.expired":{"post":{"operationId":"onCallExpired","summary":"An entry window closed unfilled","x-status":"live","parameters":[{"$ref":"#/components/parameters/SignatureHeader"},{"$ref":"#/components/parameters/EventIdHeader"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CallExpiredEvent"},"example":{"id":"evt_2026-09-25_000003","seq":3,"schema":"v1","type":"call.expired","book":"peregrine","session":"2026-09-25","call_id":"PEREGRINE-2026-09-25-0940C","decision_ts":"2026-09-25T13:42:00.500Z","emitted_ts":"2026-09-25T13:42:00.500Z","data":{"side":"call","strike_spx":7690,"first_trend_ts":"2026-09-25T13:40:00.000Z","reason":"The entry window closed without a fill inside the limit."}}}}},"responses":{"2XX":{"$ref":"#/components/responses/Acknowledged"}}}},"exit.signal":{"post":{"operationId":"onExitSignal","summary":"The engine's exit rule fired","x-status":"planned","parameters":[{"$ref":"#/components/parameters/SignatureHeader"},{"$ref":"#/components/parameters/EventIdHeader"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExitSignalEvent"}}}},"responses":{"2XX":{"$ref":"#/components/responses/Acknowledged"}}}},"session.health":{"post":{"operationId":"onSessionHealth","summary":"Signal-stack health changed","description":"Sent at the open and whenever a component's status changes.","x-status":"planned","parameters":[{"$ref":"#/components/parameters/SignatureHeader"},{"$ref":"#/components/parameters/EventIdHeader"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionHealthEvent"}}}},"responses":{"2XX":{"$ref":"#/components/responses/Acknowledged"}}}},"session.halted":{"post":{"operationId":"onSessionHalted","summary":"The engine halted itself","description":"The self-audit found a degenerate signal component. Cancel anything working from today's intents.","x-status":"planned","parameters":[{"$ref":"#/components/parameters/SignatureHeader"},{"$ref":"#/components/parameters/EventIdHeader"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionHaltedEvent"}}}},"responses":{"2XX":{"$ref":"#/components/responses/Acknowledged"}}}},"tape.local":{"post":{"operationId":"onTapeLocal","summary":"The engine's local read of the tape changed","description":"Sent every time the local read changes, 30 to 40 times in a typical session, whether or not the engine trades. Observation only: a local read is never an entry by itself.","x-status":"planned","parameters":[{"$ref":"#/components/parameters/SignatureHeader"},{"$ref":"#/components/parameters/EventIdHeader"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TapeLocalEvent"},"example":{"id":"evt_2026-09-24_000118","seq":118,"schema":"v1","type":"tape.local","book":null,"session":"2026-09-24","call_id":null,"decision_ts":"2026-09-24T14:05:00.402Z","emitted_ts":"2026-09-24T14:05:00.731Z","data":{"local":"up","phase":"developing","rule":"es-completed-5m-range-break-v1"}}}}},"responses":{"2XX":{"$ref":"#/components/responses/Acknowledged"}}}}},"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"Per-customer API key in `Authorization: Bearer <key>`. Keys are stored hashed; revocation applies on the next request."}},"parameters":{"LastEventId":{"name":"Last-Event-ID","in":"header","required":false,"description":"Resume after this event id.","schema":{"type":"string"}},"BooksFilter":{"name":"books","in":"query","required":false,"description":"Only these books. Default: all.","style":"form","explode":false,"schema":{"type":"array","items":{"$ref":"#/components/schemas/Book"}}},"Limit":{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":500,"default":100}},"CallId":{"name":"call_id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/CallId"}},"WebhookId":{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string"}},"SignatureHeader":{"name":"X-Synapse-Signature","in":"header","required":true,"description":"`t=<unix seconds>,v1=<hex>` where v1 is HMAC-SHA256 of `<t>.<raw body>` with your endpoint secret. Reject if t is more than 5 minutes old.","schema":{"type":"string"}},"EventIdHeader":{"name":"X-Synapse-Event-Id","in":"header","required":true,"description":"Same as the body's `id`. Deliveries can repeat; dedupe on it.","schema":{"type":"string"}}},"responses":{"Unauthorized":{"description":"Missing, unknown or revoked key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"No such resource for this key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"RateLimited":{"description":"Too many requests or concurrent streams for this key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Invalid":{"description":"The request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Acknowledged":{"description":"Any 2xx acknowledges the delivery. Anything else, a redirect, or no answer within 5 seconds is retried after 10 s, 1 min, 5 min, 30 min and 2 h, then dropped. Deliveries can repeat; dedupe on the event id."}},"schemas":{"Book":{"type":"string","enum":["peregrine","phoenix"],"description":"`peregrine` is the directional book; `phoenix` the leg-in butterfly book."},"Side":{"type":"string","enum":["call","put"]},"CallId":{"type":"string","pattern":"^(PEREGRINE|PHOENIX)-\\d{4}-\\d{2}-\\d{2}-\\d{4}[CP]$","description":"`{BOOK}-{session}-{HHMM}{C|P}`: the book, the session date, the minute (ET) the call first formed, and the side.","example":"PEREGRINE-2026-09-29-0940P"},"CallStatus":{"type":"string","enum":["idle","fired","blocked","expired"],"description":"A call takes the status of its latest event; `idle` is a book with no call that session. `armed` and `exited` arrive with call.armed and exit.signal."},"EventType":{"type":"string","enum":["session.health","session.halted","tape.local","call.armed","call.fired","call.blocked","call.expired","exit.signal"]},"StrikeRelation":{"type":"string","pattern":"^(atm|\\d+_(itm|otm))$","description":"Strike position relative to at-the-money at decision time, in strike steps of the root you trade. Never a price.","example":"1_itm"},"Structure":{"type":"string","enum":["long_option","butterfly"],"description":"`butterfly` intents (Phoenix) carry a conditional body leg and ship after banner intents."},"Event":{"type":"object","description":"The envelope every event shares, on every channel.","required":["id","seq","schema","type","session","decision_ts","emitted_ts","data"],"properties":{"id":{"type":"string","description":"Idempotency key.","example":"evt_2026-09-25_000142"},"seq":{"type":"integer","description":"Monotonic per session. A skipped number means a missed event; replay with /events."},"schema":{"type":"string","const":"v1"},"type":{"$ref":"#/components/schemas/EventType"},"book":{"oneOf":[{"$ref":"#/components/schemas/Book"},{"type":"null"}],"description":"Null for session-wide events."},"session":{"type":"string","format":"date"},"call_id":{"oneOf":[{"$ref":"#/components/schemas/CallId"},{"type":"null"}]},"decision_ts":{"type":"string","format":"date-time","description":"When the engine decided."},"emitted_ts":{"type":"string","format":"date-time","description":"When Synapse published the event."},"test":{"type":"boolean","description":"Present and true only on test deliveries."},"data":{"type":"object","description":"Type-specific payload. See the event types."}}},"CallFiredEvent":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"const":"call.fired"},"data":{"$ref":"#/components/schemas/CallFired"}}}]},"CallBlockedEvent":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"const":"call.blocked"},"data":{"$ref":"#/components/schemas/CallBlocked"}}}]},"CallArmedEvent":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"const":"call.armed"},"data":{"$ref":"#/components/schemas/CallArmed"}}}]},"CallExpiredEvent":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"const":"call.expired"},"data":{"$ref":"#/components/schemas/CallExpired"}}}]},"ExitSignalEvent":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"const":"exit.signal"},"data":{"$ref":"#/components/schemas/ExitSignal"}}}]},"SessionHealthEvent":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"const":"session.health"},"data":{"$ref":"#/components/schemas/SessionHealth"}}}]},"SessionHaltedEvent":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"const":"session.halted"},"data":{"$ref":"#/components/schemas/SessionHalted"}}}]},"CallFired":{"type":"object","required":["side","structure","strike_relation","entry_window","exit_rule","order_intent"],"properties":{"side":{"$ref":"#/components/schemas/Side"},"strike_spx":{"type":["integer","null"],"description":"The strike as an SPX level."},"first_trend_ts":{"type":["string","null"],"format":"date-time","description":"When the trend that formed the call first printed (Peregrine)."},"structure":{"oneOf":[{"$ref":"#/components/schemas/Structure"},{"type":"null"}]},"strike_relation":{"oneOf":[{"$ref":"#/components/schemas/StrikeRelation"},{"type":"null"}]},"entry_window":{"oneOf":[{"$ref":"#/components/schemas/EntryWindow"},{"type":"null"}]},"exit_rule":{"oneOf":[{"$ref":"#/components/schemas/ExitRule"},{"type":"null"}]},"order_intent":{"oneOf":[{"$ref":"#/components/schemas/OrderIntent"},{"type":"null"}]}}},"CallBlocked":{"type":"object","required":["side","reason"],"properties":{"side":{"oneOf":[{"$ref":"#/components/schemas/Side"},{"type":"null"}]},"strike_spx":{"type":["integer","null"],"description":"The strike as an SPX level."},"first_trend_ts":{"type":["string","null"],"format":"date-time","description":"When the trend that formed the call first printed (Peregrine)."},"structure":{"oneOf":[{"$ref":"#/components/schemas/Structure"},{"type":"null"}]},"gate":{"type":["string","null"],"description":"Stable gate id where the book publishes one (Phoenix); Peregrine names its gate in the reason."},"reason":{"type":"string","description":"The gate's verdict in words."}}},"CallArmed":{"type":"object","required":["side","waiting_for"],"properties":{"side":{"$ref":"#/components/schemas/Side"},"waiting_for":{"type":"array","items":{"type":"string"},"description":"Outstanding conditions, in words."}}},"CallExpired":{"type":"object","required":["reason"],"properties":{"side":{"oneOf":[{"$ref":"#/components/schemas/Side"},{"type":"null"}]},"strike_spx":{"type":["integer","null"],"description":"The strike as an SPX level."},"first_trend_ts":{"type":["string","null"],"format":"date-time","description":"When the trend that formed the call first printed (Peregrine)."},"reason":{"type":"string"}}},"ExitSignal":{"type":"object","required":["rule"],"properties":{"rule":{"$ref":"#/components/schemas/ExitRule"},"reason":{"type":"string"}}},"SessionHalted":{"type":"object","required":["component","reason"],"properties":{"component":{"type":"string"},"reason":{"type":"string"}}},"DecidingValue":{"type":"object","description":"Engine-derived quantities only: model probabilities and filter statistics. Never a quote or a greek.","required":["name"],"properties":{"name":{"type":"string"},"value":{"type":["number","null"]},"threshold":{"type":["number","null"]},"unit":{"type":["string","null"]}}},"OrderIntent":{"type":"object","description":"A trade as a structure and a pricing rule. Your client prices it against your own broker's quotes and places it with your own keys.","required":["underlying","roots","expiry","legs","entry_window","pricing_rule","exit_rule","cancel_if"],"properties":{"underlying":{"type":"string","const":"SPX"},"roots":{"type":"array","items":{"type":"string","enum":["SPXW","XSP"]},"description":"Roots that express the call. Pick the one that fits your account; strike relations apply in that root's strike steps."},"expiry":{"type":"string","const":"0DTE"},"legs":{"type":"array","items":{"$ref":"#/components/schemas/Leg"}},"entry_window":{"$ref":"#/components/schemas/EntryWindow"},"pricing_rule":{"oneOf":[{"$ref":"#/components/schemas/PricingRule"},{"type":"null"}],"description":"Null until the fill-calibration ledger publishes a rule. Until then, price against your own quotes."},"exit_rule":{"$ref":"#/components/schemas/ExitRule"},"cancel_if":{"type":"array","items":{"type":"string","enum":["window_closed","session_halted","call_blocked"]}}}},"Leg":{"type":"object","required":["right","strike_relation","ratio","action"],"properties":{"right":{"type":"string","enum":["C","P"]},"strike_relation":{"$ref":"#/components/schemas/StrikeRelation"},"ratio":{"type":"integer","minimum":1},"action":{"type":"string","enum":["BUY_TO_OPEN","SELL_TO_OPEN","BUY_TO_CLOSE","SELL_TO_CLOSE"]},"condition":{"type":"string","description":"Conditional legs only (the Phoenix body): the rule your client evaluates against its own fills, for example completing only at a net credit."}}},"EntryWindow":{"type":"object","required":["opens","closes"],"properties":{"opens":{"type":["string","null"],"format":"date-time"},"closes":{"type":["string","null"],"format":"date-time"}}},"PricingRule":{"type":"object","description":"How to work the order against your own quotes. Values come from the engine's fill-calibration ledger; examples are illustrative.","required":["start","step","every_s","max_steps"],"properties":{"start":{"type":"string","enum":["mid"],"description":"Start at your broker's mid."},"step":{"type":"number","description":"Premium points to concede per step."},"every_s":{"type":"integer","description":"Seconds between steps."},"max_steps":{"type":"integer","description":"Stop conceding after this many steps; cancel at window close."}}},"ExitRule":{"type":"object","required":["kind"],"properties":{"kind":{"type":"string","enum":["time","engine_signal"]},"at_et":{"type":"string","pattern":"^\\d{2}:\\d{2}$","description":"For `time`: exit at this America/New_York time."}}},"Call":{"type":"object","required":["call_id","book","session","status","decided_at","event_ids"],"properties":{"call_id":{"$ref":"#/components/schemas/CallId"},"book":{"$ref":"#/components/schemas/Book"},"session":{"type":"string","format":"date"},"status":{"$ref":"#/components/schemas/CallStatus"},"side":{"oneOf":[{"$ref":"#/components/schemas/Side"},{"type":"null"}]},"strike_spx":{"type":["integer","null"],"description":"The strike as an SPX level."},"structure":{"oneOf":[{"$ref":"#/components/schemas/Structure"},{"type":"null"}]},"strike_relation":{"oneOf":[{"$ref":"#/components/schemas/StrikeRelation"},{"type":"null"}]},"first_trend_ts":{"type":["string","null"],"format":"date-time","description":"When the trend that formed the call first printed (Peregrine)."},"fired_at":{"type":["string","null"],"format":"date-time"},"decided_at":{"type":"string","format":"date-time","description":"The latest event's decision time."},"exited_at":{"type":["string","null"],"format":"date-time","description":"Null until exit.signal ships."},"gate":{"type":["string","null"]},"reason":{"type":["string","null"],"description":"Why it was blocked or expired."},"entry_window":{"oneOf":[{"$ref":"#/components/schemas/EntryWindow"},{"type":"null"}]},"exit_rule":{"oneOf":[{"$ref":"#/components/schemas/ExitRule"},{"type":"null"}]},"order_intent":{"oneOf":[{"$ref":"#/components/schemas/OrderIntent"},{"type":"null"}]},"event_ids":{"type":"array","items":{"type":"string"}}}},"CallPage":{"type":"object","required":["calls","next_cursor"],"properties":{"calls":{"type":"array","items":{"$ref":"#/components/schemas/Call"}},"next_cursor":{"type":["string","null"]}}},"EventPage":{"type":"object","required":["events","next_seq"],"properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/Event"}},"next_seq":{"type":["integer","null"]}}},"Trace":{"type":"object","required":["call_id","book","session","verdict","decided_at","steps"],"properties":{"call_id":{"$ref":"#/components/schemas/CallId"},"book":{"$ref":"#/components/schemas/Book"},"session":{"type":"string","format":"date"},"verdict":{"type":"string","enum":["fired","blocked","expired"]},"decided_at":{"type":"string","format":"date-time"},"steps":{"type":"array","description":"Every journaled decision on the call, in order.","items":{"type":"object","required":["seq","id","type","at","emitted_at"],"properties":{"seq":{"type":"integer"},"id":{"type":"string"},"type":{"$ref":"#/components/schemas/EventType"},"at":{"type":"string","format":"date-time"},"emitted_at":{"type":"string","format":"date-time"},"gate":{"type":["string","null"]},"reason":{"type":["string","null"]}}}},"reasoning":{"oneOf":[{"$ref":"#/components/schemas/Reasoning"},{"type":"null"}],"description":"While the call is live (Peregrine, today): the desk's reasoning. The full gate chain with each deciding value is planned and needs the engine to journal it with the call."}}},"Gate":{"type":"object","required":["order","id","label","passed"],"properties":{"order":{"type":"integer"},"id":{"type":"string"},"label":{"type":"string"},"passed":{"type":"boolean"},"value":{"type":["number","null"],"description":"Engine-derived only, as in DecidingValue."},"threshold":{"type":["number","null"]},"unit":{"type":["string","null"]}}},"Candidate":{"type":"object","required":["strike_relation","score","chosen"],"properties":{"strike_relation":{"$ref":"#/components/schemas/StrikeRelation"},"score":{"type":"number"},"subscores":{"type":"object","additionalProperties":{"type":"number"}},"chosen":{"type":"boolean"}}},"Session":{"type":"object","required":["date","trading_day","status","books","calls","next_seq","health","reasoning"],"properties":{"date":{"type":"string","format":"date"},"trading_day":{"type":"boolean"},"status":{"type":"string","enum":["pre_open","open","closed"]},"books":{"type":"array","items":{"$ref":"#/components/schemas/BookState"}},"calls":{"type":"array","items":{"$ref":"#/components/schemas/Call"}},"next_seq":{"type":"integer","description":"The last seq in the session journal; pass to /events as after_seq."},"health":{"oneOf":[{"$ref":"#/components/schemas/SessionHealth"},{"type":"null"}],"description":"Today only."},"reasoning":{"oneOf":[{"$ref":"#/components/schemas/Reasoning"},{"type":"null"}],"description":"Today only."}}},"BookState":{"type":"object","required":["book","status","call_id","updated_at"],"properties":{"book":{"$ref":"#/components/schemas/Book"},"status":{"$ref":"#/components/schemas/CallStatus"},"call_id":{"oneOf":[{"$ref":"#/components/schemas/CallId"},{"type":"null"}]},"updated_at":{"type":["string","null"],"format":"date-time"}}},"SessionHealth":{"type":"object","required":["status","components"],"properties":{"status":{"type":"string","description":"The engine's rollup: pre_window, no_samples, idle, warming, healthy or degraded. Treat anything else as unverified."},"as_of":{"type":["string","null"],"format":"date-time"},"components":{"type":"array","items":{"$ref":"#/components/schemas/HealthComponent"}}}},"HealthComponent":{"type":"object","required":["name","ok","status"],"properties":{"name":{"type":"string","description":"Signal component, for example vwap, gex, iv_atm, cvd, scan_loop."},"ok":{"type":"boolean","description":"False only for a fault (degenerate or dead)."},"status":{"type":"string","description":"ok, degenerate, dead, not_observed or reported."}}},"Webhook":{"type":"object","required":["id","url","events","created_at"],"properties":{"id":{"type":"string"},"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"$ref":"#/components/schemas/EventType"}},"description":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"},"secret_last4":{"type":"string"},"books":{"type":["array","null"],"items":{"$ref":"#/components/schemas/Book"}},"last_delivery":{"type":["object","null"],"properties":{"at":{"type":"string","format":"date-time"},"event_id":{"type":"string"},"attempt":{"type":"integer"},"status":{"type":["integer","null"]},"ok":{"type":"boolean"},"error":{"type":["string","null"]}}}}},"WebhookCreate":{"type":"object","required":["url","events"],"properties":{"url":{"type":"string","format":"uri","description":"HTTPS only."},"events":{"type":"array","items":{"$ref":"#/components/schemas/EventType"},"minItems":1,"description":"Deliverable today: call.fired, call.blocked, call.expired."},"description":{"type":"string"},"books":{"type":"array","items":{"$ref":"#/components/schemas/Book"},"description":"Only these books. Default: all."}}},"WebhookCreated":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"type":"object","required":["secret"],"properties":{"secret":{"type":"string","description":"Shown once."}}}]},"WebhookList":{"type":"object","required":["webhooks"],"properties":{"webhooks":{"type":"array","items":{"$ref":"#/components/schemas/Webhook"}}}},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}},"TapeLocal":{"type":"object","required":["local","phase"],"properties":{"local":{"type":"string","enum":["up","down","balanced"],"description":"Direction of the last completed break of the fifteen-minute range."},"phase":{"type":["string","null"],"enum":["developing","continuing","pullback",null]},"rule":{"type":"string","description":"The engine's rule id for the read.","example":"es-completed-5m-range-break-v1"}}},"TapeLocalEvent":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"type":{"const":"tape.local"},"data":{"$ref":"#/components/schemas/TapeLocal"}}}]},"Reasoning":{"type":"object","description":"The engine's live read of the session, as the desk shows it. Today only.","required":["headline","session","why"],"properties":{"as_of":{"type":["string","null"],"format":"date-time"},"headline":{"type":"string"},"session":{"type":"string"},"call":{"type":["object","null"],"properties":{"words":{"type":"string"},"direction":{"type":["string","null"],"enum":["up","down",null]}}},"day":{"type":["object","null"],"properties":{"tag":{"type":"string"},"text":{"type":"string"}}},"levels":{"type":["object","null"],"description":"SPX levels.","properties":{"trigger":{"type":["number","null"]},"invalidation":{"type":["number","null"]},"condition":{"type":["string","null"]}}},"why":{"type":"object","properties":{"reason":{"type":"string"},"setup":{"type":"string"},"caution":{"type":"string"}}}}},"StudyId":{"type":"string","enum":["call","notes","side","spread","moc","close","gex","flow","value","voids","move","levels","chop","events"],"description":"One per member desk card. `call`, `notes`, `side`, `spread`, `moc` and `close` are the six on a new desk; the rest are in the desk's card library."},"StudyStatus":{"type":"string","enum":["live","final","delayed","empty"],"description":"`live`: the session is open and the read is fresh. `final`: the session has closed; this is the read as it stood at the close. `delayed`: in session, the engine's last write is over five minutes old; a study the desk pauses then has no data. `empty`: nothing to read yet, and `note` says why."},"StudySpreadStructure":{"type":"object","required":["at","call","side","long_strike","short_strike","width","settled"],"properties":{"at":{"type":"string","format":"date-time","description":"When the call posted."},"call":{"type":"string","enum":["PUT TREND","PUT LEAN","CHOP","CALL LEAN","CALL TREND"],"description":"The engine call, puts to calls."},"side":{"type":"string","enum":["call","put"]},"long_strike":{"type":"number","description":"SPX strike bought, one listed strike in the money."},"short_strike":{"type":"number","description":"SPX strike sold, `width` further out."},"width":{"type":"number","description":"Points between the strikes."},"settled":{"type":["object","null"],"required":["close","won"],"properties":{"close":{"type":"number","description":"The official SPX close."},"won":{"type":"boolean","description":"The spread finished ahead after fees."}},"description":"Set once the official close is in."}},"description":"A call as a spread: its strikes and how it settled. Entry prices stay on the desk."},"StudyMocSession":{"type":"object","required":["date","status","lean","move_pts","after_pts","with_lean"],"properties":{"date":{"type":"string","format":"date"},"status":{"type":"string","enum":["waiting","reading","read","closed","missing","none","no_auction"]},"lean":{"type":["string","null"],"enum":["buy","sell","none",null]},"move_pts":{"type":["number","null"],"description":"/ES points from 15:50:00 to 15:51:00."},"after_pts":{"type":["number","null"],"description":"/ES points from 15:51 to 16:00."},"with_lean":{"type":["boolean","null"],"description":"/ES went with the lean into the close."}}},"StudyCall":{"type":"object","required":["call","side","trend","meaning","text","since","strength","target","late","context"],"properties":{"call":{"type":"string","enum":["PUT TREND","PUT LEAN","CHOP","CALL LEAN","CALL TREND"],"description":"The engine call, puts to calls."},"side":{"type":["string","null"],"enum":["call","put",null],"description":"null on CHOP."},"trend":{"type":"boolean","description":"CALL TREND or PUT TREND."},"meaning":{"type":"string"},"text":{"type":"string","description":"The engine's sentence."},"since":{"type":"string","format":"date-time","description":"When this call posted."},"strength":{"type":["integer","null"],"minimum":1,"maximum":5,"description":"How big and how clean the move is, 1-5. Not a probability. null on CHOP."},"target":{"type":["object","null"],"required":["side","level","away_pts","near","late"],"properties":{"side":{"type":"string","enum":["call","put"]},"level":{"type":"number","description":"SPX level where the move is estimated to run out."},"away_pts":{"type":"number"},"near":{"type":"boolean","description":"Within 5 points."},"late":{"type":["object","null"],"required":["spent_pts","left_pts"],"properties":{"spent_pts":{"type":"number"},"left_pts":{"type":"number"}},"description":"The move off the day's extreme already covers the expected range left."}},"description":"The engine's target on the call's side. Live session only."},"late":{"type":["object","null"],"required":["words","spent_pts","typical_pts","from"],"properties":{"words":{"type":"string"},"spent_pts":{"type":"number"},"typical_pts":{"type":"number"},"from":{"type":"string","enum":["low","high","open"]}},"description":"SPX has already run more than a typical day's move. Live session only."},"context":{"type":"array","items":{"type":"string"},"description":"Where SPX sits in its day, in plain sentences."}},"description":"The engine call."},"StudyNotes":{"type":"object","required":["notes"],"properties":{"notes":{"type":"array","description":"Newest first.","items":{"type":"object","required":["at","kind","text","call"],"properties":{"at":{"type":"string","format":"date-time"},"kind":{"type":"string","enum":["open","called","looking","forming","lapsed","strength","level","late","watching"]},"text":{"type":"string"},"call":{"type":["string","null"],"enum":["PUT TREND","PUT LEAN","CHOP","CALL LEAN","CALL TREND",null]}}}}},"description":"The engine's running notes."},"StudyCallLog":{"type":"object","required":["calls"],"properties":{"calls":{"type":"array","description":"Every change of call, newest first.","items":{"type":"object","required":["at","call","side","strength"],"properties":{"at":{"type":"string","format":"date-time"},"call":{"type":"string","enum":["PUT TREND","PUT LEAN","CHOP","CALL LEAN","CALL TREND"],"description":"The engine call, puts to calls."},"side":{"type":["string","null"],"enum":["call","put",null],"description":"null on CHOP."},"strength":{"type":["integer","null"],"minimum":1,"maximum":5}}}}},"description":"Today's calls."},"StudySpreadFinder":{"type":"object","required":["call","side","current","missing","earlier","record"],"properties":{"call":{"type":"string","enum":["PUT TREND","PUT LEAN","CHOP","CALL LEAN","CALL TREND"],"description":"The engine call, puts to calls."},"side":{"type":["string","null"],"enum":["call","put",null],"description":"null on CHOP."},"current":{"oneOf":[{"$ref":"#/components/schemas/StudySpreadStructure"},{"type":"null"}]},"missing":{"type":["string","null"],"description":"Why the current call has no spread."},"earlier":{"type":"array","items":{"$ref":"#/components/schemas/StudySpreadStructure"},"description":"Earlier calls' spreads today, newest first."},"record":{"type":["object","null"],"required":["trades","win_pct","since"],"properties":{"trades":{"type":"integer"},"win_pct":{"type":"number"},"since":{"type":["string","null"]}},"description":"Every call spread since launch, settled at the close."}},"description":"Each directional call as a 10-wide SPX spread."},"StudyClosingImbalance":{"allOf":[{"$ref":"#/components/schemas/StudyMocSession"},{"type":"object","required":["lean_words","words","clear_pts","print_at","read_at","previous"],"properties":{"lean_words":{"type":["string","null"]},"words":{"type":"string","description":"The read in a sentence."},"clear_pts":{"type":"number","description":"The /ES move a lean needs."},"print_at":{"type":["string","null"],"format":"date-time","description":"The 15:50 publication."},"read_at":{"type":["string","null"],"format":"date-time"},"previous":{"oneOf":[{"$ref":"#/components/schemas/StudyMocSession"},{"type":"null"}]}}}],"description":"Which way the closing auction leans, read off /ES in the minute after 15:50. A proxy, not the imbalance feed."},"StudyProjectedClose":{"type":"object","required":["center","lo","hi","hold_pct","sessions"],"properties":{"center":{"type":"number","description":"SPX now."},"lo":{"type":"number"},"hi":{"type":"number"},"hold_pct":{"type":["number","null"],"description":"How often the official close landed inside the range, out of sample."},"sessions":{"type":["integer","null"],"description":"Sessions behind hold_pct."}},"description":"Where the options market prices today's close. Live session only."},"StudyGexMap":{"type":"object","required":["dealer","dealer_words","pin","call_wall","put_wall","flip","spx"],"properties":{"dealer":{"type":["string","null"],"description":"long_gamma, short_gamma, or another state the profiler names."},"dealer_words":{"type":"string"},"pin":{"type":"number","description":"SPX strike."},"call_wall":{"type":["number","null"],"description":"SPX strike."},"put_wall":{"type":["number","null"],"description":"SPX strike."},"flip":{"type":["number","null"],"description":"SPX level where dealer gamma changes sign."},"spx":{"type":"number"}},"description":"SPX dealer-gamma levels. Levels, not a forecast; the by-strike profile is not published."},"StudyOrderFlow":{"type":"object","required":["tone","headline","detail","cvd"],"properties":{"tone":{"type":"string","enum":["up","down","warn","flat"]},"headline":{"type":"string"},"detail":{"type":"string"},"cvd":{"type":"number","description":"/ES cumulative volume delta since the open, in contracts traded."}},"description":"/ES buying against selling since the open, read against SPX."},"StudyValueArea":{"type":"object","required":["spx","vwap","poc","vah","val","zone","above_vwap"],"properties":{"spx":{"type":"number"},"vwap":{"type":"number"},"poc":{"type":"number"},"vah":{"type":"number"},"val":{"type":"number"},"zone":{"type":"string","enum":["Above value","Inside value","Below value"]},"above_vwap":{"type":"boolean"}},"description":"VWAP, POC and the value area, SPX points."},"StudyVoids":{"type":"object","required":["spx","open","filled"],"properties":{"spx":{"type":"number"},"open":{"type":"array","description":"Nearest first.","items":{"type":"object","required":["lo","hi","side","away_pts","born_at"],"properties":{"lo":{"type":"number"},"hi":{"type":"number"},"side":{"type":"string","enum":["above","below","at"]},"away_pts":{"type":"number"},"born_at":{"type":["string","null"],"description":"HH:MM ET."}}}},"filled":{"type":"array","description":"The last two filled.","items":{"type":"object","required":["lo","hi","at"],"properties":{"lo":{"type":"number"},"hi":{"type":"number"},"at":{"type":["string","null"],"description":"HH:MM ET."}}}}},"description":"Unfilled SPX price gaps above and below. Levels only."},"StudyExpectedMove":{"type":"object","required":["left_pts","moved_pts","typical_pts","spent_frac","mostly_spent"],"properties":{"left_pts":{"type":"number","description":"One standard deviation of SPX movement left to the close."},"moved_pts":{"type":["number","null"],"description":"SPX points from the open."},"typical_pts":{"type":["number","null"],"description":"A typical day's whole move, median of the last 20 sessions."},"spent_frac":{"type":["number","null"],"description":"moved_pts over typical_pts."},"mostly_spent":{"type":"boolean","description":"spent_frac is 0.8 or more."}},"description":"The implied move left today and how much of a typical day is used. Live session only."},"StudyKeyLevels":{"type":"object","required":["spx","levels"],"properties":{"spx":{"type":["number","null"]},"levels":{"type":"array","description":"Highest first.","items":{"type":"object","required":["label","level","must_hold"],"properties":{"label":{"type":"string"},"level":{"type":"number"},"must_hold":{"type":"boolean","description":"The current trend's must-hold level."}}}}},"description":"Prior day, overnight, and the trend's must-hold, SPX points."},"StudyChopMeter":{"type":"object","required":["efficiency","named","efficient","moving","out_run","no_room","names_direction_at","drops_at","words"],"properties":{"efficiency":{"type":"number","description":"The session's efficiency ratio."},"named":{"type":"boolean","description":"The session's own move clears every floor for its slot: efficient enough, and in the chop and flat slots still moving and not out-run, in the trending slot with room to run. A one-way leg or the last hour's trend can name a direction when it does not; the call study has the word."},"efficient":{"type":"boolean","description":"The efficiency floor alone: the session's efficiency has cleared names_direction_at and not decayed under drops_at."},"moving":{"type":["boolean","null"],"description":"The engine's motion latch as read; null before it is computed. It holds the call at CHOP only in the chop and flat slots."},"out_run":{"type":"boolean","description":"Chop and flat slots: SPX is already 0.10% or more back off its session extreme, so the session's direction is stale."},"no_room":{"type":"boolean","description":"Trending slot: SPX sits at a session extreme it has already made and held, with under 0.10% of room to run."},"names_direction_at":{"type":"number"},"drops_at":{"type":"number"},"words":{"type":"string","description":"The meter against the call on the desk: with a direction called, what takes the side off; with CHOP, the floor that holds it there."}},"description":"Session efficiency against the line the engine needs to name a direction, and whether it names one (all three floors)."},"StudyEventClock":{"type":"object","required":["events"],"properties":{"events":{"type":"array","items":{"type":"object","required":["name","when_et","in","impact","soon"],"properties":{"name":{"type":"string"},"when_et":{"type":"string"},"in":{"type":"string","description":"Countdown, for example 2d 4h."},"impact":{"type":"string","enum":["critical","high","medium","low"]},"soon":{"type":"boolean","description":"Within 24 hours."}}}}},"description":"Macro releases and OpEx in the next ten days."},"Study":{"type":"object","required":["id","name","group","beta","description","default_slot","status","as_of","data","note"],"properties":{"id":{"$ref":"#/components/schemas/StudyId"},"name":{"type":"string"},"group":{"type":"string","enum":["engine","structure","range"]},"beta":{"type":"boolean","description":"Still earning its record."},"description":{"type":"string"},"default_slot":{"type":["integer","null"],"minimum":0,"maximum":5,"description":"Its slot on a new member's desk, or null for a library study."},"status":{"$ref":"#/components/schemas/StudyStatus"},"as_of":{"type":["string","null"],"format":"date-time","description":"When the study's own read was taken."},"data":{"oneOf":[{"$ref":"#/components/schemas/StudyCall"},{"$ref":"#/components/schemas/StudyNotes"},{"$ref":"#/components/schemas/StudyCallLog"},{"$ref":"#/components/schemas/StudySpreadFinder"},{"$ref":"#/components/schemas/StudyClosingImbalance"},{"$ref":"#/components/schemas/StudyProjectedClose"},{"$ref":"#/components/schemas/StudyGexMap"},{"$ref":"#/components/schemas/StudyOrderFlow"},{"$ref":"#/components/schemas/StudyValueArea"},{"$ref":"#/components/schemas/StudyVoids"},{"$ref":"#/components/schemas/StudyExpectedMove"},{"$ref":"#/components/schemas/StudyKeyLevels"},{"$ref":"#/components/schemas/StudyChopMeter"},{"$ref":"#/components/schemas/StudyEventClock"},{"type":"null"}],"description":"The read, by `id` (call: StudyCall, notes: StudyNotes, side: StudyCallLog, spread: StudySpreadFinder, moc: StudyClosingImbalance, close: StudyProjectedClose, gex: StudyGexMap, flow: StudyOrderFlow, value: StudyValueArea, voids: StudyVoids, move: StudyExpectedMove, levels: StudyKeyLevels, chop: StudyChopMeter, events: StudyEventClock). null when `status` is empty or the desk pauses it."},"note":{"type":["string","null"],"description":"What the study is and is not (its tested record), or why it is empty."}},"description":"One study: a member desk card as data."},"Studies":{"type":"object","required":["session","session_status","last_session","delayed","as_of","studies"],"properties":{"session":{"type":["string","null"],"description":"The session the desk shows, YYYY-MM-DD ET: today from the open, else the last one."},"session_status":{"type":["string","null"],"enum":["pre_open","open","closed",null]},"last_session":{"type":"boolean","description":"The session shown is closed and reads as it stood at the close: today's after its close, or the last session while today has not opened."},"delayed":{"type":"boolean","description":"In session, the engine's last write is over five minutes old."},"as_of":{"type":["string","null"],"format":"date-time","description":"The engine's last write."},"studies":{"type":"array","items":{"$ref":"#/components/schemas/Study"}}},"description":"The desk's studies for one session."}}}}