{"openapi":"3.1.0","info":{"title":"TraderSignal Signal Feed API","version":"1.0.0","description":"Read-only access to the TraderSignal model-portfolio signal feed — the HTTP twin of the TraderSignal MCP server (same data, same free/paid split). Every successful response is wrapped as { disclaimer, data }. The disclaimer states this is educational model-portfolio information only — not investment advice — and that TraderSignal never executes trades or accesses your account."},"servers":[{"url":"https://tradersignal.replit.app/api"}],"tags":[{"name":"Free","description":"Available to any signed-in account or valid API key."},{"name":"Paid","description":"Requires an active Signal Feed subscription (or admin)."}],"components":{"securitySchemes":{"ApiKey":{"type":"apiKey","in":"header","name":"X-API-Key","description":"A TraderSignal API key (prefix ts_). Generate one from your profile."},"ClerkSession":{"type":"apiKey","in":"cookie","name":"__session","description":"First-party browser session cookie (used by the TraderSignal web app)."}}},"security":[{"ApiKey":[]},{"ClerkSession":[]}],"paths":{"/v1/feed/performance":{"get":{"tags":["Free"],"summary":"Strategy track record","description":"Indexed return curve, total return %, and current long/short position counts. Non-actionable.","operationId":"getFeedPerformance","responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"disclaimer":{"type":"string","description":"Not-advice disclaimer attached to every payload."},"data":{"type":"object","properties":{"asOf":{"type":"string","format":"date-time","nullable":true},"series":{"type":"array","items":{"type":"object","properties":{"at":{"type":"string","format":"date-time"},"indexedReturn":{"type":"number","description":"Value relative to the first snapshot (1 = breakeven)."}},"required":["at","indexedReturn"]}},"totalReturnPct":{"type":"number","nullable":true},"positionCounts":{"type":"object","properties":{"numLongs":{"type":"integer"},"numShorts":{"type":"integer"},"numPositions":{"type":"integer"}},"required":["numLongs","numShorts","numPositions"]}},"required":["asOf","series","totalReturnPct","positionCounts"]}},"required":["disclaimer","data"]}}}},"401":{"description":"Missing or invalid credentials (no session and no valid X-API-Key).","content":{"application/json":{"schema":{"type":"object","properties":{"disclaimer":{"type":"string"},"error":{"type":"string"},"code":{"type":"string","description":"Stable machine code, e.g. signal_feed_subscription_required."},"docs":{"type":"string","description":"Absolute URL of this API's OpenAPI document."}},"required":["error"]}}}},"503":{"description":"The upstream strategy read is temporarily unavailable.","content":{"application/json":{"schema":{"type":"object","properties":{"disclaimer":{"type":"string"},"error":{"type":"string"},"code":{"type":"string","description":"Stable machine code, e.g. signal_feed_subscription_required."},"docs":{"type":"string","description":"Absolute URL of this API's OpenAPI document."}},"required":["error"]}}}}}}},"/v1/feed/snapshot":{"get":{"tags":["Paid"],"summary":"Current composition","description":"Every ticker with its signed target weight and side. Actionable — requires a Signal Feed subscription.","operationId":"getFeedSnapshot","responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"disclaimer":{"type":"string","description":"Not-advice disclaimer attached to every payload."},"data":{"type":"object","properties":{"asOf":{"type":"string","format":"date-time"},"positions":{"type":"array","items":{"type":"object","properties":{"symbol":{"type":"string"},"weight":{"type":"number","description":"Signed target weight (fraction of the portfolio; negative = short)."},"side":{"type":"string","enum":["long","short"]}},"required":["symbol","weight","side"]}}},"required":["asOf","positions"]}},"required":["disclaimer","data"]}}}},"401":{"description":"Missing or invalid credentials (no session and no valid X-API-Key).","content":{"application/json":{"schema":{"type":"object","properties":{"disclaimer":{"type":"string"},"error":{"type":"string"},"code":{"type":"string","description":"Stable machine code, e.g. signal_feed_subscription_required."},"docs":{"type":"string","description":"Absolute URL of this API's OpenAPI document."}},"required":["error"]}}}},"403":{"description":"Authenticated but lacking an active Signal Feed subscription (code: signal_feed_subscription_required).","content":{"application/json":{"schema":{"type":"object","properties":{"disclaimer":{"type":"string"},"error":{"type":"string"},"code":{"type":"string","description":"Stable machine code, e.g. signal_feed_subscription_required."},"docs":{"type":"string","description":"Absolute URL of this API's OpenAPI document."}},"required":["error"]}}}},"503":{"description":"The upstream strategy read is temporarily unavailable.","content":{"application/json":{"schema":{"type":"object","properties":{"disclaimer":{"type":"string"},"error":{"type":"string"},"code":{"type":"string","description":"Stable machine code, e.g. signal_feed_subscription_required."},"docs":{"type":"string","description":"Absolute URL of this API's OpenAPI document."}},"required":["error"]}}}}}}}}}