{"openapi":"3.1.0","info":{"title":"Fund Platform API","description":"Private multi-fund management service. All fund-scoped routes live under /api/funds/{slug}/…","version":"0.1.0"},"paths":{"/api/health":{"get":{"summary":"Health","operationId":"health_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Health Api Health Get"}}}}}}},"/api/auth/login":{"post":{"summary":"Auth Login","description":"Verify email+password, mint a session token. Returns the token\n(the web sets its own HTTP-only cookie from it) + the user.","operationId":"auth_login_api_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Auth Login Api Auth Login Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/clerk-sync":{"post":{"summary":"Internal Clerk Sync","description":"Server-to-server: the web tier has already verified the Clerk\nsession; here we upsert the local operator user/org and mint a\nfund_session. Guarded by a shared internal secret (never a user\nsession). Returns the token for the web to set as its cookie.","operationId":"internal_clerk_sync_api_internal_clerk_sync_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClerkSyncRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Internal Clerk Sync Api Internal Clerk Sync Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/logout":{"post":{"summary":"Auth Logout","operationId":"auth_logout_api_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Auth Logout Api Auth Logout Post"}}}}}}},"/api/auth/me":{"get":{"summary":"Auth Me","operationId":"auth_me_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Auth Me Api Auth Me Get"}}}}}}},"/api/auth/change-password":{"post":{"summary":"Auth Change Password","description":"Change the logged-in user's password (verify current → set new).","operationId":"auth_change_password_api_auth_change_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Auth Change Password Api Auth Change Password Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/keys":{"get":{"summary":"List Api Keys","description":"The current user's own API keys (masked — the full secret is shown\nonly once, at creation).","operationId":"list_api_keys_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Api Keys Api Keys Get"}}}}}},"post":{"summary":"Create Api Key","description":"Mint a new API key for the current user. Pro-tier, operators only.\nThe plaintext `secret` is returned ONCE — it cannot be recovered.","operationId":"create_api_key_api_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Api Key Api Keys Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/keys/{key_id}":{"delete":{"summary":"Revoke Api Key","description":"Revoke one of the current user's keys (ownership-checked).","operationId":"revoke_api_key_api_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Revoke Api Key Api Keys  Key Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/backfill-benchmarks":{"post":{"summary":"Backfill Benchmarks","description":"Backfill historical benchmark closes (SPY/QQQ/BOTZ/AIQ/CHAT/\nQTUM/SMH) into `benchmark_snapshots` for the past `period` of\ndaily candles. Used to seed history so longer period-return\nwindows (30d, 90d, YTD, inception) line up against real SPY\ndata without waiting for the daily cron to fill it in day by\nday. Idempotent — re-running just upserts the same closes.\n\nWrites shared reference data — owner/admin only (not org-scoped).","operationId":"backfill_benchmarks_api_backfill_benchmarks_post","parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","default":"1y","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Backfill Benchmarks Api Backfill Benchmarks Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/refresh-prices":{"post":{"summary":"Refresh Prices","description":"Manually pull the latest yfinance prices for every active\nticker across every fund AND every benchmark (so the SPY column\nin the period-returns table stays current). Sync — usually\n5–15s. Skips market caps and NAV snapshots (those are heavier\nand stay nightly). Returns a summary the UI can display.\n\nWrites the shared price_cache across all funds — owner/admin only.","operationId":"refresh_prices_api_refresh_prices_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Refresh Prices Api Refresh Prices Post"}}}}}}},"/api/funds":{"get":{"summary":"List Funds","description":"Fund list, scoped to the caller's org when authenticated (falls\nback to all real funds in report-only/no-auth mode). Hides the\nsynthetic `_platform_` row — it's plumbing, not a real fund.","operationId":"list_funds_api_funds_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Funds Api Funds Get"}}}}}},"post":{"summary":"Create Fund","description":"Register a new fund, owned by the caller's org. Validates the\nslug shape, rejects reserved / duplicate slugs, and checks the\noutgrowth sleeve (if any) is one of the declared sleeves.","operationId":"create_fund_api_funds_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFundRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Fund Api Funds Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}":{"get":{"summary":"Get Fund","operationId":"get_fund_api_funds__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Fund Api Funds  Slug  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Update Fund","description":"Partial update of a fund's editable config.","operationId":"update_fund_api_funds__slug__patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FundUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Fund Api Funds  Slug  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/sleeve-usage":{"get":{"summary":"Get Fund Sleeve Usage","description":"The fund's sleeves + how many active constituents sit on each — feeds\nthe Sleeves editor's impact display.","operationId":"get_fund_sleeve_usage_api_funds__slug__sleeve_usage_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Fund Sleeve Usage Api Funds  Slug  Sleeve Usage Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/sleeves":{"put":{"summary":"Put Fund Sleeves","description":"Edit a fund's sleeves, migrating attached constituents (rename →\nmove; remove → reassign). Rejects any change that would orphan names.\nLeaves the outgrowth rule intact (following a rename).","operationId":"put_fund_sleeves_api_funds__slug__sleeves_put","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SleeveConfigRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Fund Sleeves Api Funds  Slug  Sleeves Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Get Sleeves","description":"Per-sleeve performance breakdown.","operationId":"get_sleeves_api_funds__slug__sleeves_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Sleeves Api Funds  Slug  Sleeves Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/outgrowth":{"put":{"summary":"Put Fund Outgrowth","description":"Set the fund's outgrowth rule (sleeve + ceiling), independent of the\nsleeve list.","operationId":"put_fund_outgrowth_api_funds__slug__outgrowth_put","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutgrowthRuleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Fund Outgrowth Api Funds  Slug  Outgrowth Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/clone":{"post":{"summary":"Clone Fund","description":"Clone a published strategy into the caller's org — roster + strategy\ndoc only, no positions/cash. The source must be public (or already the\ncaller's). Respects the Basic single-fund limit.","operationId":"clone_fund_api_funds_clone_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloneFundRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Clone Fund Api Funds Clone Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/secrets":{"get":{"summary":"Get Org Secrets","description":"Per-provider presence/source/masked-suffix for the settings UI.\nAny org member can view; the actual secrets are never returned.","operationId":"get_org_secrets_api_orgs__org_id__secrets_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Org Secrets Api Orgs  Org Id  Secrets Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/ai-usage":{"get":{"summary":"Get Ai Usage","description":"Free-tier AI usage for the org: whether it's on its own Anthropic\nkey, the monthly limit, and Review/Discovery runs used this month.","operationId":"get_ai_usage_api_orgs__org_id__ai_usage_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ai Usage Api Orgs  Org Id  Ai Usage Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/secrets/{provider}":{"put":{"summary":"Put Org Secret","description":"Set/replace a provider's token(s). Owner/admin only.","operationId":"put_org_secret_api_orgs__org_id__secrets__provider__put","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetSecretRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Org Secret Api Orgs  Org Id  Secrets  Provider  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Org Secret","description":"Remove a provider's stored token (reverts to env fallback, if\nany). Owner/admin only.","operationId":"delete_org_secret_api_orgs__org_id__secrets__provider__delete","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Org Secret Api Orgs  Org Id  Secrets  Provider  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/live-prices":{"get":{"summary":"Get Live Prices","description":"Near-real-time quotes for the fund's roster, served from a short\nshared cache over Alpaca snapshots. `configured=false` when the org\nhas no broker; `market_open=false` tells the client to slow its\npolling to a trickle.","operationId":"get_live_prices_api_funds__slug__live_prices_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Live Prices Api Funds  Slug  Live Prices Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/live-prices":{"get":{"summary":"Get Org Live Prices","description":"Near-real-time quotes for EVERY active ticker across the org's\nfunds — one shared snapshot serves the Everything page no matter\nhow many funds exist.","operationId":"get_org_live_prices_api_orgs__org_id__live_prices_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Org Live Prices Api Orgs  Org Id  Live Prices Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/intraday":{"get":{"summary":"Get Fund Intraday","description":"NAV series for one fund (the Overview chart): today, or the\ncurrent week with ?range=week.","operationId":"get_fund_intraday_api_funds__slug__intraday_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"range","in":"query","required":false,"schema":{"type":"string","default":"day","title":"Range"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Fund Intraday Api Funds  Slug  Intraday Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/intraday":{"get":{"summary":"Get Org Intraday","description":"Combined NAV series across the org's funds (the Everything\nchart), plus a per-fund series for the multi-line view.","operationId":"get_org_intraday_api_orgs__org_id__intraday_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"range","in":"query","required":false,"schema":{"type":"string","default":"day","title":"Range"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Org Intraday Api Orgs  Org Id  Intraday Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/account":{"get":{"summary":"Get Broker Account","description":"Live brokerage account for the org (cash / buying power / equity)\nfrom Alpaca. `configured=false` when no Alpaca creds are stored.","operationId":"get_broker_account_api_orgs__org_id__account_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Broker Account Api Orgs  Org Id  Account Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/fund-targets":{"get":{"summary":"Get Fund Targets","description":"Account-level fund allocation targets + target-vs-actual drift\n(actual = each fund's share of net contributed capital).","operationId":"get_fund_targets_api_orgs__org_id__fund_targets_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Fund Targets Api Orgs  Org Id  Fund Targets Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Fund Targets","description":"Replace the account's fund targets. Owner/admin only.","operationId":"put_fund_targets_api_orgs__org_id__fund_targets_put","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FundTargetsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Fund Targets Api Orgs  Org Id  Fund Targets Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/fund-targets/history":{"get":{"summary":"Get Fund Target History","description":"Each fund's share of net contributed capital over time (for the\naccount-mix chart).","operationId":"get_fund_target_history_api_orgs__org_id__fund_targets_history_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Fund Target History Api Orgs  Org Id  Fund Targets History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/fund-targets/rebalance-plan":{"get":{"summary":"Get Fund Target Rebalance Plan","description":"Trade plan to pull each fund toward its target share of deployed\nmarket value: per-fund trims (sells) and deploys (buys).","operationId":"get_fund_target_rebalance_plan_api_orgs__org_id__fund_targets_rebalance_plan_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"tolerance_pct","in":"query","required":false,"schema":{"type":"number","default":1.0,"title":"Tolerance Pct"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Fund Target Rebalance Plan Api Orgs  Org Id  Fund Targets Rebalance Plan Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/fund-targets/suggest":{"get":{"summary":"Get Fund Target Suggestion","description":"Suggested per-fund split of a new deposit toward the targets.","operationId":"get_fund_target_suggestion_api_orgs__org_id__fund_targets_suggest_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"amount","in":"query","required":true,"schema":{"type":"number","title":"Amount"}},{"name":"mode","in":"query","required":false,"schema":{"type":"string","default":"drift_aware","title":"Mode"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Fund Target Suggestion Api Orgs  Org Id  Fund Targets Suggest Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/waitlist":{"post":{"summary":"Post Waitlist","description":"Join the waitlist from the public landing page. Always returns\n{ok: true} on a well-formed email (idempotent on duplicates) so the\nform can't be used to probe which addresses are registered.","operationId":"post_waitlist_api_waitlist_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaitlistRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Post Waitlist Api Waitlist Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/reconciliation":{"get":{"summary":"Get Reconciliation","description":"Read-only reconciliation preview: compares Alpaca to the local\nbook without mirroring positions or raising alerts. `configured=false`\nwhen no Alpaca creds are stored.","operationId":"get_reconciliation_api_orgs__org_id__reconciliation_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Reconciliation Api Orgs  Org Id  Reconciliation Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/reconcile":{"post":{"summary":"Post Reconcile","description":"Run reconciliation: mirror Alpaca positions into the local book\nand raise notifications for any untracked positions.","operationId":"post_reconcile_api_orgs__org_id__reconcile_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Post Reconcile Api Orgs  Org Id  Reconcile Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/guardrails":{"get":{"summary":"Get Guardrails","description":"The org's trading guardrail config + kill switch.","operationId":"get_guardrails_api_orgs__org_id__guardrails_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Guardrails Api Orgs  Org Id  Guardrails Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Guardrails","description":"Replace the org's guardrail config. Any org member can edit; the\nkill switch is the fast path to halt all order submission.","operationId":"put_guardrails_api_orgs__org_id__guardrails_put","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuardrailsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Guardrails Api Orgs  Org Id  Guardrails Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/ai-models":{"get":{"summary":"Get Ai Models","description":"The org's Claude model config + what each workflow effectively\nresolves to.","operationId":"get_ai_models_api_orgs__org_id__ai_models_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ai Models Api Orgs  Org Id  Ai Models Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Ai Models","description":"Replace the org's model config (empty fields = inherit). Choosing\nmodels is a Pro feature; non-Pro orgs are pinned to Opus 4.6.","operationId":"put_ai_models_api_orgs__org_id__ai_models_put","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiModelsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Ai Models Api Orgs  Org Id  Ai Models Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/order-batches":{"post":{"summary":"Create Order Batch","description":"Create a PROPOSED order batch from a list of order items (the\nfrontend builds these from a rebalance/allocate/withdraw plan, or\nenters them manually). Nothing is sent to the broker until approve.","operationId":"create_order_batch_api_funds__slug__order_batches_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Order Batch Api Funds  Slug  Order Batches Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"List Order Batches","operationId":"list_order_batches_api_funds__slug__order_batches_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Order Batches Api Funds  Slug  Order Batches Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/order-batches/{batch_id}":{"get":{"summary":"Get Order Batch","operationId":"get_order_batch_api_funds__slug__order_batches__batch_id__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"batch_id","in":"path","required":true,"schema":{"type":"integer","title":"Batch Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Order Batch Api Funds  Slug  Order Batches  Batch Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/order-batches/{batch_id}/approve":{"post":{"summary":"Approve Order Batch","description":"Approve + execute the batch against the broker (paper/live per\nthe org's Alpaca creds), then mirror positions.","operationId":"approve_order_batch_api_funds__slug__order_batches__batch_id__approve_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"batch_id","in":"path","required":true,"schema":{"type":"integer","title":"Batch Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Approve Order Batch Api Funds  Slug  Order Batches  Batch Id  Approve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/order-batches/{batch_id}/refresh":{"post":{"summary":"Refresh Order Batch","description":"Re-poll order fill status from the broker + re-sync positions.","operationId":"refresh_order_batch_api_funds__slug__order_batches__batch_id__refresh_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"batch_id","in":"path","required":true,"schema":{"type":"integer","title":"Batch Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Refresh Order Batch Api Funds  Slug  Order Batches  Batch Id  Refresh Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/stop-loss-batches":{"post":{"summary":"Post Stop Loss Batch","description":"One-click exit for a stop-loss alert: a proposed sell batch for\nthe position's FULL share count, landing in the Trade inbox for the\nnormal review + approve flow (the stop-loss is a recommendation —\nnothing executes without approval).","operationId":"post_stop_loss_batch_api_funds__slug__stop_loss_batches_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StopLossBatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Post Stop Loss Batch Api Funds  Slug  Stop Loss Batches Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/order-batches/{batch_id}/discard":{"post":{"summary":"Discard Order Batch","operationId":"discard_order_batch_api_funds__slug__order_batches__batch_id__discard_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"batch_id","in":"path","required":true,"schema":{"type":"integer","title":"Batch Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Discard Order Batch Api Funds  Slug  Order Batches  Batch Id  Discard Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/order-batches/{batch_id}/orders/{order_id}":{"delete":{"summary":"Remove Order From Batch","description":"Remove one staged order from a proposed batch before execution.","operationId":"remove_order_from_batch_api_funds__slug__order_batches__batch_id__orders__order_id__delete","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"batch_id","in":"path","required":true,"schema":{"type":"integer","title":"Batch Id"}},{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Remove Order From Batch Api Funds  Slug  Order Batches  Batch Id  Orders  Order Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/members":{"get":{"summary":"Get Org Members","description":"List the org's users — active (signed in at least once via a\npassword or Clerk) and pending (invited, not yet accepted).","operationId":"get_org_members_api_orgs__org_id__members_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Org Members Api Orgs  Org Id  Members Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/members/{member_id}":{"patch":{"summary":"Patch Org Member","description":"Change a member's role (owner/admin). Won't demote the last\nowner — an org must always keep one.","operationId":"patch_org_member_api_orgs__org_id__members__member_id__patch","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","title":"Member Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMemberRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patch Org Member Api Orgs  Org Id  Members  Member Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Org Member","description":"Remove a member (owner/admin). Can't remove yourself or the last\nowner.","operationId":"delete_org_member_api_orgs__org_id__members__member_id__delete","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","title":"Member Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Org Member Api Orgs  Org Id  Members  Member Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/invites":{"post":{"summary":"Post Org Invite","description":"Invite an email into the org (owner/admin). Returns a single-use\ntoken; the caller builds the accept link to share.","operationId":"post_org_invite_api_orgs__org_id__invites_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Post Org Invite Api Orgs  Org Id  Invites Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/invites/{token}":{"get":{"summary":"Get Invite","description":"Public: invite details for the accept page (or 404).","operationId":"get_invite_api_invites__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Invite Api Invites  Token  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/invites/{token}/accept":{"post":{"summary":"Post Accept Invite","description":"Public: set the invited user's password, consume the invite, and\nreturn a session (auto-login).","operationId":"post_accept_invite_api_invites__token__accept_post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptInviteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Post Accept Invite Api Invites  Token  Accept Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/constituents":{"get":{"summary":"Get Constituents","operationId":"get_constituents_api_funds__slug__constituents_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Constituents Api Funds  Slug  Constituents Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Post Constituent","description":"Add a new constituent. Validates the sleeve against the fund's\nconfig and refuses if the ticker is active in another fund.","operationId":"post_constituent_api_funds__slug__constituents_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddConstituentRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Post Constituent Api Funds  Slug  Constituents Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/paper-performance":{"get":{"summary":"Get Paper Performance","description":"Hypothetical 'since added' price return per constituent —\nindependent of actual ownership — plus the SPY return over the same\nwindow and the relative spread. For stress-testing new ideas.","operationId":"get_paper_performance_api_funds__slug__paper_performance_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Paper Performance Api Funds  Slug  Paper Performance Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/equity-search":{"get":{"summary":"Equity Search","description":"Autocomplete over the broker's tradable US-equity universe (symbol +\nname), for the smart Add-constituent flow. Only tradable + fractionable\nnames (those that pass the add validation) are returned. The full asset\nlist is cached ~6h across the platform.","operationId":"equity_search_api_equity_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Equity Search Api Equity Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/constituents/suggest":{"post":{"summary":"Suggest Constituent","description":"Classify a candidate into the fund's taxonomy and propose a thesis +\nstarting weight (owner/admin; unmetered convenience). All fields are\neditable before the operator commits the add.","operationId":"suggest_constituent_api_funds__slug__constituents_suggest_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuggestConstituentRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Suggest Constituent Api Funds  Slug  Constituents Suggest Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/constituents/{ticker}":{"delete":{"summary":"Delete Constituent","description":"Soft-delete (sets removed_date). Refuses if shares > 0 unless\n`?force=true`.","operationId":"delete_constituent_api_funds__slug__constituents__ticker__delete","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Delete Constituent Api Funds  Slug  Constituents  Ticker  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Get Constituent Detail","description":"Pre-joined detail view used by the constituent modal.","operationId":"get_constituent_detail_api_funds__slug__constituents__ticker__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Constituent Detail Api Funds  Slug  Constituents  Ticker  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Patch Constituent","description":"Partial update — pin/unpin, edit target weight, edit thesis.","operationId":"patch_constituent_api_funds__slug__constituents__ticker__patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConstituentPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patch Constituent Api Funds  Slug  Constituents  Ticker  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/set-weights":{"post":{"summary":"Post Set Weights","description":"One-click for AI Review's `weighting_recommendations.per_name`\nrows: pass `{ticker: pct, ...}` and the fund's other weights\nrescale to keep the total at 100%.","operationId":"post_set_weights_api_funds__slug__set_weights_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetWeightsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Post Set Weights Api Funds  Slug  Set Weights Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/set-band-weight":{"post":{"summary":"Post Set Band Weight","description":"One-click for AI Review's `weighting_recommendations.bands`\nrows: pass `{band: target_sum_pct, ...}` and the constituents\ninside each band rescale proportionally to hit the new target.\nUnpinned constituents in other bands absorb the slack so the\nfund total stays 100%.","operationId":"post_set_band_weight_api_funds__slug__set_band_weight_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetBandWeightsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Post Set Band Weight Api Funds  Slug  Set Band Weight Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/normalize-weights":{"post":{"summary":"Post Normalize Weights","description":"One-click normalize for the Constituents page. Mode is\n'proportional' (default) or 'equal_by_sleeve' (two-sleeve funds).","operationId":"post_normalize_weights_api_funds__slug__normalize_weights_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/NormalizeWeightsRequest"},{"type":"null"}],"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Post Normalize Weights Api Funds  Slug  Normalize Weights Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/constituents/unpin-all":{"post":{"summary":"Unpin All Constituents","description":"Unpin every constituent in the fund in one shot.","operationId":"unpin_all_constituents_api_funds__slug__constituents_unpin_all_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Unpin All Constituents Api Funds  Slug  Constituents Unpin All Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/holdings":{"get":{"summary":"Get Holdings","operationId":"get_holdings_api_funds__slug__holdings_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Holdings Api Funds  Slug  Holdings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/bands":{"get":{"summary":"Get Bands","operationId":"get_bands_api_funds__slug__bands_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Bands Api Funds  Slug  Bands Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/bands/{band}/suspend":{"put":{"summary":"Put Band Suspended","description":"Suspend (unmanage) or resume a band: no breach alerts and excluded\nfrom rebalancing while suspended. Reversible.","operationId":"put_band_suspended_api_funds__slug__bands__band__suspend_put","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"band","in":"path","required":true,"schema":{"type":"string","title":"Band"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BandSuspendRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Band Suspended Api Funds  Slug  Bands  Band  Suspend Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/positions":{"get":{"summary":"Get Positions","description":"Joined view: constituents × holdings × prices → PositionView per\nname, plus total NAV and band-level aggregates.","operationId":"get_positions_api_funds__slug__positions_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Positions Api Funds  Slug  Positions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/constituents/{ticker}/price-history":{"get":{"summary":"Get Constituent Price History","description":"Daily split-adjusted closes for one constituent over the past `days`,\nfor the price chart in the constituent modal. Alpaca daily bars, cached ~10m.","operationId":"get_constituent_price_history_api_funds__slug__constituents__ticker__price_history_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":180,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Constituent Price History Api Funds  Slug  Constituents  Ticker  Price History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/constituents/{ticker}/news":{"get":{"summary":"Get Constituent News","description":"Recent news for one constituent (Benzinga via Alpaca), newest first,\nfor the constituent modal. Reuses the org's Alpaca creds, cached ~10m.","operationId":"get_constituent_news_api_funds__slug__constituents__ticker__news_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":8,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Constituent News Api Funds  Slug  Constituents  Ticker  News Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/nav":{"get":{"summary":"Get Nav","description":"NAV summary + today's flow-adjusted change.","operationId":"get_nav_api_funds__slug__nav_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Nav Api Funds  Slug  Nav Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/snapshots":{"get":{"summary":"Get Snapshots","description":"NAV history for the fund-vs-benchmark chart.","operationId":"get_snapshots_api_funds__slug__snapshots_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Snapshots Api Funds  Slug  Snapshots Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/notifications":{"get":{"summary":"Get Notifications","description":"The fund's alerts feed — most-recent first. Includes\nplatform-wide (NULL fund_id) alerts. `unread_count` is always the\nfull unread total, independent of the `unread_only` list filter.","operationId":"get_notifications_api_funds__slug__notifications_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"unread_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Unread Only"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Notifications Api Funds  Slug  Notifications Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/notifications/{notification_id}/read":{"post":{"summary":"Post Mark Notification Read","description":"Mark one alert read (must belong to this fund or be\nplatform-wide).","operationId":"post_mark_notification_read_api_funds__slug__notifications__notification_id__read_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"notification_id","in":"path","required":true,"schema":{"type":"integer","title":"Notification Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Post Mark Notification Read Api Funds  Slug  Notifications  Notification Id  Read Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/notifications/read-all":{"post":{"summary":"Post Mark All Notifications Read","description":"Mark every alert in the fund's feed read.","operationId":"post_mark_all_notifications_read_api_funds__slug__notifications_read_all_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Post Mark All Notifications Read Api Funds  Slug  Notifications Read All Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/rebalance":{"get":{"summary":"Get Rebalance","description":"Drift-correction plan: buy/sell actions to bring each\nover-/under-target name back inside `tolerance_pct` of its\ntarget weight. Pinned names drift-correct toward their pin.","operationId":"get_rebalance_api_funds__slug__rebalance_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"tolerance_pct","in":"query","required":false,"schema":{"type":"number","default":0.25,"title":"Tolerance Pct"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Rebalance Api Funds  Slug  Rebalance Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/allocate-new-capital":{"post":{"summary":"Post Allocate","description":"Plan buys for new capital. Returns the same `actions` shape as\n`/rebalance` (all `action='buy'`), plus a `residual` showing\nunallocated cash.","operationId":"post_allocate_api_funds__slug__allocate_new_capital_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllocateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Post Allocate Api Funds  Slug  Allocate New Capital Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/withdraw-capital":{"post":{"summary":"Post Withdraw","description":"Plan sells to draw capital out of the fund. Returns the same\n`actions` shape as `/allocate-new-capital` (all `action='sell'`),\nplus a `residual` showing any amount that couldn't be sold (e.g.\na withdrawal larger than reachable holdings).","operationId":"post_withdraw_api_funds__slug__withdraw_capital_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WithdrawRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Post Withdraw Api Funds  Slug  Withdraw Capital Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/transactions/{txn_id}":{"delete":{"summary":"Delete Transaction","description":"Delete a transaction + reverse its effect on holdings and cash.\nOwner/admin only; refuses if the transaction belongs to a different\nfund.","operationId":"delete_transaction_api_funds__slug__transactions__txn_id__delete","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"txn_id","in":"path","required":true,"schema":{"type":"integer","title":"Txn Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Delete Transaction Api Funds  Slug  Transactions  Txn Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/transactions":{"get":{"summary":"Get Transactions","description":"Recent transactions, newest first.","operationId":"get_transactions_api_funds__slug__transactions_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Transactions Api Funds  Slug  Transactions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/alerts":{"get":{"summary":"Get Alerts","description":"All strategy alerts firing for the active fund. Severity-sorted\n(critical → warn → info).","operationId":"get_alerts_api_funds__slug__alerts_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Alerts Api Funds  Slug  Alerts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/period-returns":{"get":{"summary":"Get Period Returns","description":"7d / 30d / 90d / YTD / inception returns + paired SPY.","operationId":"get_period_returns_api_funds__slug__period_returns_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Period Returns Api Funds  Slug  Period Returns Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/aggregate/nav":{"get":{"summary":"Get Aggregate Nav","description":"Combined NAV / cost / unrealized P&L / today across the caller's\nfunds, plus a per-fund breakdown. Powers the 'Everything' space.","operationId":"get_aggregate_nav_api_aggregate_nav_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Aggregate Nav Api Aggregate Nav Get"}}}}}}},"/api/aggregate/period-returns":{"get":{"summary":"Get Aggregate Period Returns","description":"7d/30d/90d/YTD/inception Modified-Dietz returns on the caller's\ncombined NAV series, paired with SPY.","operationId":"get_aggregate_period_returns_api_aggregate_period_returns_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Aggregate Period Returns Api Aggregate Period Returns Get"}}}}}}},"/api/orgs/{org_id}/investors":{"get":{"summary":"Get Org Investors","operationId":"get_org_investors_api_orgs__org_id__investors_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Org Investors Api Orgs  Org Id  Investors Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Org Investor","operationId":"create_org_investor_api_orgs__org_id__investors_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInvestorRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Org Investor Api Orgs  Org Id  Investors Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/investors/{investor_id}":{"patch":{"summary":"Update Org Investor","operationId":"update_org_investor_api_orgs__org_id__investors__investor_id__patch","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"investor_id","in":"path","required":true,"schema":{"type":"integer","title":"Investor Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateInvestorRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Org Investor Api Orgs  Org Id  Investors  Investor Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Org Investor","operationId":"delete_org_investor_api_orgs__org_id__investors__investor_id__delete","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"investor_id","in":"path","required":true,"schema":{"type":"integer","title":"Investor Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Delete Org Investor Api Orgs  Org Id  Investors  Investor Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/investors/{investor_id}/rollup":{"get":{"summary":"Get Org Investor Rollup","operationId":"get_org_investor_rollup_api_orgs__org_id__investors__investor_id__rollup_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"investor_id","in":"path","required":true,"schema":{"type":"integer","title":"Investor Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Org Investor Rollup Api Orgs  Org Id  Investors  Investor Id  Rollup Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/capital-flows":{"get":{"summary":"List Capital Flows","operationId":"list_capital_flows_api_orgs__org_id__capital_flows_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Capital Flows Api Orgs  Org Id  Capital Flows Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Capital Flow","operationId":"create_capital_flow_api_orgs__org_id__capital_flows_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCapitalFlowRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Capital Flow Api Orgs  Org Id  Capital Flows Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/transfers":{"post":{"summary":"Transfer Between Funds","description":"Move GP-earmarked undeployed cash between two funds (redeem from the\nGP in the source, contribute to the GP in the destination). Owner/admin\nonly; GP capital only — investor stakes stay with their fund.","operationId":"transfer_between_funds_api_orgs__org_id__transfers_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferBetweenFundsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Transfer Between Funds Api Orgs  Org Id  Transfers Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/capital-flows/{flow_id}":{"delete":{"summary":"Delete Capital Flow","operationId":"delete_capital_flow_api_orgs__org_id__capital_flows__flow_id__delete","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"flow_id","in":"path","required":true,"schema":{"type":"integer","title":"Flow Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Delete Capital Flow Api Orgs  Org Id  Capital Flows  Flow Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/capital-flows/{flow_id}/dismiss":{"post":{"summary":"Dismiss Capital Flow","description":"Soft-resolve an open flow without posting it — for a deposit already\ncounted in contributed capital. The row is kept so the broker sync\nwon't recreate it. Owner/admin only.","operationId":"dismiss_capital_flow_api_orgs__org_id__capital_flows__flow_id__dismiss_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"flow_id","in":"path","required":true,"schema":{"type":"integer","title":"Flow Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Dismiss Capital Flow Api Orgs  Org Id  Capital Flows  Flow Id  Dismiss Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/capital-flows/{flow_id}/allocations":{"post":{"summary":"Add Capital Allocation","operationId":"add_capital_allocation_api_orgs__org_id__capital_flows__flow_id__allocations_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"flow_id","in":"path","required":true,"schema":{"type":"integer","title":"Flow Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddAllocationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Add Capital Allocation Api Orgs  Org Id  Capital Flows  Flow Id  Allocations Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/capital-flows/{flow_id}/allocations/{alloc_id}":{"delete":{"summary":"Delete Capital Allocation","operationId":"delete_capital_allocation_api_orgs__org_id__capital_flows__flow_id__allocations__alloc_id__delete","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"flow_id","in":"path","required":true,"schema":{"type":"integer","title":"Flow Id"}},{"name":"alloc_id","in":"path","required":true,"schema":{"type":"integer","title":"Alloc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Capital Allocation Api Orgs  Org Id  Capital Flows  Flow Id  Allocations  Alloc Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/capital-flows/{flow_id}/clear":{"post":{"summary":"Clear Capital Flow","operationId":"clear_capital_flow_api_orgs__org_id__capital_flows__flow_id__clear_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"flow_id","in":"path","required":true,"schema":{"type":"integer","title":"Flow Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Clear Capital Flow Api Orgs  Org Id  Capital Flows  Flow Id  Clear Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/capital-sync":{"post":{"summary":"Post Capital Sync","description":"Pull deposit/withdrawal activity from Alpaca and create capital flows\nfor any new transfers (deduped by activity id). Single-fund/GP-only orgs\nauto-attribute + clear; everything else lands as a pending flow to\nattribute. Owner/admin only.","operationId":"post_capital_sync_api_orgs__org_id__capital_sync_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Post Capital Sync Api Orgs  Org Id  Capital Sync Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/onboarding":{"get":{"summary":"Get Onboarding Status","operationId":"get_onboarding_status_api_orgs__org_id__onboarding_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Onboarding Status Api Orgs  Org Id  Onboarding Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/onboarding-checklist":{"get":{"summary":"Get Org Onboarding Checklist","description":"Ongoing setup checklist for the org (drives the 'Get started' nav\nitem + count badge). Pro orgs also get promote/investor items.","operationId":"get_org_onboarding_checklist_api_orgs__org_id__onboarding_checklist_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Org Onboarding Checklist Api Orgs  Org Id  Onboarding Checklist Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/onboarding-checklist":{"get":{"summary":"Get Fund Onboarding Checklist","description":"Ongoing setup checklist for one fund (drives its 'Get started' nav\nitem + count badge).","operationId":"get_fund_onboarding_checklist_api_funds__slug__onboarding_checklist_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Fund Onboarding Checklist Api Funds  Slug  Onboarding Checklist Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/onboarding/complete":{"post":{"summary":"Complete Onboarding","operationId":"complete_onboarding_api_orgs__org_id__onboarding_complete_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompleteOnboardingRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Complete Onboarding Api Orgs  Org Id  Onboarding Complete Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/units":{"get":{"summary":"Get Fund Units","operationId":"get_fund_units_api_funds__slug__units_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Fund Units Api Funds  Slug  Units Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/units/initialize":{"post":{"summary":"Initialize Fund Units","description":"Unitization cutover — GP becomes sole holder at $100/unit. Pass\n`starting_cash` to include uninvested cash in the GP's basis (cutover)\nor to bootstrap an empty account from the GP's opening deposit.","operationId":"initialize_fund_units_api_funds__slug__units_initialize_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/InitializeUnitsRequest"},{"type":"null"}],"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Initialize Fund Units Api Funds  Slug  Units Initialize Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/commitments":{"get":{"summary":"Get Fund Commitments","operationId":"get_fund_commitments_api_funds__slug__commitments_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"include_closed","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Closed"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Fund Commitments Api Funds  Slug  Commitments Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/commitments/contribute":{"post":{"summary":"Post Contribute","operationId":"post_contribute_api_funds__slug__commitments_contribute_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContributeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Post Contribute Api Funds  Slug  Commitments Contribute Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/commitments/redeem":{"post":{"summary":"Post Redeem","operationId":"post_redeem_api_funds__slug__commitments_redeem_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeemRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Post Redeem Api Funds  Slug  Commitments Redeem Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/commitments/{commitment_id}/value-series":{"get":{"summary":"Get Commitment Value Series","operationId":"get_commitment_value_series_api_funds__slug__commitments__commitment_id__value_series_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"commitment_id","in":"path","required":true,"schema":{"type":"integer","title":"Commitment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Commitment Value Series Api Funds  Slug  Commitments  Commitment Id  Value Series Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/fee-terms":{"get":{"summary":"Get Fund Fee Terms","operationId":"get_fund_fee_terms_api_funds__slug__fee_terms_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Fund Fee Terms Api Funds  Slug  Fee Terms Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Fund Fee Terms","operationId":"put_fund_fee_terms_api_funds__slug__fee_terms_put","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeeTermsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Fund Fee Terms Api Funds  Slug  Fee Terms Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/fees/crystallize":{"post":{"summary":"Post Crystallize Fees","description":"Crystallize management + performance (carry) fees for the fund now\n(the cron does mgmt monthly + carry annually; this is the manual\ntrigger that settles both). Owner/admin only.","operationId":"post_crystallize_fees_api_funds__slug__fees_crystallize_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Post Crystallize Fees Api Funds  Slug  Fees Crystallize Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/promotion":{"get":{"summary":"Get Fund Promotion","operationId":"get_fund_promotion_api_funds__slug__promotion_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Fund Promotion Api Funds  Slug  Promotion Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Fund Promotion","operationId":"put_fund_promotion_api_funds__slug__promotion_put","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromotionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Fund Promotion Api Funds  Slug  Promotion Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/promotion/generate":{"post":{"summary":"Generate Fund Promotion","description":"AI-draft a compliant public tagline + summary from the fund's\nmakeup. Owner/admin only; the operator reviews + saves separately.","operationId":"generate_fund_promotion_api_funds__slug__promotion_generate_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Generate Fund Promotion Api Funds  Slug  Promotion Generate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/strategy/generate":{"post":{"summary":"Generate Fund Strategy","description":"AI-author a strategy doc from the operator's brief + the fund's\nstructure. Owner/admin only; the operator reviews + saves separately\n(via PATCH /api/funds/{slug}).","operationId":"generate_fund_strategy_api_funds__slug__strategy_generate_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateStrategyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Generate Fund Strategy Api Funds  Slug  Strategy Generate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/interest":{"get":{"summary":"Get Fund Interest","operationId":"get_fund_interest_api_funds__slug__interest_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Fund Interest Api Funds  Slug  Interest Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/interest/{interest_id}":{"patch":{"summary":"Patch Fund Interest","operationId":"patch_fund_interest_api_funds__slug__interest__interest_id__patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"interest_id","in":"path","required":true,"schema":{"type":"integer","title":"Interest Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterestStatusRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patch Fund Interest Api Funds  Slug  Interest  Interest Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/funds":{"get":{"summary":"Public List Funds","operationId":"public_list_funds_api_public_funds_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Public List Funds Api Public Funds Get"}}}}}}},"/api/public/funds/{slug}":{"get":{"summary":"Public Get Fund","operationId":"public_get_fund_api_public_funds__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Public Get Fund Api Public Funds  Slug  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/funds/{slug}/interest":{"post":{"summary":"Public Submit Interest","description":"Record a non-binding indication of interest. Always returns\n{ok: true} for a well-formed submission so the form can't enumerate\nfunds; raises 400 only on a malformed email (the field-level error the\nform surfaces inline).","operationId":"public_submit_interest_api_public_funds__slug__interest_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicInterestRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Public Submit Interest Api Public Funds  Slug  Interest Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/contact":{"post":{"summary":"Public Contact","description":"Marketing 'Contact us' form → emails the team via Resend, with the\nsubmitter set as reply-to. Public + insert-only; honeypot-guarded.","operationId":"public_contact_api_public_contact_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Public Contact Api Public Contact Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/investor/me":{"get":{"summary":"Investor Me","operationId":"investor_me_api_investor_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Investor Me Api Investor Me Get"}}}}}}},"/api/investor/commitments":{"get":{"summary":"Investor Commitments","operationId":"investor_commitments_api_investor_commitments_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Investor Commitments Api Investor Commitments Get"}}}}}}},"/api/investor/commitments/{commitment_id}":{"get":{"summary":"Investor Commitment Detail","operationId":"investor_commitment_detail_api_investor_commitments__commitment_id__get","parameters":[{"name":"commitment_id","in":"path","required":true,"schema":{"type":"integer","title":"Commitment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Investor Commitment Detail Api Investor Commitments  Commitment Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/investor/commitments/{commitment_id}/value-series":{"get":{"summary":"Investor Value Series","operationId":"investor_value_series_api_investor_commitments__commitment_id__value_series_get","parameters":[{"name":"commitment_id","in":"path","required":true,"schema":{"type":"integer","title":"Commitment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Investor Value Series Api Investor Commitments  Commitment Id  Value Series Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/investor/withdrawal-requests":{"get":{"summary":"Investor Withdrawal Requests","operationId":"investor_withdrawal_requests_api_investor_withdrawal_requests_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Investor Withdrawal Requests Api Investor Withdrawal Requests Get"}}}}}},"post":{"summary":"Create Investor Withdrawal Request","operationId":"create_investor_withdrawal_request_api_investor_withdrawal_requests_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WithdrawalRequestBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Investor Withdrawal Request Api Investor Withdrawal Requests Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/investor/withdrawal-requests/{request_id}/cancel":{"post":{"summary":"Cancel Investor Withdrawal Request","operationId":"cancel_investor_withdrawal_request_api_investor_withdrawal_requests__request_id__cancel_post","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cancel Investor Withdrawal Request Api Investor Withdrawal Requests  Request Id  Cancel Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/withdrawal-requests":{"get":{"summary":"List Org Withdrawal Requests","operationId":"list_org_withdrawal_requests_api_orgs__org_id__withdrawal_requests_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Org Withdrawal Requests Api Orgs  Org Id  Withdrawal Requests Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/withdrawal-requests/{request_id}/approve":{"post":{"summary":"Approve Org Withdrawal Request","operationId":"approve_org_withdrawal_request_api_orgs__org_id__withdrawal_requests__request_id__approve_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Approve Org Withdrawal Request Api Orgs  Org Id  Withdrawal Requests  Request Id  Approve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/withdrawal-requests/{request_id}/decline":{"post":{"summary":"Decline Org Withdrawal Request","operationId":"decline_org_withdrawal_request_api_orgs__org_id__withdrawal_requests__request_id__decline_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/DeclineWithdrawalBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Decline Org Withdrawal Request Api Orgs  Org Id  Withdrawal Requests  Request Id  Decline Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/investors/{investor_id}/invite":{"post":{"summary":"Post Investor Invite","description":"Invite an investor to the read-only portal (owner/admin).","operationId":"post_investor_invite_api_orgs__org_id__investors__investor_id__invite_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"investor_id","in":"path","required":true,"schema":{"type":"integer","title":"Investor Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Post Investor Invite Api Orgs  Org Id  Investors  Investor Id  Invite Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/chat/sessions":{"get":{"summary":"List Chat Sessions","operationId":"list_chat_sessions_api_funds__slug__chat_sessions_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Chat Sessions Api Funds  Slug  Chat Sessions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/chat/sessions/{session_id}":{"get":{"summary":"Get Chat Session","operationId":"get_chat_session_api_funds__slug__chat_sessions__session_id__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Chat Session Api Funds  Slug  Chat Sessions  Session Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Rename Chat Session","operationId":"rename_chat_session_api_funds__slug__chat_sessions__session_id__patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenameSession"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Rename Chat Session Api Funds  Slug  Chat Sessions  Session Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Chat Session","operationId":"delete_chat_session_api_funds__slug__chat_sessions__session_id__delete","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Delete Chat Session Api Funds  Slug  Chat Sessions  Session Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/chat":{"post":{"summary":"Post Chat","description":"Stream a chat turn. Response is an SSE stream of JSON frames:\n\ndata: {\"kind\": \"session\", \"session_id\": 7, \"title\": \"...\", \"is_new\": true}\ndata: {\"kind\": \"text\",    \"delta\": \"Hello\"}\ndata: {\"kind\": \"text\",    \"delta\": \", world\"}\ndata: {\"kind\": \"done\",    \"session_id\": 7, \"usage\": {...}}\ndata: {\"kind\": \"error\",   \"message\": \"...\"}   (on failure)","operationId":"post_chat_api_funds__slug__chat_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/chat/sessions":{"get":{"summary":"List Org Chat Sessions","operationId":"list_org_chat_sessions_api_orgs__org_id__chat_sessions_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Org Chat Sessions Api Orgs  Org Id  Chat Sessions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/chat/sessions/{session_id}":{"get":{"summary":"Get Org Chat Session","operationId":"get_org_chat_session_api_orgs__org_id__chat_sessions__session_id__get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Org Chat Session Api Orgs  Org Id  Chat Sessions  Session Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Rename Org Chat Session","operationId":"rename_org_chat_session_api_orgs__org_id__chat_sessions__session_id__patch","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenameSession"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Rename Org Chat Session Api Orgs  Org Id  Chat Sessions  Session Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Org Chat Session","operationId":"delete_org_chat_session_api_orgs__org_id__chat_sessions__session_id__delete","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Delete Org Chat Session Api Orgs  Org Id  Chat Sessions  Session Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}/chat":{"post":{"summary":"Post Org Chat","description":"Stream a cross-fund chat turn (same SSE frame shape as the fund\nchat). Owner/admin/member of the org; investors are blocked.","operationId":"post_org_chat_api_orgs__org_id__chat_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/reviews":{"get":{"summary":"List Reviews","operationId":"list_reviews_api_funds__slug__reviews_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Reviews Api Funds  Slug  Reviews Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Post Review","description":"Start a review run and stream its events. If a run is already\nin flight for this fund, the existing one is streamed instead of\nstarting a duplicate. Frames:\n\n  {\"kind\": \"started\",        \"fund_id\": \"...\", \"constituents\": N}\n  {\"kind\": \"search\",         \"query\": \"...\"}\n  {\"kind\": \"search_results\", \"count\": N}\n  {\"kind\": \"progress\",       \"message\": \"...\"}\n  {\"kind\": \"done\",           \"review_id\": 7, \"summary\": \"...\", \"usage\": {...}}\n  {\"kind\": \"error\",          \"message\": \"...\"}","operationId":"post_review_api_funds__slug__reviews_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/reviews/active":{"get":{"summary":"Get Active Review","description":"Whether a review run is in flight (or finished within the last\nfew minutes). Frontend calls this on page load to decide whether\nto reconnect to an in-progress run.\n\nNOTE: must be registered before `/reviews/{review_id}` or FastAPI\nmatches the int-typed param first and rejects 'active' with 422.","operationId":"get_active_review_api_funds__slug__reviews_active_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Active Review Api Funds  Slug  Reviews Active Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/reviews/active/stream":{"get":{"summary":"Stream Active Review","description":"SSE re-attach to an in-flight review. Replays every event so\nfar, then tails new ones.","operationId":"stream_active_review_api_funds__slug__reviews_active_stream_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/reviews/active/cancel":{"post":{"summary":"Cancel Active Review","description":"Cooperatively cancel the in-flight review. The worker polls\n`cancel_requested` between events, so this lands within a couple\nof seconds in practice.","operationId":"cancel_active_review_api_funds__slug__reviews_active_cancel_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cancel Active Review Api Funds  Slug  Reviews Active Cancel Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/reviews/{review_id}":{"get":{"summary":"Get Review","operationId":"get_review_api_funds__slug__reviews__review_id__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"review_id","in":"path","required":true,"schema":{"type":"integer","title":"Review Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Review Api Funds  Slug  Reviews  Review Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/reviews/{review_id}/actions/{action_id}/apply":{"post":{"summary":"Apply Review Action","description":"Execute one recommended action from a review and persist its status.\nConfig kinds (remove/set_weight/set_band) apply instantly; trade kinds\nstage an order batch. Owner/admin only.","operationId":"apply_review_action_api_funds__slug__reviews__review_id__actions__action_id__apply_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"review_id","in":"path","required":true,"schema":{"type":"integer","title":"Review Id"}},{"name":"action_id","in":"path","required":true,"schema":{"type":"integer","title":"Action Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Apply Review Action Api Funds  Slug  Reviews  Review Id  Actions  Action Id  Apply Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/reviews/{review_id}/actions/{action_id}/dismiss":{"post":{"summary":"Dismiss Review Action","description":"Mark a recommended action dismissed (won't do it). Owner/admin only.","operationId":"dismiss_review_action_api_funds__slug__reviews__review_id__actions__action_id__dismiss_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"review_id","in":"path","required":true,"schema":{"type":"integer","title":"Review Id"}},{"name":"action_id","in":"path","required":true,"schema":{"type":"integer","title":"Action Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dismiss Review Action Api Funds  Slug  Reviews  Review Id  Actions  Action Id  Dismiss Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/chat-actions/{action_id}/apply":{"post":{"summary":"Apply Chat Action","description":"Execute an action Claude proposed in chat. Config kinds apply\ninstantly; trade kinds stage an order batch (source 'chat'). Owner/admin\nonly. Same executor + guardrails as review actions.","operationId":"apply_chat_action_api_funds__slug__chat_actions__action_id__apply_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"action_id","in":"path","required":true,"schema":{"type":"integer","title":"Action Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Apply Chat Action Api Funds  Slug  Chat Actions  Action Id  Apply Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/chat-actions/{action_id}/dismiss":{"post":{"summary":"Dismiss Chat Action","description":"Dismiss a chat-proposed action (won't do it). Owner/admin only.","operationId":"dismiss_chat_action_api_funds__slug__chat_actions__action_id__dismiss_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"action_id","in":"path","required":true,"schema":{"type":"integer","title":"Action Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dismiss Chat Action Api Funds  Slug  Chat Actions  Action Id  Dismiss Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/discoveries":{"get":{"summary":"List Discoveries","operationId":"list_discoveries_api_funds__slug__discoveries_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Discoveries Api Funds  Slug  Discoveries Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Post Discovery","description":"Start a discovery run and stream its events. If one is already\nin flight, the existing run is streamed. Frames mirror /reviews\nbut the `done` payload includes `candidates_found`.","operationId":"post_discovery_api_funds__slug__discoveries_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoveryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/discoveries/active":{"get":{"summary":"Get Active Discovery","description":"Whether a discovery run is in flight. See get_active_review.\n\nNOTE: must be registered before `/discoveries/{discovery_id}` or\nFastAPI matches the int-typed param first and 422s on 'active'.","operationId":"get_active_discovery_api_funds__slug__discoveries_active_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Active Discovery Api Funds  Slug  Discoveries Active Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/discoveries/active/stream":{"get":{"summary":"Stream Active Discovery","description":"SSE re-attach to an in-flight discovery run.","operationId":"stream_active_discovery_api_funds__slug__discoveries_active_stream_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/discoveries/active/cancel":{"post":{"summary":"Cancel Active Discovery","description":"Cooperatively cancel the in-flight discovery run. See\n`cancel_active_review` for the mechanism.","operationId":"cancel_active_discovery_api_funds__slug__discoveries_active_cancel_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cancel Active Discovery Api Funds  Slug  Discoveries Active Cancel Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/discoveries/{discovery_id}":{"get":{"summary":"Get Discovery","operationId":"get_discovery_api_funds__slug__discoveries__discovery_id__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"discovery_id","in":"path","required":true,"schema":{"type":"integer","title":"Discovery Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Discovery Api Funds  Slug  Discoveries  Discovery Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/discoveries/seed":{"post":{"summary":"Seed Discovery","description":"(Re)kick a thin Discovery during onboarding — the 'show value before\nyou subscribe' run + its retry. Bypasses the manual own-key gate ONLY\nwhile the org is still onboarding; once onboarded, manual discovery needs\nthe normal entitlement. The caller re-attaches via the active stream.","operationId":"seed_discovery_api_funds__slug__discoveries_seed_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeedDiscoveryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Seed Discovery Api Funds  Slug  Discoveries Seed Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/research":{"get":{"summary":"List Research Latest","description":"Latest report per ticker for the fund — backs the Research tab.","operationId":"list_research_latest_api_funds__slug__research_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Research Latest Api Funds  Slug  Research Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/research/review-context":{"get":{"summary":"Get Research Review Context","description":"The exact research-context block injected into the next AI\nReview prompt. Lets the operator see precisely what research\nfeeds the review. `text` is empty when no researched constituent\nhas a verdict/summary yet.","operationId":"get_research_review_context_api_funds__slug__research_review_context_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Research Review Context Api Funds  Slug  Research Review Context Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/research/by-id/{report_id}":{"get":{"summary":"Get Research By Id","description":"Fetch the full markdown body of one report.","operationId":"get_research_by_id_api_funds__slug__research_by_id__report_id__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"report_id","in":"path","required":true,"schema":{"type":"integer","title":"Report Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Research By Id Api Funds  Slug  Research By Id  Report Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/research/by-ticker/{ticker}":{"get":{"summary":"List Research For Ticker","description":"All reports ever written for one constituent, newest first.","operationId":"list_research_for_ticker_api_funds__slug__research_by_ticker__ticker__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Research For Ticker Api Funds  Slug  Research By Ticker  Ticker  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Post Research","description":"Start a research run for one constituent and stream its\nevents. If a run is already in flight for this ticker, the\nexisting one is streamed instead of starting a duplicate.","operationId":"post_research_api_funds__slug__research_by_ticker__ticker__post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResearchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/research/by-ticker/{ticker}/latest":{"get":{"summary":"Get Research Latest For Ticker","description":"Most recent report for one constituent; 404 if no report yet.","operationId":"get_research_latest_for_ticker_api_funds__slug__research_by_ticker__ticker__latest_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Research Latest For Ticker Api Funds  Slug  Research By Ticker  Ticker  Latest Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/research/by-ticker/{ticker}/active":{"get":{"summary":"Get Active Research","description":"Status + events of an in-flight research run for one ticker.","operationId":"get_active_research_api_funds__slug__research_by_ticker__ticker__active_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Active Research Api Funds  Slug  Research By Ticker  Ticker  Active Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/research/by-ticker/{ticker}/active/stream":{"get":{"summary":"Stream Active Research","description":"SSE re-attach to an in-flight research run.","operationId":"stream_active_research_api_funds__slug__research_by_ticker__ticker__active_stream_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funds/{slug}/research/by-ticker/{ticker}/active/cancel":{"post":{"summary":"Cancel Active Research","description":"Cooperatively cancel a research run.","operationId":"cancel_active_research_api_funds__slug__research_by_ticker__ticker__active_cancel_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cancel Active Research Api Funds  Slug  Research By Ticker  Ticker  Active Cancel Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/research/{ticker}/{task_type}":{"post":{"summary":"Post Company Research","description":"Generate a system-wide research note for one company. Global-admin\nonly (a platform superpower); platform-owned and unmetered. Streams SSE;\nsingle-flight per (ticker, task_type).","operationId":"post_company_research_api_research__ticker___task_type__post","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"task_type","in":"path","required":true,"schema":{"type":"string","title":"Task Type"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyResearchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/research/notes/{note_id}":{"get":{"summary":"Get Company Research Note","description":"One system-wide research note (any signed-in user may read).","operationId":"get_company_research_note_api_research_notes__note_id__get","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Company Research Note Api Research Notes  Note Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/research/{ticker}":{"get":{"summary":"List Company Research","description":"A company's system-wide research notes (any signed-in user may read).\n`can_generate` tells the UI whether to show the run control.","operationId":"list_company_research_api_research__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Company Research Api Research  Ticker  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/exclusions":{"get":{"summary":"List Exclusions","description":"Every active constituent across all funds — what AI Review and\nDiscovery prompts use to exclude tickers from suggestions. Replaces\nthe old cross-app polling exclusion system: now a single SQL query.","operationId":"list_exclusions_api_exclusions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Exclusions Api Exclusions Get"}}}}}}}},"components":{"schemas":{"AcceptInviteRequest":{"properties":{"password":{"type":"string","maxLength":200,"minLength":8,"title":"Password"}},"type":"object","required":["password"],"title":"AcceptInviteRequest"},"AddAllocationRequest":{"properties":{"fund_slug":{"type":"string","title":"Fund Slug"},"investor_id":{"type":"integer","title":"Investor Id"},"amount":{"type":"number","exclusiveMinimum":0.0,"title":"Amount"}},"type":"object","required":["fund_slug","investor_id","amount"],"title":"AddAllocationRequest"},"AddConstituentRequest":{"properties":{"ticker":{"type":"string","maxLength":20,"minLength":1,"title":"Ticker"},"company_name":{"type":"string","maxLength":200,"minLength":1,"title":"Company Name"},"sub_category":{"type":"string","maxLength":100,"minLength":1,"title":"Sub Category"},"band":{"type":"string","maxLength":100,"minLength":1,"title":"Band"},"sleeve":{"type":"string","maxLength":50,"minLength":1,"title":"Sleeve"},"target_weight_pct":{"type":"number","maximum":100.0,"exclusiveMinimum":0.0,"title":"Target Weight Pct"},"thesis_summary":{"type":"string","maxLength":2000,"title":"Thesis Summary","default":""}},"type":"object","required":["ticker","company_name","sub_category","band","sleeve","target_weight_pct"],"title":"AddConstituentRequest"},"AiModelsRequest":{"properties":{"default":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Default"},"review":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Review"},"discovery":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Discovery"},"research":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Research"},"chat":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Chat"}},"type":"object","title":"AiModelsRequest","description":"Free-form model ids; empty/None = inherit (workflow → default →\nplatform fallback). Ids aren't validated against a list on purpose —\na bad id fails at the Anthropic call, not at config time."},"AllocateRequest":{"properties":{"amount":{"type":"number","exclusiveMinimum":0.0,"title":"Amount"},"mode":{"type":"string","title":"Mode","default":"drift_aware"},"consume_all":{"type":"boolean","title":"Consume All","default":true}},"type":"object","required":["amount"],"title":"AllocateRequest"},"BandSuspendRequest":{"properties":{"suspended":{"type":"boolean","title":"Suspended"}},"type":"object","required":["suspended"],"title":"BandSuspendRequest"},"ChangePasswordRequest":{"properties":{"current_password":{"type":"string","maxLength":200,"minLength":1,"title":"Current Password"},"new_password":{"type":"string","maxLength":200,"minLength":8,"title":"New Password"}},"type":"object","required":["current_password","new_password"],"title":"ChangePasswordRequest"},"ChatRequest":{"properties":{"message":{"type":"string","maxLength":8000,"minLength":1,"title":"Message"},"session_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Session Id"}},"type":"object","required":["message"],"title":"ChatRequest","description":"POST body for /api/funds/{slug}/chat — start a new session or\ncontinue an existing one."},"ClerkSyncRequest":{"properties":{"clerk_user_id":{"type":"string","maxLength":200,"minLength":1,"title":"Clerk User Id"},"email":{"anyOf":[{"type":"string","maxLength":254},{"type":"null"}],"title":"Email"},"name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Name"},"clerk_org_id":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Clerk Org Id"},"org_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Org Name"},"plan":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Plan"},"invite_token":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Invite Token"}},"type":"object","required":["clerk_user_id"],"title":"ClerkSyncRequest"},"CloneFundRequest":{"properties":{"source_slug":{"type":"string","title":"Source Slug"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"into_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Into Slug"}},"type":"object","required":["source_slug"],"title":"CloneFundRequest"},"CompanyResearchRequest":{"properties":{"company_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Company Name"},"event_context":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Event Context"},"directive":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Directive"}},"type":"object","title":"CompanyResearchRequest"},"CompleteOnboardingRequest":{"properties":{"allocations":{"items":{"$ref":"#/components/schemas/OnboardingAlloc"},"type":"array","title":"Allocations","default":[]}},"type":"object","title":"CompleteOnboardingRequest"},"ConstituentPatch":{"properties":{"pinned":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Pinned"},"target_weight_pct":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Target Weight Pct"},"thesis_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thesis Summary"},"sleeve":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sleeve"}},"type":"object","title":"ConstituentPatch"},"ContactRequest":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"email":{"type":"string","maxLength":254,"minLength":3,"title":"Email"},"message":{"type":"string","maxLength":5000,"minLength":1,"title":"Message"},"company":{"type":"string","title":"Company","default":""}},"type":"object","required":["name","email","message"],"title":"ContactRequest"},"ContributeRequest":{"properties":{"investor_id":{"type":"integer","title":"Investor Id"},"amount":{"type":"number","exclusiveMinimum":0.0,"title":"Amount"},"notes":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Notes"}},"type":"object","required":["investor_id","amount"],"title":"ContributeRequest"},"CreateApiKeyRequest":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"CreateApiKeyRequest"},"CreateBatchRequest":{"properties":{"source":{"type":"string","maxLength":40,"title":"Source","default":"manual"},"note":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Note"},"items":{"items":{"$ref":"#/components/schemas/OrderItem"},"type":"array","minItems":1,"title":"Items"}},"type":"object","required":["items"],"title":"CreateBatchRequest"},"CreateCapitalFlowRequest":{"properties":{"direction":{"type":"string","title":"Direction"},"amount":{"type":"number","exclusiveMinimum":0.0,"title":"Amount"},"flow_date":{"type":"string","title":"Flow Date"},"notes":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Notes"}},"type":"object","required":["direction","amount","flow_date"],"title":"CreateCapitalFlowRequest"},"CreateFundRequest":{"properties":{"slug":{"type":"string","maxLength":40,"minLength":2,"title":"Slug"},"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"short_name":{"type":"string","maxLength":50,"minLength":1,"title":"Short Name"},"sleeves":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Sleeves"},"accent_color":{"type":"string","maxLength":20,"title":"Accent Color","default":"#3554d1"},"favicon":{"type":"string","maxLength":8,"title":"Favicon","default":"💎"},"outgrowth_sleeve":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Outgrowth Sleeve"},"market_cap_ceiling_usd":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Market Cap Ceiling Usd"},"strategy_md":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Strategy Md"}},"type":"object","required":["slug","name","short_name","sleeves"],"title":"CreateFundRequest","description":"New-fund payload. `slug` is the URL key (lowercase, hyphenated);\nthe fund starts with no constituents — names are added afterward on\nthe Constituents page."},"CreateInvestorRequest":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"email":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Email"}},"type":"object","required":["name"],"title":"CreateInvestorRequest"},"DeclineWithdrawalBody":{"properties":{"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","title":"DeclineWithdrawalBody"},"DiscoveryRequest":{"properties":{"band_filter":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Band Filter"},"user_directive":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"User Directive"},"target_candidates":{"type":"integer","maximum":30.0,"minimum":1.0,"title":"Target Candidates","default":10}},"type":"object","title":"DiscoveryRequest"},"FeeTermsRequest":{"properties":{"mgmt_fee_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Mgmt Fee Pct"},"carry_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Carry Pct"},"hurdle_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Hurdle Pct"}},"type":"object","title":"FeeTermsRequest"},"FundTargetsRequest":{"properties":{"targets":{"additionalProperties":{"type":"number"},"type":"object","title":"Targets"}},"type":"object","required":["targets"],"title":"FundTargetsRequest"},"FundUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"short_name":{"anyOf":[{"type":"string","maxLength":50,"minLength":1},{"type":"null"}],"title":"Short Name"},"accent_color":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Accent Color"},"favicon":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Favicon"},"sleeves":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Sleeves"},"strategy_md":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Strategy Md"},"outgrowth_sleeve":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Outgrowth Sleeve"},"market_cap_ceiling_usd":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Market Cap Ceiling Usd"},"discovery_candidates":{"anyOf":[{"type":"integer","maximum":30.0,"minimum":1.0},{"type":"null"}],"title":"Discovery Candidates"}},"type":"object","title":"FundUpdate","description":"Partial update payload for PATCH /api/funds/{slug}. Every field\nis optional — pass only what you want to change."},"GenerateStrategyRequest":{"properties":{"brief":{"type":"string","maxLength":4000,"minLength":1,"title":"Brief"}},"type":"object","required":["brief"],"title":"GenerateStrategyRequest"},"GuardrailsRequest":{"properties":{"kill_switch":{"type":"boolean","title":"Kill Switch","default":false},"max_order_notional":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Max Order Notional"},"max_batch_notional":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Max Batch Notional"},"block_when_market_closed":{"type":"boolean","title":"Block When Market Closed","default":false},"enforce_buying_power":{"type":"boolean","title":"Enforce Buying Power","default":true},"cash_only":{"type":"boolean","title":"Cash Only","default":false},"wash_sale_flag":{"type":"boolean","title":"Wash Sale Flag","default":true},"wash_sale_window_days":{"type":"integer","maximum":365.0,"minimum":1.0,"title":"Wash Sale Window Days","default":30},"stop_loss_pct":{"anyOf":[{"type":"number","maximum":95.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Stop Loss Pct"}},"type":"object","title":"GuardrailsRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InitializeUnitsRequest":{"properties":{"starting_cash":{"type":"number","minimum":0.0,"title":"Starting Cash","default":0}},"type":"object","title":"InitializeUnitsRequest"},"InterestStatusRequest":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"InterestStatusRequest"},"InviteRequest":{"properties":{"email":{"type":"string","maxLength":200,"minLength":3,"title":"Email"},"role":{"type":"string","title":"Role","default":"member"}},"type":"object","required":["email"],"title":"InviteRequest"},"LoginRequest":{"properties":{"email":{"type":"string","maxLength":200,"minLength":3,"title":"Email"},"password":{"type":"string","maxLength":200,"minLength":1,"title":"Password"}},"type":"object","required":["email","password"],"title":"LoginRequest"},"NormalizeWeightsRequest":{"properties":{"mode":{"type":"string","title":"Mode","default":"proportional"},"primary_split_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Primary Split Pct"}},"type":"object","title":"NormalizeWeightsRequest","description":"Rescale a fund's target weights to sum to 100%. Pinned rows are\npreserved as-is — the unpinned pool absorbs the slack."},"OnboardingAlloc":{"properties":{"fund_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fund Slug"},"new_fund_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"New Fund Name"},"amount":{"type":"number","minimum":0.0,"title":"Amount"}},"type":"object","required":["amount"],"title":"OnboardingAlloc"},"OrderItem":{"properties":{"ticker":{"type":"string","maxLength":20,"minLength":1,"title":"Ticker"},"side":{"type":"string","pattern":"^(buy|sell)$","title":"Side"},"notional":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Notional"},"qty":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Qty"}},"type":"object","required":["ticker","side"],"title":"OrderItem"},"OutgrowthRuleRequest":{"properties":{"outgrowth_sleeve":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Outgrowth Sleeve"},"market_cap_ceiling_usd":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Market Cap Ceiling Usd"}},"type":"object","title":"OutgrowthRuleRequest","description":"The market-cap outgrowth rule. `outgrowth_sleeve` must be one of the\nfund's sleeves, or null to disable."},"PromotionRequest":{"properties":{"is_public":{"type":"boolean","title":"Is Public","default":false},"tagline":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Tagline"},"summary":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Summary"},"minimum_usd":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Minimum Usd"}},"type":"object","title":"PromotionRequest"},"PublicInterestRequest":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"email":{"type":"string","maxLength":254,"minLength":3,"title":"Email"},"accredited":{"type":"boolean","title":"Accredited","default":false},"amount_usd":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Amount Usd"},"note":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Note"},"company":{"type":"string","title":"Company","default":""}},"type":"object","required":["name","email"],"title":"PublicInterestRequest"},"RedeemRequest":{"properties":{"investor_id":{"type":"integer","title":"Investor Id"},"units":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Units"},"amount":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Amount"},"fraction":{"anyOf":[{"type":"number","maximum":1.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Fraction"},"notes":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Notes"}},"type":"object","required":["investor_id"],"title":"RedeemRequest"},"RenameSession":{"properties":{"title":{"type":"string","maxLength":120,"minLength":1,"title":"Title"}},"type":"object","required":["title"],"title":"RenameSession"},"ResearchRequest":{"properties":{"user_directive":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"User Directive"}},"type":"object","title":"ResearchRequest"},"ReviewRequest":{"properties":{"user_directive":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"User Directive"}},"type":"object","title":"ReviewRequest"},"SeedDiscoveryRequest":{"properties":{"target_candidates":{"anyOf":[{"type":"integer","maximum":30.0,"minimum":1.0},{"type":"null"}],"title":"Target Candidates"},"user_directive":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"User Directive"}},"type":"object","title":"SeedDiscoveryRequest"},"SetBandWeightsRequest":{"properties":{"bands":{"additionalProperties":{"type":"number"},"type":"object","minProperties":1,"title":"Bands"}},"type":"object","required":["bands"],"title":"SetBandWeightsRequest","description":"Apply explicit per-band weight overrides. Each entry sets the\nsum of one band's constituent target weights; the band's unpinned\nconstituents scale proportionally, the rest of the fund rescales\nto keep the total at 100%."},"SetSecretRequest":{"properties":{"values":{"additionalProperties":{"type":"string"},"type":"object","minProperties":1,"title":"Values"}},"type":"object","required":["values"],"title":"SetSecretRequest","description":"Field→value map for one provider (e.g. {\"api_key\": \"...\"} or the\nAlpaca key_id/secret/paper fields). Empty fields are dropped."},"SetWeightsRequest":{"properties":{"weights":{"additionalProperties":{"type":"number"},"type":"object","minProperties":1,"title":"Weights"}},"type":"object","required":["weights"],"title":"SetWeightsRequest","description":"Apply explicit weight overrides. The listed tickers auto-pin\nso future `normalize_weights` calls don't unwind them; the rest\nof the unpinned pool absorbs the remainder proportionally."},"SleeveConfigRequest":{"properties":{"sleeves":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Sleeves"},"reassignments":{"additionalProperties":{"type":"string"},"type":"object","title":"Reassignments"}},"type":"object","required":["sleeves"],"title":"SleeveConfigRequest","description":"Replace a fund's sleeves. `reassignments` maps an old label being\nrenamed/removed to a target label present in `sleeves`. The outgrowth\nrule is left alone (auto-remapped on rename) — edit it separately."},"StopLossBatchRequest":{"properties":{"ticker":{"type":"string","maxLength":20,"minLength":1,"title":"Ticker"}},"type":"object","required":["ticker"],"title":"StopLossBatchRequest"},"SuggestConstituentRequest":{"properties":{"ticker":{"type":"string","maxLength":20,"minLength":1,"title":"Ticker"},"company_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Company Name"}},"type":"object","required":["ticker"],"title":"SuggestConstituentRequest"},"TransferBetweenFundsRequest":{"properties":{"from_fund":{"type":"string","title":"From Fund"},"to_fund":{"type":"string","title":"To Fund"},"amount":{"type":"number","title":"Amount"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["from_fund","to_fund","amount"],"title":"TransferBetweenFundsRequest"},"UpdateInvestorRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Name"},"email":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Email"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"UpdateInvestorRequest"},"UpdateMemberRequest":{"properties":{"role":{"type":"string","minLength":1,"title":"Role"}},"type":"object","required":["role"],"title":"UpdateMemberRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WaitlistRequest":{"properties":{"email":{"type":"string","maxLength":254,"minLength":3,"title":"Email"},"company":{"type":"string","title":"Company","default":""}},"type":"object","required":["email"],"title":"WaitlistRequest"},"WithdrawRequest":{"properties":{"amount":{"type":"number","exclusiveMinimum":0.0,"title":"Amount"},"mode":{"type":"string","title":"Mode","default":"proportional"},"consume_all":{"type":"boolean","title":"Consume All","default":true}},"type":"object","required":["amount"],"title":"WithdrawRequest"},"WithdrawalRequestBody":{"properties":{"commitment_id":{"type":"integer","title":"Commitment Id"},"full":{"type":"boolean","title":"Full","default":false},"amount_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount Usd"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["commitment_id"],"title":"WithdrawalRequestBody"}}}}