{
  "openapi": "3.1.0",
  "info": {
    "title": "LOPJLB Research API",
    "description": "Quantitative U.S. equity research API proxied through the LOPJLB BFF. Public and freemium endpoints require no authentication. Pro endpoints require a WorkOS session with pro entitlement. Enterprise API keys: contact contact@lopjlb.com",
    "version": "1.0.0",
    "contact": {
      "email": "contact@lopjlb.com",
      "url": "https://www.lopjlb.com/contact"
    }
  },
  "servers": [
    {
      "url": "https://www.lopjlb.com",
      "description": "Production"
    }
  ],
  "tags": [
    {
      "name": "public",
      "description": "No authentication required"
    },
    {
      "name": "freemium",
      "description": "Anonymous OK; some responses clamped for free users"
    },
    {
      "name": "pro",
      "description": "WorkOS session + pro entitlement required"
    },
    {
      "name": "authenticated",
      "description": "WorkOS session required"
    }
  ],
  "paths": {
    "/bff/api/healthz": {
      "get": {
        "summary": "Healthz",
        "operationId": "healthz_api_healthz_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        },
        "tags": [
          "public"
        ],
        "description": "[public]"
      }
    },
    "/bff/api/bigfive/search": {
      "get": {
        "summary": "Bigfive Search",
        "description": "[public] Lightweight ticker search. returns [{symbol, name}] for autocomplete.",
        "operationId": "bigfive_search_api_bigfive_search_get",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "default": "",
              "title": "Q"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 8,
              "title": "Limit"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "public"
        ]
      }
    },
    "/bff/api/bigfive/universe": {
      "get": {
        "summary": "Bigfive Universe",
        "description": "[pro] Big Five signal status for all cached symbols.\n\nResponse is mtime-cached in memory: the first call after a nightly job\nrun takes 3-8s (reading ~9k pkl files); subsequent calls return in <5ms.\nThe cold build is offloaded to a thread executor and serialized by\n`_universe_build_lock` so the event loop stays free and only one rebuild\nruns at a time.",
        "operationId": "bigfive_universe_api_bigfive_universe_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        },
        "tags": [
          "pro"
        ],
        "security": [
          {
            "sessionCookie": [
              "pro"
            ]
          }
        ]
      }
    },
    "/bff/api/bigfive/showcase": {
      "get": {
        "summary": "Bigfive Showcase",
        "description": "[public] Public endpoint returning full signal rows for a small curated set of\ntickers used by the homepage showcase cards. No auth required.",
        "operationId": "bigfive_showcase_api_bigfive_showcase_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        },
        "tags": [
          "public"
        ]
      }
    },
    "/bff/api/bigfive/showcase-sparkline/{symbol}": {
      "get": {
        "summary": "Bigfive Showcase Sparkline",
        "description": "[public] Public sparkline for showcase tickers only.",
        "operationId": "bigfive_showcase_sparkline_api_bigfive_showcase_sparkline__symbol__get",
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Symbol"
            }
          },
          {
            "name": "days",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 120,
              "title": "Days"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "public"
        ]
      }
    },
    "/bff/api/bigfive/benchmark-sparkline/{symbol}": {
      "get": {
        "summary": "Bigfive Benchmark Sparkline",
        "description": "[public] Public monthly sparkline for the SD50 compare-chart benchmark ETFs.",
        "operationId": "bigfive_benchmark_sparkline_api_bigfive_benchmark_sparkline__symbol__get",
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Symbol"
            }
          },
          {
            "name": "days",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 7600,
              "title": "Days"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "public"
        ]
      }
    },
    "/bff/api/bigfive/universe-preview": {
      "get": {
        "summary": "Bigfive Universe Preview",
        "description": "[public] Public free-tier preview. Returns the same row shape as `/universe` but\nfiltered to SPY25 watchlist members, with an `is_preview` flag and\na `locked_count` the UI can render as \"N more rows locked\" / CTA.\n\nZero auth. this endpoint is registered in the BFF PUBLIC_PATHS list so\nanonymous homepage visitors can sample the research before signing up.",
        "operationId": "bigfive_universe_preview_api_bigfive_universe_preview_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        },
        "tags": [
          "public"
        ]
      }
    },
    "/bff/api/bigfive/live-quotes": {
      "post": {
        "summary": "Bigfive Live Quotes",
        "description": "[freemium] Batch-fetch live prices.\n\nRequest body: {\"symbols\": [\"AAPL\", \"SPY\", ...]}\nResponse:     {\"AAPL\": {\"price\": 198.42, \"change_pct\": 0.91, ...}, ...}\n\nAlways a dict, never {\"error\": ...}. see the module-level docstring.",
        "operationId": "bigfive_live_quotes_api_bigfive_live_quotes_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": true,
                "type": "object",
                "title": "Payload"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "freemium"
        ]
      }
    },
    "/bff/api/market/overview": {
      "get": {
        "summary": "Market Overview",
        "description": "[public] Single payload with headline indices, sector performance, and movers.\n\nAll data is served from the SQLite cache (populated by the background\npoller every 5 min during market hours / 30 min off-hours), so this\nendpoint makes ZERO upstream FMP calls.",
        "operationId": "market_overview_api_market_overview_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        },
        "tags": [
          "public"
        ]
      }
    },
    "/bff/api/market/indices": {
      "get": {
        "summary": "Market Indices",
        "description": "[public] Just the headline index quotes. lighter payload for the top bar.",
        "operationId": "market_indices_api_market_indices_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        },
        "tags": [
          "public"
        ]
      }
    },
    "/bff/api/bigfive/detail/{symbol}": {
      "get": {
        "summary": "Bigfive Detail",
        "description": "[freemium] Daily time-series for a specific symbol's Big Five signals.",
        "operationId": "bigfive_detail_api_bigfive_detail__symbol__get",
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Symbol"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "freemium"
        ]
      }
    },
    "/bff/api/bigfive/fundamentals-history/{symbol}": {
      "get": {
        "summary": "Bigfive Fundamentals History",
        "description": "[freemium] Historical annual fundamentals for charting (P/E, revenue, margins, etc.).",
        "operationId": "bigfive_fundamentals_history_api_bigfive_fundamentals_history__symbol__get",
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Symbol"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "freemium"
        ]
      }
    },
    "/bff/api/bigfive/sparkline/{symbol}": {
      "get": {
        "summary": "Bigfive Sparkline",
        "description": "[freemium] Rich per-symbol time-series for augmented sparkline + TA chips.\n\ntf: 'daily' (default), 'weekly', or 'monthly'. resamples OHLCV accordingly.",
        "operationId": "bigfive_sparkline_api_bigfive_sparkline__symbol__get",
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Symbol"
            }
          },
          {
            "name": "days",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 180,
              "title": "Days"
            }
          },
          {
            "name": "tf",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "default": "daily",
              "title": "Tf"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "freemium"
        ]
      }
    },
    "/bff/api/bigfive/chat": {
      "post": {
        "summary": "Bigfive Chat",
        "description": "[pro] AI chat assistant. minimal-context version (no daily_newsletter deps).",
        "operationId": "bigfive_chat_api_bigfive_chat_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BigFiveChatRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "pro"
        ],
        "security": [
          {
            "sessionCookie": [
              "pro"
            ]
          }
        ]
      }
    },
    "/bff/api/hmm/latest": {
      "get": {
        "summary": "Hmm Latest",
        "description": "[public] Latest HMM regime detection results.",
        "operationId": "hmm_latest_api_hmm_latest_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        },
        "tags": [
          "public"
        ]
      }
    },
    "/bff/api/hmm/sparkline": {
      "get": {
        "summary": "Hmm Sparkline",
        "description": "[public] Last N days of SPY close + regime label for the header sparkline.\n\nPrimary source: regime_history.jsonl (one JSON object per line, written\nby the daily HMM inference cron). Each line has {date, regime, spy_price}.",
        "operationId": "hmm_sparkline_api_hmm_sparkline_get",
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 90,
              "title": "Days"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "public"
        ]
      }
    },
    "/bff/api/market-pulse": {
      "get": {
        "summary": "Market Pulse",
        "description": "[public] Public market-level summary for the marketing homepage.\n\nCombines latest HMM regime, 90-day regime sparkline, and aggregate signal\nbreadth across the universe. Aggregate-only. no per-symbol data. so this\nendpoint stays open even under the Phase 4 JWT gating.",
        "operationId": "market_pulse_api_market_pulse_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        },
        "tags": [
          "public"
        ]
      }
    },
    "/bff/api/discovered-plays": {
      "get": {
        "summary": "Discovered Plays",
        "description": "[pro] Serve grid-search-discovered plays (Pro-plan preset source).",
        "operationId": "discovered_plays_api_discovered_plays_get",
        "parameters": [
          {
            "name": "tier",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "default": "",
              "title": "Tier"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "pro"
        ],
        "security": [
          {
            "sessionCookie": [
              "pro"
            ]
          }
        ]
      }
    },
    "/bff/api/bigfive/earnings-calendar": {
      "get": {
        "summary": "Earnings Calendar",
        "description": "[public] Upcoming and recent earnings, enriched with our signal data.\n\nReads ONLY from the file cache written by jobs/calendar_sync. never\ncalls FMP directly. The cron job runs every 6 hours and keeps the\ncache fresh. In-memory TTL avoids re-parsing the JSON file on every\nrequest.",
        "operationId": "earnings_calendar_api_bigfive_earnings_calendar_get",
        "parameters": [
          {
            "name": "days_ahead",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 14,
              "title": "Days Ahead"
            }
          },
          {
            "name": "days_back",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 7,
              "title": "Days Back"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "public"
        ]
      }
    },
    "/bff/api/bigfive/economic-calendar": {
      "get": {
        "summary": "Economic Calendar",
        "description": "[public] Economic events. Fed dates, CPI, NFP, GDP, etc.",
        "operationId": "economic_calendar_api_bigfive_economic_calendar_get",
        "parameters": [
          {
            "name": "days_ahead",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 14,
              "title": "Days Ahead"
            }
          },
          {
            "name": "days_back",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 7,
              "title": "Days Back"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "public"
        ]
      }
    },
    "/bff/api/bigfive/peers/{symbol}": {
      "get": {
        "summary": "Peer Comparison",
        "description": "[pro] Find and return peers for a symbol based on sector + market-cap proximity.",
        "operationId": "peer_comparison_api_bigfive_peers__symbol__get",
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Symbol"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 8,
              "title": "Limit"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "pro"
        ],
        "security": [
          {
            "sessionCookie": [
              "pro"
            ]
          }
        ]
      }
    },
    "/bff/api/bigfive/etf-holdings/{symbol}": {
      "get": {
        "summary": "Etf Holdings",
        "description": "[freemium] Top holdings for an ETF, or reverse lookup (which ETFs hold this ticker).\n\nOn-demand: if symbol is a known ETF but not yet cached, fetches live from FMP.\nPass refresh=true to force a live re-fetch for a cached ETF.",
        "operationId": "etf_holdings_api_bigfive_etf_holdings__symbol__get",
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Symbol"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 25,
              "title": "Limit"
            }
          },
          {
            "name": "refresh",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false,
              "title": "Refresh"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "freemium"
        ]
      }
    },
    "/bff/api/user/webhooks": {
      "get": {
        "summary": "Get Webhooks",
        "description": "[authenticated] Return saved webhook configs for the current user.",
        "operationId": "get_webhooks_api_user_webhooks_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        },
        "tags": [
          "authenticated"
        ],
        "security": [
          {
            "sessionCookie": []
          }
        ]
      },
      "post": {
        "summary": "Save Webhook",
        "description": "[authenticated] Save a Discord/Slack webhook URL for signal alerts.",
        "operationId": "save_webhook_api_user_webhooks_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookConfig"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "authenticated"
        ],
        "security": [
          {
            "sessionCookie": []
          }
        ]
      }
    },
    "/bff/api/user/webhooks/{platform}": {
      "delete": {
        "summary": "Delete Webhook",
        "description": "[authenticated] Remove a webhook config.",
        "operationId": "delete_webhook_api_user_webhooks__platform__delete",
        "parameters": [
          {
            "name": "platform",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Platform"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "authenticated"
        ],
        "security": [
          {
            "sessionCookie": []
          }
        ]
      }
    },
    "/bff/api/user/webhooks/test": {
      "post": {
        "summary": "Test Webhook",
        "description": "[authenticated] Send a test message to the webhook.\n\nRequires an authenticated user (previously unauthenticated, letting any\nBFF caller drive POSTs through this endpoint). The URL is already\nallowlisted to Discord/Slack hosts by WebhookConfig.validate_webhook_url;\nwe additionally disable redirect-following so a trusted host can't 3xx us\ninto an internal target (SSRF defense-in-depth).",
        "operationId": "test_webhook_api_user_webhooks_test_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookConfig"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "authenticated"
        ],
        "security": [
          {
            "sessionCookie": []
          }
        ]
      }
    },
    "/bff/api/bigfive/signal-card/{symbol}": {
      "get": {
        "summary": "Signal Card",
        "description": "[public] Public signal summary for a single ticker. powers OG/Twitter cards.",
        "operationId": "signal_card_api_bigfive_signal_card__symbol__get",
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Symbol"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "public"
        ]
      }
    },
    "/bff/api/sd50/allocation": {
      "get": {
        "summary": "Sd50 Allocation",
        "description": "[pro] Level 3. JSON allocation for programmatic consumption.",
        "operationId": "sd50_allocation_api_sd50_allocation_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        },
        "tags": [
          "pro"
        ],
        "security": [
          {
            "sessionCookie": [
              "pro"
            ]
          }
        ]
      }
    },
    "/bff/api/sd50/allocation.csv": {
      "get": {
        "summary": "Sd50 Allocation Csv",
        "description": "[pro] Level 2. Broker-ready CSV download.",
        "operationId": "sd50_allocation_csv_api_sd50_allocation_csv_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        },
        "tags": [
          "pro"
        ],
        "security": [
          {
            "sessionCookie": [
              "pro"
            ]
          }
        ]
      }
    },
    "/bff/api/sd50/feed": {
      "get": {
        "summary": "Sd50 Feed",
        "description": "[public] Level 1. RSS 2.0 feed (NYT-style) with monthly allocation history.",
        "operationId": "sd50_feed_api_sd50_feed_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        },
        "tags": [
          "public"
        ]
      }
    }
  },
  "components": {
    "securitySchemes": {
      "sessionCookie": {
        "type": "apiKey",
        "in": "cookie",
        "name": "wos-session",
        "description": "WorkOS AuthKit session cookie obtained via https://www.lopjlb.com/signup"
      },
      "enterpriseApiKey": {
        "type": "apiKey",
        "in": "header",
        "name": "X-LOPJLB-API-Key",
        "description": "Enterprise API key (planned). Contact contact@lopjlb.com"
      }
    }
  }
}
