# Generated from openapi.json by gen_openapi.py - do not edit by hand.
"openapi": "3.1.0"
"info":
  "title": "Quintarthai Public API"
  "version": "1.0.0"
  "summary": "North American equity market data (keyless) and the SEC filings Developer Data API (key required)."
  "description": "Programmatic access to the same equity data that powers Quintarthai's research surface: quotes, end-of-day and intraday bars, fundamentals, earnings history, corporate actions, IPO and economic calendars, macro series and a cross-market screener.\n\n**Coverage.** United States and Canada, roughly 51,000 listed symbols including TSX and TSX-V. Canadian and cross-border names are the deliberate focus.\n\n**Authentication.** Every operation in this document is public and requires no key. Higher rate limits and additional surfaces use an API key issued at /developers.html; see GET /api/v1/data/plans for the authoritative, keyless statement of what each tier allows.\n\n**This is research data, not investment advice.** Responses are factual market and filing data. Nothing here is a recommendation, and no output is tailored to any individual's circumstances. See /legal/disclosures.html for data sourcing and regulatory disclosures."
  "contact":
    "name": "Quintarthai developer support"
    "email": "hello@quintessentianetwork.com"
    "url": "https://quintarthai.com/developers.html"
  "license":
    "name": "Terms of Service"
    "url": "https://quintarthai.com/legal/terms-of-service.html"
  "termsOfService": "https://quintarthai.com/legal/terms-of-service.html"
"servers":
  - "url": "https://quintarthai.com"
    "description": "Production"
"externalDocs":
  "description": "Developer documentation and API keys"
  "url": "https://quintarthai.com/developers.html"
"tags":
  - "name": "Reference"
    "description": "Symbol universe, entitlements and service health."
  - "name": "Prices"
    "description": "Quotes, end-of-day bars and intraday bars."
  - "name": "Fundamentals"
    "description": "Company financial statements, earnings and corporate actions."
  - "name": "Calendars"
    "description": "Forward-looking IPO and economic-event calendars."
  - "name": "Macro"
    "description": "Country-level macroeconomic time series."
  - "name": "Screening"
    "description": "Cross-market equity screening."
  - "name": "Developer Data API"
    "description": "SEC filings, Form 4 insider activity, 13F holdings, filing diffs and signed receipts. Requires an API key."
  - "name": "Sharia screening"
    "description": "Sharia compliance screening and purification calculations."
  - "name": "Status"
    "description": "Service status, incident history and synthetic checks."
"components":
  "schemas":
    "Error":
      "type": "object"
      "required":
        - "detail"
      "properties":
        "detail":
          "type": "string"
          "description": "Human-readable explanation of the failure."
        "code":
          "type": "string"
          "description": "Stable machine-readable error code."
          "examples":
            - "not_found"
            - "bad_request"
            - "rate_limited"
        "hint":
          "type": "string"
          "description": "What to change to make the call succeed."
        "docs":
          "type": "string"
          "format": "uri"
          "description": "Link to the relevant documentation."
    "AccountRequestRow":
      "properties":
        "id":
          "type": "integer"
          "title": "Id"
        "user_id":
          "type": "string"
          "title": "User Id"
        "email":
          "type": "string"
          "title": "Email"
        "kind":
          "type": "string"
          "title": "Kind"
        "note":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Note"
        "target_tier":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Target Tier"
        "received_at":
          "type": "string"
          "title": "Received At"
        "fulfilled_at":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Fulfilled At"
        "fulfilled_by":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Fulfilled By"
        "days_until_eligible":
          "anyOf":
            - "type": "integer"
            - "type": "null"
          "title": "Days Until Eligible"
      "type": "object"
      "required":
        - "id"
        - "user_id"
        - "email"
        - "kind"
        - "note"
        - "target_tier"
        - "received_at"
        - "fulfilled_at"
        - "fulfilled_by"
        - "days_until_eligible"
      "title": "AccountRequestRow"
    "AdminLoginIn":
      "properties":
        "email":
          "type": "string"
          "title": "Email"
        "password":
          "type": "string"
          "title": "Password"
        "totp_code":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Totp Code"
      "type": "object"
      "required":
        - "email"
        - "password"
      "title": "AdminLoginIn"
    "AdminMe":
      "properties":
        "id":
          "type": "string"
          "title": "Id"
        "email":
          "type": "string"
          "title": "Email"
        "tier":
          "type": "string"
          "title": "Tier"
        "is_admin":
          "type": "boolean"
          "title": "Is Admin"
      "type": "object"
      "required":
        - "id"
        - "email"
        - "tier"
        - "is_admin"
      "title": "AdminMe"
    "AdminToggle":
      "properties":
        "is_admin":
          "type": "boolean"
          "title": "Is Admin"
      "type": "object"
      "required":
        - "is_admin"
      "title": "AdminToggle"
    "AlertCreate":
      "properties":
        "ticker":
          "type": "string"
          "maxLength": 16
          "minLength": 1
          "title": "Ticker"
        "condition":
          "type": "string"
          "enum":
            - "above"
            - "below"
            - "pct_up"
            - "pct_down"
            - "rsi_above"
            - "rsi_below"
            - "px_above_sma50"
            - "px_below_sma50"
            - "px_above_sma200"
            - "px_below_sma200"
          "title": "Condition"
        "threshold":
          "anyOf":
            - "type": "number"
              "exclusiveMinimum": 0.0
            - "type": "string"
              "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"
          "title": "Threshold"
        "baseline_price":
          "anyOf":
            - "type": "number"
              "exclusiveMinimum": 0.0
            - "type": "string"
              "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"
            - "type": "null"
          "title": "Baseline Price"
        "note":
          "anyOf":
            - "type": "string"
              "maxLength": 256
            - "type": "null"
          "title": "Note"
        "condition2":
          "anyOf":
            - "type": "string"
              "enum":
                - "above"
                - "below"
                - "pct_up"
                - "pct_down"
                - "rsi_above"
                - "rsi_below"
                - "px_above_sma50"
                - "px_below_sma50"
                - "px_above_sma200"
                - "px_below_sma200"
            - "type": "null"
          "title": "Condition2"
        "threshold2":
          "anyOf":
            - "type": "number"
              "exclusiveMinimum": 0.0
            - "type": "string"
              "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"
            - "type": "null"
          "title": "Threshold2"
        "logic":
          "anyOf":
            - "type": "string"
              "enum":
                - "AND"
                - "OR"
            - "type": "null"
          "title": "Logic"
        "scope":
          "type": "string"
          "enum":
            - "ticker"
            - "watchlist"
          "title": "Scope"
          "default": "ticker"
      "type": "object"
      "required":
        - "ticker"
        - "condition"
        - "threshold"
      "title": "AlertCreate"
    "AlertOut":
      "properties":
        "id":
          "type": "string"
          "title": "Id"
        "ticker":
          "type": "string"
          "title": "Ticker"
        "condition":
          "type": "string"
          "title": "Condition"
        "threshold":
          "type": "number"
          "title": "Threshold"
        "baseline_price":
          "anyOf":
            - "type": "number"
            - "type": "null"
          "title": "Baseline Price"
        "condition2":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Condition2"
        "threshold2":
          "anyOf":
            - "type": "number"
            - "type": "null"
          "title": "Threshold2"
        "logic":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Logic"
        "scope":
          "type": "string"
          "title": "Scope"
          "default": "ticker"
        "status":
          "type": "string"
          "title": "Status"
        "triggered_at":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Triggered At"
        "triggered_price":
          "anyOf":
            - "type": "number"
            - "type": "null"
          "title": "Triggered Price"
        "note":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Note"
        "created_at":
          "type": "string"
          "title": "Created At"
      "type": "object"
      "required":
        - "id"
        - "ticker"
        - "condition"
        - "threshold"
        - "baseline_price"
        - "status"
        - "triggered_at"
        - "triggered_price"
        - "note"
        - "created_at"
      "title": "AlertOut"
    "AlertPatch":
      "properties":
        "status":
          "anyOf":
            - "type": "string"
              "enum":
                - "active"
                - "dismissed"
            - "type": "null"
          "title": "Status"
        "note":
          "anyOf":
            - "type": "string"
              "maxLength": 256
            - "type": "null"
          "title": "Note"
      "type": "object"
      "title": "AlertPatch"
    "AnnotationRequest":
      "properties":
        "ticker":
          "type": "string"
          "title": "Ticker"
          "default": "DEMO"
        "headlines":
          "anyOf":
            - "items": "{}"
              "type": "array"
            - "type": "null"
          "title": "Headlines"
        "filings":
          "anyOf":
            - "items": "{}"
              "type": "array"
            - "type": "null"
          "title": "Filings"
        "price_series":
          "anyOf":
            - "items": "{}"
              "type": "array"
            - "type": "null"
          "title": "Price Series"
      "type": "object"
      "title": "AnnotationRequest"
    "AskIn":
      "properties":
        "query":
          "type": "string"
          "maxLength": 400
          "minLength": 1
          "title": "Query"
        "last_ticker":
          "anyOf":
            - "type": "string"
              "maxLength": 12
            - "type": "null"
          "title": "Last Ticker"
        "alts":
          "anyOf":
            - "items":
                "type": "string"
              "type": "array"
              "maxItems": 5
            - "type": "null"
          "title": "Alts"
      "type": "object"
      "required":
        - "query"
      "title": "AskIn"
    "AttributePayload":
      "properties":
        "code":
          "type": "string"
          "title": "Code"
        "new_user_id":
          "type": "string"
          "title": "New User Id"
      "type": "object"
      "required":
        - "code"
        - "new_user_id"
      "title": "AttributePayload"
    "AuthResponse":
      "properties":
        "access_token":
          "type": "string"
          "title": "Access Token"
        "token_type":
          "type": "string"
          "title": "Token Type"
          "default": "bearer"
        "user":
          "additionalProperties": true
          "type": "object"
          "title": "User"
      "type": "object"
      "required":
        - "access_token"
        - "user"
      "title": "AuthResponse"
    "BlueSkyCheckRequest":
      "properties":
        "investor_state":
          "type": "string"
          "title": "Investor State"
        "offering_type":
          "type": "string"
          "title": "Offering Type"
          "default": "reg_d_506b"
        "offering_amount_usd":
          "type": "number"
          "title": "Offering Amount Usd"
          "default": 5000000.0
        "is_mining_resource":
          "type": "boolean"
          "title": "Is Mining Resource"
          "default": false
        "is_flow_through":
          "type": "boolean"
          "title": "Is Flow Through"
          "default": false
        "exchange":
          "type": "string"
          "title": "Exchange"
          "default": ""
        "max_non_accredited":
          "type": "integer"
          "title": "Max Non Accredited"
          "default": 0
        "general_solicitation":
          "type": "boolean"
          "title": "General Solicitation"
          "default": false
      "type": "object"
      "required":
        - "investor_state"
      "title": "BlueSkyCheckRequest"
    "BlueSkyMultiStateRequest":
      "properties":
        "states":
          "items":
            "type": "string"
          "type": "array"
          "title": "States"
        "offering_type":
          "type": "string"
          "title": "Offering Type"
          "default": "reg_d_506b"
        "offering_amount_usd":
          "type": "number"
          "title": "Offering Amount Usd"
          "default": 5000000.0
        "is_mining_resource":
          "type": "boolean"
          "title": "Is Mining Resource"
          "default": false
        "is_flow_through":
          "type": "boolean"
          "title": "Is Flow Through"
          "default": false
        "exchange":
          "type": "string"
          "title": "Exchange"
          "default": ""
        "max_non_accredited":
          "type": "integer"
          "title": "Max Non Accredited"
          "default": 0
        "general_solicitation":
          "type": "boolean"
          "title": "General Solicitation"
          "default": false
      "type": "object"
      "required":
        - "states"
      "title": "BlueSkyMultiStateRequest"
    "Body_chat_parse_pdf_api_v1_chat_parse_pdf_post":
      "properties":
        "file":
          "type": "string"
          "contentMediaType": "application/octet-stream"
          "title": "File"
      "type": "object"
      "required":
        - "file"
      "title": "Body_chat_parse_pdf_api_v1_chat_parse_pdf_post"
    "CancelIn":
      "properties":
        "reason":
          "anyOf":
            - "type": "string"
              "maxLength": 500
            - "type": "null"
          "title": "Reason"
      "type": "object"
      "title": "CancelIn"
    "ChangePasswordRequest":
      "properties":
        "current_password":
          "type": "string"
          "title": "Current Password"
        "new_password":
          "type": "string"
          "title": "New Password"
      "type": "object"
      "required":
        - "current_password"
        - "new_password"
      "title": "ChangePasswordRequest"
    "ChangeTierIn":
      "properties":
        "target_tier":
          "type": "string"
          "pattern": "^(core|trader|alpha|apex|prime)$"
          "title": "Target Tier"
        "note":
          "anyOf":
            - "type": "string"
              "maxLength": 500
            - "type": "null"
          "title": "Note"
      "type": "object"
      "required":
        - "target_tier"
      "title": "ChangeTierIn"
    "ChatRequest":
      "properties":
        "content":
          "type": "string"
          "maxLength": 16000
          "title": "Content"
        "image_base64":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Image Base64"
        "quality":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Quality"
          "default": "fast"
        "session_id":
          "anyOf":
            - "type": "string"
              "maxLength": 64
            - "type": "null"
          "title": "Session Id"
      "type": "object"
      "required":
        - "content"
      "title": "ChatRequest"
    "ChatShareRequest":
      "properties":
        "title":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Title"
        "messages":
          "items": "{}"
          "type": "array"
          "title": "Messages"
      "type": "object"
      "required":
        - "messages"
      "title": "ChatShareRequest"
    "CheckoutIn":
      "properties":
        "tier":
          "type": "string"
          "pattern": "^(trader|alpha|apex|prime)$"
          "title": "Tier"
        "interval":
          "type": "string"
          "pattern": "^(monthly|yearly)$"
          "title": "Interval"
      "type": "object"
      "required":
        - "tier"
        - "interval"
      "title": "CheckoutIn"
    "ComplianceFTSRequest":
      "properties":
        "investor_state":
          "type": "string"
          "title": "Investor State"
        "offering_type":
          "type": "string"
          "title": "Offering Type"
          "default": "reg_d_506b"
        "offering_amount_usd":
          "type": "number"
          "title": "Offering Amount Usd"
          "default": 5000000.0
        "is_mining_resource":
          "type": "boolean"
          "title": "Is Mining Resource"
          "default": false
        "is_flow_through":
          "type": "boolean"
          "title": "Is Flow Through"
          "default": false
        "exchange":
          "type": "string"
          "title": "Exchange"
          "default": ""
        "share_price":
          "type": "number"
          "title": "Share Price"
          "default": 1.0
        "num_shares":
          "type": "integer"
          "title": "Num Shares"
          "default": 10000
        "income":
          "type": "number"
          "title": "Income"
          "default": 150000.0
        "fts_type":
          "type": "string"
          "title": "Fts Type"
          "default": "regular"
        "commodity":
          "type": "string"
          "title": "Commodity"
          "default": "gold"
        "warrant_value":
          "type": "number"
          "title": "Warrant Value"
          "default": 0.0
      "type": "object"
      "required":
        - "investor_state"
      "title": "ComplianceFTSRequest"
      "description": "Combined Blue Sky compliance + tax-alpha calculation."
    "ComponentStatus":
      "properties":
        "name":
          "type": "string"
          "title": "Name"
        "status":
          "type": "string"
          "title": "Status"
        "latency_ms":
          "anyOf":
            - "type": "integer"
            - "type": "null"
          "title": "Latency Ms"
        "detail":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Detail"
        "checked_at":
          "type": "string"
          "title": "Checked At"
      "type": "object"
      "required":
        - "name"
        - "status"
        - "latency_ms"
        - "detail"
        - "checked_at"
      "title": "ComponentStatus"
    "ConcallHit":
      "properties":
        "ticker":
          "type": "string"
          "title": "Ticker"
        "video_id":
          "type": "string"
          "title": "Video Id"
        "video_url":
          "type": "string"
          "title": "Video Url"
        "video_title":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Video Title"
        "uploader":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Uploader"
        "upload_date":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Upload Date"
        "chunk_idx":
          "type": "integer"
          "title": "Chunk Idx"
        "start_ms":
          "type": "integer"
          "title": "Start Ms"
        "end_ms":
          "type": "integer"
          "title": "End Ms"
        "text":
          "type": "string"
          "title": "Text"
        "score":
          "type": "number"
          "title": "Score"
      "type": "object"
      "required":
        - "ticker"
        - "video_id"
        - "video_url"
        - "chunk_idx"
        - "start_ms"
        - "end_ms"
        - "text"
        - "score"
      "title": "ConcallHit"
    "ConcallSearchResponse":
      "properties":
        "hits":
          "items":
            "$ref": "#/components/schemas/ConcallHit"
          "type": "array"
          "title": "Hits"
        "query":
          "type": "string"
          "title": "Query"
        "total":
          "type": "integer"
          "title": "Total"
      "type": "object"
      "required":
        - "hits"
        - "query"
        - "total"
      "title": "ConcallSearchResponse"
    "ConcallStatsEntry":
      "properties":
        "ticker":
          "type": "string"
          "title": "Ticker"
        "chunk_count":
          "type": "integer"
          "title": "Chunk Count"
      "type": "object"
      "required":
        - "ticker"
        - "chunk_count"
      "title": "ConcallStatsEntry"
    "ConcallStatsResponse":
      "properties":
        "by_ticker":
          "items":
            "$ref": "#/components/schemas/ConcallStatsEntry"
          "type": "array"
          "title": "By Ticker"
        "total_chunks":
          "type": "integer"
          "title": "Total Chunks"
        "total_tickers":
          "type": "integer"
          "title": "Total Tickers"
      "type": "object"
      "required":
        - "by_ticker"
        - "total_chunks"
        - "total_tickers"
      "title": "ConcallStatsResponse"
    "ConsentRequest":
      "properties":
        "consent_type":
          "type": "string"
          "title": "Consent Type"
        "consent_action":
          "type": "string"
          "title": "Consent Action"
        "session_id":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Session Id"
        "consent_version":
          "type": "string"
          "title": "Consent Version"
          "default": "1.0"
        "privacy_policy_version":
          "type": "string"
          "title": "Privacy Policy Version"
          "default": "2026.04"
        "language":
          "type": "string"
          "title": "Language"
          "default": "en"
      "type": "object"
      "required":
        - "consent_type"
        - "consent_action"
      "title": "ConsentRequest"
    "ConsentResponse":
      "properties":
        "id":
          "type": "string"
          "title": "Id"
        "consent_type":
          "type": "string"
          "title": "Consent Type"
        "consent_action":
          "type": "string"
          "title": "Consent Action"
        "created_at":
          "type": "string"
          "title": "Created At"
        "consent_version":
          "type": "string"
          "title": "Consent Version"
      "type": "object"
      "required":
        - "id"
        - "consent_type"
        - "consent_action"
        - "created_at"
        - "consent_version"
      "title": "ConsentResponse"
    "ConvertPayload":
      "properties":
        "referred_user_id":
          "type": "string"
          "title": "Referred User Id"
        "tier":
          "type": "string"
          "title": "Tier"
      "type": "object"
      "required":
        - "referred_user_id"
        - "tier"
      "title": "ConvertPayload"
    "DailyFeedResponse":
      "properties":
        "updates":
          "items":
            "$ref": "#/components/schemas/DailyUpdateSummary"
          "type": "array"
          "title": "Updates"
        "total":
          "type": "integer"
          "title": "Total"
        "limit":
          "type": "integer"
          "title": "Limit"
        "offset":
          "type": "integer"
          "title": "Offset"
      "type": "object"
      "required":
        - "updates"
        - "total"
        - "limit"
        - "offset"
      "title": "DailyFeedResponse"
    "DailyStatsEntry":
      "properties":
        "date":
          "type": "string"
          "title": "Date"
        "count":
          "type": "integer"
          "title": "Count"
      "type": "object"
      "required":
        - "date"
        - "count"
      "title": "DailyStatsEntry"
    "DailyStatsResponse":
      "properties":
        "last_30_days":
          "items":
            "$ref": "#/components/schemas/DailyStatsEntry"
          "type": "array"
          "title": "Last 30 Days"
        "total_all_time":
          "type": "integer"
          "title": "Total All Time"
      "type": "object"
      "required":
        - "last_30_days"
        - "total_all_time"
      "title": "DailyStatsResponse"
    "DailyUpdateFull":
      "properties":
        "slug":
          "type": "string"
          "title": "Slug"
        "date":
          "type": "string"
          "title": "Date"
        "title":
          "type": "string"
          "title": "Title"
        "summary":
          "type": "string"
          "title": "Summary"
        "ticker":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Ticker"
        "category":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Category"
        "llm_provider":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Llm Provider"
        "view_count":
          "type": "integer"
          "title": "View Count"
          "default": 0
        "body":
          "type": "string"
          "title": "Body"
      "type": "object"
      "required":
        - "slug"
        - "date"
        - "title"
        - "summary"
        - "body"
      "title": "DailyUpdateFull"
    "DailyUpdateSummary":
      "properties":
        "slug":
          "type": "string"
          "title": "Slug"
        "date":
          "type": "string"
          "title": "Date"
        "title":
          "type": "string"
          "title": "Title"
        "summary":
          "type": "string"
          "title": "Summary"
        "ticker":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Ticker"
        "category":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Category"
        "llm_provider":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Llm Provider"
        "view_count":
          "type": "integer"
          "title": "View Count"
          "default": 0
      "type": "object"
      "required":
        - "slug"
        - "date"
        - "title"
        - "summary"
      "title": "DailyUpdateSummary"
    "DelistingRiskRequest":
      "properties":
        "ticker":
          "type": "string"
          "title": "Ticker"
        "exchange":
          "type": "string"
          "title": "Exchange"
          "default": "NASDAQ"
        "total_shares":
          "type": "integer"
          "title": "Total Shares"
          "default": 0
        "insider_shares":
          "type": "integer"
          "title": "Insider Shares"
          "default": 0
        "institutional_shares":
          "type": "integer"
          "title": "Institutional Shares"
          "default": 0
        "restricted_shares":
          "type": "integer"
          "title": "Restricted Shares"
          "default": 0
        "press_release_text":
          "type": "string"
          "title": "Press Release Text"
          "default": ""
        "operations_country":
          "type": "string"
          "title": "Operations Country"
          "default": "US"
        "auditor_jurisdiction":
          "type": "string"
          "title": "Auditor Jurisdiction"
          "default": "US"
        "audit_firm_name":
          "type": "string"
          "title": "Audit Firm Name"
          "default": ""
        "is_reverse_merger":
          "type": "boolean"
          "title": "Is Reverse Merger"
          "default": false
        "is_shell_company":
          "type": "boolean"
          "title": "Is Shell Company"
          "default": false
      "type": "object"
      "required":
        - "ticker"
      "title": "DelistingRiskRequest"
    "DeviceRegistration":
      "properties":
        "platform":
          "type": "string"
          "maxLength": 16
          "title": "Platform"
        "token":
          "type": "string"
          "maxLength": 4096
          "minLength": 8
          "title": "Token"
      "type": "object"
      "required":
        - "platform"
        - "token"
      "title": "DeviceRegistration"
    "DrillInterpretRequest":
      "properties":
        "text":
          "type": "string"
          "title": "Text"
        "deposit_type":
          "type": "string"
          "title": "Deposit Type"
          "default": "default"
        "intervals":
          "items":
            "additionalProperties": true
            "type": "object"
          "type": "array"
          "title": "Intervals"
          "default": "[]"
      "type": "object"
      "required":
        - "text"
      "title": "DrillInterpretRequest"
    "EmailCaptureRequest":
      "properties":
        "email":
          "type": "string"
          "format": "email"
          "title": "Email"
        "source":
          "type": "string"
          "title": "Source"
          "default": "landing"
        "context":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Context"
      "type": "object"
      "required":
        - "email"
      "title": "EmailCaptureRequest"
    "EmailCaptureResponse":
      "properties":
        "status":
          "type": "string"
          "title": "Status"
      "type": "object"
      "required":
        - "status"
      "title": "EmailCaptureResponse"
    "ExpertReviewRequest":
      "properties":
        "expert_id":
          "type": "string"
          "title": "Expert Id"
        "category":
          "type": "string"
          "title": "Category"
        "verdict":
          "type": "string"
          "title": "Verdict"
        "rating":
          "type": "integer"
          "title": "Rating"
          "default": 5
        "ai_prompt":
          "type": "string"
          "title": "Ai Prompt"
          "default": ""
        "ai_output":
          "type": "string"
          "title": "Ai Output"
          "default": ""
        "corrected_output":
          "type": "string"
          "title": "Corrected Output"
          "default": ""
        "correction_notes":
          "type": "string"
          "title": "Correction Notes"
          "default": ""
        "severity":
          "type": "string"
          "title": "Severity"
          "default": "low"
        "could_cause_investment_loss":
          "type": "boolean"
          "title": "Could Cause Investment Loss"
          "default": false
      "type": "object"
      "required":
        - "expert_id"
        - "category"
        - "verdict"
      "title": "ExpertReviewRequest"
    "FTSCalculateRequest":
      "properties":
        "share_price":
          "type": "number"
          "title": "Share Price"
        "num_shares":
          "type": "integer"
          "title": "Num Shares"
        "income":
          "type": "number"
          "title": "Income"
        "jurisdiction":
          "type": "string"
          "title": "Jurisdiction"
        "fts_type":
          "type": "string"
          "title": "Fts Type"
          "default": "regular"
        "commodity":
          "type": "string"
          "title": "Commodity"
          "default": "gold"
        "warrant_value":
          "type": "number"
          "title": "Warrant Value"
          "default": 0.0
      "type": "object"
      "required":
        - "share_price"
        - "num_shares"
        - "income"
        - "jurisdiction"
      "title": "FTSCalculateRequest"
    "GeoChatMessageRequest":
      "properties":
        "content":
          "type": "string"
          "title": "Content"
      "type": "object"
      "required":
        - "content"
      "title": "GeoChatMessageRequest"
    "HTTPValidationError":
      "properties":
        "detail":
          "items":
            "$ref": "#/components/schemas/ValidationError"
          "type": "array"
          "title": "Detail"
      "type": "object"
      "title": "HTTPValidationError"
    "HistoryPoint":
      "properties":
        "component":
          "type": "string"
          "title": "Component"
        "hour":
          "type": "string"
          "title": "Hour"
        "status":
          "type": "string"
          "title": "Status"
        "uptime_pct":
          "type": "number"
          "title": "Uptime Pct"
      "type": "object"
      "required":
        - "component"
        - "hour"
        - "status"
        - "uptime_pct"
      "title": "HistoryPoint"
    "IncidentOut":
      "properties":
        "id":
          "type": "string"
          "title": "Id"
        "title":
          "type": "string"
          "title": "Title"
        "impact":
          "type": "string"
          "title": "Impact"
        "body":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Body"
        "started_at":
          "type": "string"
          "title": "Started At"
        "resolved_at":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Resolved At"
      "type": "object"
      "required":
        - "id"
        - "title"
        - "impact"
        - "body"
        - "started_at"
        - "resolved_at"
      "title": "IncidentOut"
    "IpoAlertCreate":
      "properties":
        "ticker":
          "type": "string"
          "maxLength": 16
          "minLength": 1
          "title": "Ticker"
        "event":
          "type": "string"
          "enum":
            - "priced"
            - "listed"
            - "lockup_soon"
            - "range_amended"
          "title": "Event"
        "lead_days":
          "anyOf":
            - "type": "integer"
              "maximum": 90.0
              "minimum": 1.0
            - "type": "null"
          "title": "Lead Days"
          "default": 7
        "note":
          "anyOf":
            - "type": "string"
              "maxLength": 200
            - "type": "null"
          "title": "Note"
      "type": "object"
      "required":
        - "ticker"
        - "event"
      "title": "IpoAlertCreate"
    "IpoAlertPatch":
      "properties":
        "status":
          "type": "string"
          "enum":
            - "active"
            - "dismissed"
          "title": "Status"
      "type": "object"
      "required":
        - "status"
      "title": "IpoAlertPatch"
    "ItemAdd":
      "properties":
        "ticker":
          "type": "string"
          "maxLength": 16
          "minLength": 1
          "title": "Ticker"
        "tags":
          "items":
            "type": "string"
          "type": "array"
          "title": "Tags"
        "note":
          "anyOf":
            - "type": "string"
              "maxLength": 500
            - "type": "null"
          "title": "Note"
      "type": "object"
      "required":
        - "ticker"
      "title": "ItemAdd"
    "ItemOut":
      "properties":
        "id":
          "type": "string"
          "title": "Id"
        "ticker":
          "type": "string"
          "title": "Ticker"
        "tags":
          "items":
            "type": "string"
          "type": "array"
          "title": "Tags"
        "note":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Note"
        "position":
          "type": "integer"
          "title": "Position"
        "created_at":
          "type": "string"
          "title": "Created At"
      "type": "object"
      "required":
        - "id"
        - "ticker"
        - "tags"
        - "note"
        - "position"
        - "created_at"
      "title": "ItemOut"
    "ItemPatch":
      "properties":
        "tags":
          "anyOf":
            - "items":
                "type": "string"
              "type": "array"
            - "type": "null"
          "title": "Tags"
        "note":
          "anyOf":
            - "type": "string"
              "maxLength": 500
            - "type": "null"
          "title": "Note"
        "position":
          "anyOf":
            - "type": "integer"
              "maximum": 100000.0
              "minimum": 0.0
            - "type": "null"
          "title": "Position"
      "type": "object"
      "title": "ItemPatch"
    "LoginRequest":
      "properties":
        "email":
          "type": "string"
          "format": "email"
          "title": "Email"
        "password":
          "type": "string"
          "title": "Password"
      "type": "object"
      "required":
        - "email"
        - "password"
      "title": "LoginRequest"
    "PasswordResetConfirm":
      "properties":
        "token":
          "type": "string"
          "title": "Token"
        "new_password":
          "type": "string"
          "title": "New Password"
      "type": "object"
      "required":
        - "token"
        - "new_password"
      "title": "PasswordResetConfirm"
    "PasswordResetRequest":
      "properties":
        "email":
          "type": "string"
          "format": "email"
          "title": "Email"
      "type": "object"
      "required":
        - "email"
      "title": "PasswordResetRequest"
    "PositionIn":
      "properties":
        "ticker":
          "type": "string"
          "maxLength": 16
          "minLength": 1
          "title": "Ticker"
        "quantity":
          "type": "number"
          "title": "Quantity"
          "description": "Signed. NEGATIVE = short. Never silently dropped."
        "acb_per_share":
          "anyOf":
            - "type": "number"
              "minimum": 0.0
            - "type": "null"
          "title": "Acb Per Share"
        "currency":
          "type": "string"
          "maxLength": 3
          "minLength": 3
          "title": "Currency"
        "account_type":
          "type": "string"
          "maxLength": 32
          "title": "Account Type"
          "default": "unspecified"
        "note":
          "anyOf":
            - "type": "string"
              "maxLength": 500
            - "type": "null"
          "title": "Note"
      "type": "object"
      "required":
        - "ticker"
        - "quantity"
        - "currency"
      "title": "PositionIn"
    "ProcessReportRequest":
      "properties":
        "pdf_path":
          "type": "string"
          "title": "Pdf Path"
        "company_ticker":
          "type": "string"
          "title": "Company Ticker"
          "default": ""
      "type": "object"
      "required":
        - "pdf_path"
      "title": "ProcessReportRequest"
    "ProcessReportResponse":
      "properties":
        "task_id":
          "type": "string"
          "title": "Task Id"
        "status":
          "type": "string"
          "title": "Status"
        "message":
          "type": "string"
          "title": "Message"
      "type": "object"
      "required":
        - "task_id"
        - "status"
        - "message"
      "title": "ProcessReportResponse"
    "ProfileResponse":
      "properties":
        "id":
          "type": "string"
          "title": "Id"
        "email":
          "type": "string"
          "title": "Email"
        "full_name":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Full Name"
        "display_name":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Display Name"
        "tier":
          "type": "string"
          "title": "Tier"
        "billing_status":
          "type": "string"
          "title": "Billing Status"
        "is_active":
          "type": "boolean"
          "title": "Is Active"
        "queries_today":
          "type": "integer"
          "title": "Queries Today"
        "created_at":
          "type": "string"
          "title": "Created At"
        "last_login_at":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Last Login At"
      "type": "object"
      "required":
        - "id"
        - "email"
        - "full_name"
        - "display_name"
        - "tier"
        - "billing_status"
        - "is_active"
        - "queries_today"
        - "created_at"
        - "last_login_at"
      "title": "ProfileResponse"
    "PushKeys":
      "properties":
        "p256dh":
          "type": "string"
          "maxLength": 128
          "minLength": 10
          "title": "P256Dh"
        "auth":
          "type": "string"
          "maxLength": 64
          "minLength": 10
          "title": "Auth"
      "type": "object"
      "required":
        - "p256dh"
        - "auth"
      "title": "PushKeys"
    "PushSubscribeRequest":
      "properties":
        "endpoint":
          "type": "string"
          "title": "Endpoint"
        "p256dh":
          "type": "string"
          "title": "P256Dh"
        "auth":
          "type": "string"
          "title": "Auth"
        "tickers":
          "anyOf":
            - "items": "{}"
              "type": "array"
            - "type": "null"
          "title": "Tickers"
      "type": "object"
      "required":
        - "endpoint"
        - "p256dh"
        - "auth"
      "title": "PushSubscribeRequest"
    "PushSubscriptionPayload":
      "properties":
        "endpoint":
          "type": "string"
          "maxLength": 2000
          "minLength": 20
          "title": "Endpoint"
        "keys":
          "$ref": "#/components/schemas/PushKeys"
      "type": "object"
      "required":
        - "endpoint"
        - "keys"
      "title": "PushSubscriptionPayload"
    "QuinnFeedbackRequest":
      "properties":
        "vote":
          "type": "string"
          "title": "Vote"
          "default": ""
        "query":
          "type": "string"
          "title": "Query"
          "default": ""
        "answer":
          "type": "string"
          "title": "Answer"
          "default": ""
        "model":
          "type": "string"
          "title": "Model"
          "default": ""
        "session_id":
          "type": "string"
          "title": "Session Id"
          "default": ""
      "type": "object"
      "title": "QuinnFeedbackRequest"
    "QuinnProfileRequest":
      "properties":
        "about_me":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "About Me"
          "default": ""
        "my_voice":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "My Voice"
          "default": ""
        "my_rules":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "My Rules"
          "default": ""
        "sharia_standard":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Sharia Standard"
          "default": ""
        "jurisdiction":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Jurisdiction"
          "default": ""
        "sectors":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Sectors"
          "default": ""
      "type": "object"
      "title": "QuinnProfileRequest"
    "RegisterRequest":
      "properties":
        "email":
          "type": "string"
          "format": "email"
          "title": "Email"
        "password":
          "type": "string"
          "title": "Password"
        "full_name":
          "type": "string"
          "title": "Full Name"
          "default": ""
        "plan":
          "type": "string"
          "title": "Plan"
          "default": "core"
        "addons":
          "items":
            "type": "string"
          "type": "array"
          "title": "Addons"
          "default": "[]"
      "type": "object"
      "required":
        - "email"
        - "password"
      "title": "RegisterRequest"
    "ReorderEntry":
      "properties":
        "id":
          "type": "string"
          "format": "uuid"
          "title": "Id"
        "position":
          "type": "integer"
          "maximum": 100000.0
          "minimum": 0.0
          "title": "Position"
      "type": "object"
      "required":
        - "id"
        - "position"
      "title": "ReorderEntry"
    "ReorderPayload":
      "properties":
        "items":
          "items":
            "$ref": "#/components/schemas/ReorderEntry"
          "type": "array"
          "maxItems": 500
          "title": "Items"
      "type": "object"
      "required":
        - "items"
      "title": "ReorderPayload"
    "ScenarioOut":
      "properties":
        "id":
          "type": "string"
          "title": "Id"
        "name":
          "type": "string"
          "title": "Name"
        "config":
          "additionalProperties": true
          "type": "object"
          "title": "Config"
        "updated_at":
          "type": "string"
          "title": "Updated At"
      "type": "object"
      "required":
        - "id"
        - "name"
        - "config"
        - "updated_at"
      "title": "ScenarioOut"
    "ScenarioRangeRequest":
      "properties":
        "ticker":
          "type": "string"
          "title": "Ticker"
          "default": "AAPL"
        "horizon":
          "type": "integer"
          "title": "Horizon"
          "default": 5
      "type": "object"
      "title": "ScenarioRangeRequest"
    "ScenarioRequest":
      "properties":
        "ticker":
          "type": "string"
          "title": "Ticker"
          "default": "DEMO"
        "company_name":
          "type": "string"
          "title": "Company Name"
          "default": ""
        "prompt":
          "type": "string"
          "title": "Prompt"
          "default": ""
        "horizon":
          "type": "integer"
          "title": "Horizon"
          "default": 5
        "shares_outstanding":
          "anyOf":
            - "type": "integer"
            - "type": "null"
          "title": "Shares Outstanding"
        "overrides":
          "anyOf":
            - "items": "{}"
              "type": "array"
            - "type": "null"
          "title": "Overrides"
        "historical_data":
          "anyOf":
            - "additionalProperties": true
              "type": "object"
            - "type": "null"
          "title": "Historical Data"
      "type": "object"
      "title": "ScenarioRequest"
    "ScenarioSave":
      "properties":
        "name":
          "type": "string"
          "maxLength": 80
          "minLength": 1
          "title": "Name"
        "config":
          "additionalProperties": true
          "type": "object"
          "title": "Config"
      "type": "object"
      "required":
        - "name"
      "title": "ScenarioSave"
    "ScrapeRequest":
      "properties":
        "ticker":
          "type": "string"
          "title": "Ticker"
        "exchange":
          "type": "string"
          "title": "Exchange"
          "default": "TSX-V"
        "include_sedi":
          "type": "boolean"
          "title": "Include Sedi"
          "default": true
        "include_sedar":
          "type": "boolean"
          "title": "Include Sedar"
          "default": true
      "type": "object"
      "required":
        - "ticker"
      "title": "ScrapeRequest"
    "ScrapeResponse":
      "properties":
        "task_id":
          "type": "string"
          "title": "Task Id"
        "status":
          "type": "string"
          "title": "Status"
        "ticker":
          "type": "string"
          "title": "Ticker"
        "message":
          "type": "string"
          "title": "Message"
      "type": "object"
      "required":
        - "task_id"
        - "status"
        - "ticker"
        - "message"
      "title": "ScrapeResponse"
    "ScreenOut":
      "properties":
        "id":
          "type": "string"
          "title": "Id"
        "name":
          "type": "string"
          "title": "Name"
        "config":
          "additionalProperties": true
          "type": "object"
          "title": "Config"
        "updated_at":
          "type": "string"
          "title": "Updated At"
      "type": "object"
      "required":
        - "id"
        - "name"
        - "config"
        - "updated_at"
      "title": "ScreenOut"
    "ScreenResponse":
      "properties":
        "ticker":
          "type": "string"
          "title": "Ticker"
        "standard":
          "type": "string"
          "title": "Standard"
        "sector_status":
          "type": "string"
          "title": "Sector Status"
        "sector_pass":
          "type": "boolean"
          "title": "Sector Pass"
        "sector_reason":
          "type": "string"
          "title": "Sector Reason"
        "debt_ratio":
          "anyOf":
            - "type": "number"
            - "type": "null"
          "title": "Debt Ratio"
        "debt_threshold":
          "type": "number"
          "title": "Debt Threshold"
        "debt_pass":
          "type": "boolean"
          "title": "Debt Pass"
        "cash_ratio":
          "anyOf":
            - "type": "number"
            - "type": "null"
          "title": "Cash Ratio"
        "cash_threshold":
          "type": "number"
          "title": "Cash Threshold"
        "cash_pass":
          "type": "boolean"
          "title": "Cash Pass"
        "ar_ratio":
          "anyOf":
            - "type": "number"
            - "type": "null"
          "title": "Ar Ratio"
        "ar_threshold":
          "type": "number"
          "title": "Ar Threshold"
        "ar_pass":
          "type": "boolean"
          "title": "Ar Pass"
        "overall_pass":
          "type": "boolean"
          "title": "Overall Pass"
        "haram_revenue_pct":
          "anyOf":
            - "type": "number"
            - "type": "null"
          "title": "Haram Revenue Pct"
        "notes":
          "type": "string"
          "title": "Notes"
        "screen_date":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Screen Date"
        "resolved_ticker":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Resolved Ticker"
        "long_name":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Long Name"
        "failure_reasons":
          "items":
            "type": "string"
          "type": "array"
          "title": "Failure Reasons"
          "default": "[]"
        "ar_applicable":
          "type": "boolean"
          "title": "Ar Applicable"
          "default": true
        "debt_denominator_label":
          "type": "string"
          "title": "Debt Denominator Label"
          "default": "total assets"
        "cash_denominator_label":
          "type": "string"
          "title": "Cash Denominator Label"
          "default": "total assets"
        "ar_denominator_label":
          "type": "string"
          "title": "Ar Denominator Label"
          "default": "total assets"
        "ar_numerator_label":
          "type": "string"
          "title": "Ar Numerator Label"
          "default": "Accounts receivable"
        "compare_op":
          "type": "string"
          "title": "Compare Op"
          "default": "<="
        "debt_numerator_value":
          "anyOf":
            - "type": "number"
            - "type": "null"
          "title": "Debt Numerator Value"
        "debt_denominator_value":
          "anyOf":
            - "type": "number"
            - "type": "null"
          "title": "Debt Denominator Value"
        "cash_numerator_value":
          "anyOf":
            - "type": "number"
            - "type": "null"
          "title": "Cash Numerator Value"
        "cash_denominator_value":
          "anyOf":
            - "type": "number"
            - "type": "null"
          "title": "Cash Denominator Value"
        "ar_numerator_value":
          "anyOf":
            - "type": "number"
            - "type": "null"
          "title": "Ar Numerator Value"
        "ar_denominator_value":
          "anyOf":
            - "type": "number"
            - "type": "null"
          "title": "Ar Denominator Value"
        "msci_dividend_adjustment_factor":
          "anyOf":
            - "type": "number"
            - "type": "null"
          "title": "Msci Dividend Adjustment Factor"
        "aaoifi_purification_ratio":
          "anyOf":
            - "type": "number"
            - "type": "null"
          "title": "Aaoifi Purification Ratio"
        "djim_purification_ratio_informational":
          "anyOf":
            - "type": "number"
            - "type": "null"
          "title": "Djim Purification Ratio Informational"
        "currency":
          "type": "string"
          "title": "Currency"
          "default": "USD"
        "threshold_mode":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Threshold Mode"
        "buffer_applied":
          "items":
            "type": "string"
          "type": "array"
          "title": "Buffer Applied"
          "default": "[]"
        "history_months":
          "anyOf":
            - "type": "integer"
            - "type": "null"
          "title": "History Months"
        "sukuk_carve_pct":
          "anyOf":
            - "type": "number"
            - "type": "null"
          "title": "Sukuk Carve Pct"
        "verdict_locked_until":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Verdict Locked Until"
        "country_code":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Country Code"
        "filing_source":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Filing Source"
        "filing_date":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Filing Date"
        "fiscal_year_end":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Fiscal Year End"
        "data_currency":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Data Currency"
        "data_freshness":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Data Freshness"
      "type": "object"
      "required":
        - "ticker"
        - "standard"
        - "sector_status"
        - "sector_pass"
        - "sector_reason"
        - "debt_ratio"
        - "debt_threshold"
        - "debt_pass"
        - "cash_ratio"
        - "cash_threshold"
        - "cash_pass"
        - "ar_ratio"
        - "ar_threshold"
        - "ar_pass"
        - "overall_pass"
        - "haram_revenue_pct"
        - "notes"
        - "screen_date"
      "title": "ScreenResponse"
    "ScreenSave":
      "properties":
        "name":
          "type": "string"
          "maxLength": 80
          "minLength": 1
          "title": "Name"
        "config":
          "additionalProperties": true
          "type": "object"
          "title": "Config"
      "type": "object"
      "required":
        - "name"
      "title": "ScreenSave"
    "SensitivityRequest":
      "properties":
        "ticker":
          "type": "string"
          "title": "Ticker"
          "default": "DEMO"
        "company_name":
          "type": "string"
          "title": "Company Name"
          "default": ""
        "x_param":
          "type": "string"
          "title": "X Param"
          "default": "discount_rate"
        "y_param":
          "type": "string"
          "title": "Y Param"
          "default": "terminal_growth"
        "x_range":
          "anyOf":
            - "items": "{}"
              "type": "array"
            - "type": "null"
          "title": "X Range"
        "y_range":
          "anyOf":
            - "items": "{}"
              "type": "array"
            - "type": "null"
          "title": "Y Range"
        "shares_outstanding":
          "type": "integer"
          "title": "Shares Outstanding"
          "default": 100000000
      "type": "object"
      "title": "SensitivityRequest"
    "ShariaAddonToggle":
      "properties":
        "sharia_addon":
          "type": "boolean"
          "title": "Sharia Addon"
      "type": "object"
      "required":
        - "sharia_addon"
      "title": "ShariaAddonToggle"
    "SpeakIn":
      "properties":
        "text":
          "type": "string"
          "maxLength": 600
          "minLength": 1
          "title": "Text"
        "voice":
          "anyOf":
            - "type": "string"
              "maxLength": 32
            - "type": "null"
          "title": "Voice"
        "speed":
          "type": "number"
          "maximum": 1.6
          "minimum": 0.6
          "title": "Speed"
          "default": 1.05
        "source":
          "anyOf":
            - "type": "string"
              "maxLength": 8
            - "type": "null"
          "title": "Source"
      "type": "object"
      "required":
        - "text"
      "title": "SpeakIn"
    "SubscribeIn":
      "properties":
        "ticker":
          "type": "string"
          "maxLength": 24
          "minLength": 1
          "title": "Ticker"
        "webhook_url":
          "type": "string"
          "maxLength": 2083
          "minLength": 1
          "format": "uri"
          "title": "Webhook Url"
      "type": "object"
      "required":
        - "ticker"
        - "webhook_url"
      "title": "SubscribeIn"
    "SubscribeOut":
      "properties":
        "id":
          "type": "integer"
          "title": "Id"
        "ticker":
          "type": "string"
          "title": "Ticker"
        "webhook_url":
          "type": "string"
          "title": "Webhook Url"
        "secret":
          "type": "string"
          "title": "Secret"
      "type": "object"
      "required":
        - "id"
        - "ticker"
        - "webhook_url"
        - "secret"
      "title": "SubscribeOut"
    "TIApiKeyCreate":
      "properties":
        "name":
          "type": "string"
          "title": "Name"
          "default": "Untitled key"
      "type": "object"
      "title": "TIApiKeyCreate"
    "TIFlagSet":
      "properties":
        "enabled":
          "anyOf":
            - "type": "boolean"
            - "type": "null"
          "title": "Enabled"
        "review_status":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Review Status"
      "type": "object"
      "title": "TIFlagSet"
    "TILLMConfig":
      "properties":
        "provider":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Provider"
        "model":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Model"
      "type": "object"
      "title": "TILLMConfig"
    "ThemeDetail":
      "properties":
        "id":
          "type": "string"
          "title": "Id"
        "name":
          "type": "string"
          "title": "Name"
        "tagline":
          "type": "string"
          "title": "Tagline"
        "description":
          "type": "string"
          "title": "Description"
        "icon":
          "type": "string"
          "title": "Icon"
        "accent":
          "type": "string"
          "title": "Accent"
        "jurisdiction":
          "type": "string"
          "title": "Jurisdiction"
        "tickers":
          "items":
            "type": "string"
          "type": "array"
          "title": "Tickers"
        "quotes":
          "items":
            "additionalProperties": true
            "type": "object"
          "type": "array"
          "title": "Quotes"
      "type": "object"
      "required":
        - "id"
        - "name"
        - "tagline"
        - "description"
        - "icon"
        - "accent"
        - "jurisdiction"
        - "tickers"
        - "quotes"
      "title": "ThemeDetail"
    "ThemeMeta":
      "properties":
        "id":
          "type": "string"
          "title": "Id"
        "name":
          "type": "string"
          "title": "Name"
        "tagline":
          "type": "string"
          "title": "Tagline"
        "description":
          "type": "string"
          "title": "Description"
        "icon":
          "type": "string"
          "title": "Icon"
        "accent":
          "type": "string"
          "title": "Accent"
        "jurisdiction":
          "type": "string"
          "title": "Jurisdiction"
        "ticker_count":
          "type": "integer"
          "title": "Ticker Count"
        "view_count":
          "type": "integer"
          "title": "View Count"
          "default": 0
        "trending":
          "type": "boolean"
          "title": "Trending"
          "default": false
      "type": "object"
      "required":
        - "id"
        - "name"
        - "tagline"
        - "description"
        - "icon"
        - "accent"
        - "jurisdiction"
        - "ticker_count"
      "title": "ThemeMeta"
    "TierUpdate":
      "properties":
        "tier":
          "type": "string"
          "pattern": "^(core|trader|alpha|apex|prime)$"
          "title": "Tier"
      "type": "object"
      "required":
        - "tier"
      "title": "TierUpdate"
    "TotpConfirmIn":
      "properties":
        "code":
          "type": "string"
          "title": "Code"
      "type": "object"
      "required":
        - "code"
      "title": "TotpConfirmIn"
    "TotpEnrollOut":
      "properties":
        "secret":
          "type": "string"
          "title": "Secret"
        "otpauth_uri":
          "type": "string"
          "title": "Otpauth Uri"
      "type": "object"
      "required":
        - "secret"
        - "otpauth_uri"
      "title": "TotpEnrollOut"
    "TradeIn":
      "properties":
        "quantity":
          "type": "number"
          "exclusiveMinimum": 0.0
          "title": "Quantity"
          "description": "Always positive; the verb carries the direction."
        "price":
          "anyOf":
            - "type": "number"
              "minimum": 0.0
            - "type": "null"
          "title": "Price"
          "description": "Trade price. Omit if unknown \u2014 ACB then stays unknown."
      "type": "object"
      "required":
        - "quantity"
      "title": "TradeIn"
      "description": "A buy or sell against an existing position. price is the TRADE price, never a market quote."
    "UnsubscribePayload":
      "properties":
        "endpoint":
          "type": "string"
          "maxLength": 2000
          "minLength": 20
          "title": "Endpoint"
      "type": "object"
      "required":
        - "endpoint"
      "title": "UnsubscribePayload"
    "UserDeleteIn":
      "properties":
        "confirm":
          "type": "boolean"
          "title": "Confirm"
          "default": false
        "reason":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Reason"
      "type": "object"
      "title": "UserDeleteIn"
    "UserRow":
      "properties":
        "id":
          "type": "string"
          "title": "Id"
        "email":
          "type": "string"
          "title": "Email"
        "tier":
          "type": "string"
          "title": "Tier"
        "is_admin":
          "type": "boolean"
          "title": "Is Admin"
        "sharia_addon":
          "type": "boolean"
          "title": "Sharia Addon"
        "created_at":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Created At"
      "type": "object"
      "required":
        - "id"
        - "email"
        - "tier"
        - "is_admin"
        - "sharia_addon"
      "title": "UserRow"
    "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"
          "format": "email"
          "title": "Email"
        "tier":
          "type": "string"
          "title": "Tier"
        "billing_cadence":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Billing Cadence"
          "default": "monthly"
        "source":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Source"
          "default": "pricing_page"
      "type": "object"
      "required":
        - "email"
        - "tier"
      "title": "WaitlistRequest"
    "WaitlistRow":
      "properties":
        "id":
          "type": "string"
          "title": "Id"
        "email":
          "type": "string"
          "title": "Email"
        "source":
          "type": "string"
          "title": "Source"
        "created_at":
          "type": "string"
          "title": "Created At"
        "ip_address":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Ip Address"
      "type": "object"
      "required":
        - "id"
        - "email"
        - "source"
        - "created_at"
      "title": "WaitlistRow"
    "_DrillReq":
      "properties":
        "text":
          "type": "string"
          "title": "Text"
          "default": ""
        "deposit_type":
          "type": "string"
          "title": "Deposit Type"
          "default": "default"
        "intervals":
          "items": "{}"
          "type": "array"
          "title": "Intervals"
          "default": "[]"
      "type": "object"
      "title": "_DrillReq"
    "_MintReq":
      "properties":
        "name":
          "type": "string"
          "title": "Name"
          "default": ""
        "environment":
          "type": "string"
          "title": "Environment"
          "default": "live"
      "type": "object"
      "title": "_MintReq"
    "_PortfolioAnalyzeReq":
      "properties":
        "tickers":
          "items":
            "type": "string"
          "type": "array"
          "title": "Tickers"
          "default": "[]"
      "type": "object"
      "title": "_PortfolioAnalyzeReq"
    "_QuinnCSVImportReq":
      "properties":
        "csv_text":
          "type": "string"
          "title": "Csv Text"
        "user_id":
          "type": "string"
          "title": "User Id"
          "default": "anonymous"
      "type": "object"
      "required":
        - "csv_text"
      "title": "_QuinnCSVImportReq"
    "_ReportProseReq":
      "properties":
        "ticker":
          "type": "string"
          "title": "Ticker"
          "default": ""
        "name":
          "type": "string"
          "title": "Name"
          "default": ""
        "synthesis":
          "type": "string"
          "title": "Synthesis"
          "default": ""
        "facts":
          "additionalProperties": true
          "type": "object"
          "title": "Facts"
        "bull":
          "items": "{}"
          "type": "array"
          "title": "Bull"
        "bear":
          "items": "{}"
          "type": "array"
          "title": "Bear"
      "type": "object"
      "title": "_ReportProseReq"
    "_ShariaPortfolioReq":
      "properties":
        "holdings":
          "items": "{}"
          "type": "array"
          "title": "Holdings"
          "default": "[]"
        "standard":
          "type": "string"
          "title": "Standard"
          "default": "aaoifi"
      "type": "object"
      "title": "_ShariaPortfolioReq"
    "_TaxLossReq":
      "properties":
        "holdings":
          "items": "{}"
          "type": "array"
          "title": "Holdings"
        "tax_residence":
          "type": "string"
          "title": "Tax Residence"
          "default": "CA"
        "marginal_rate":
          "anyOf":
            - "type": "number"
            - "type": "null"
          "title": "Marginal Rate"
      "type": "object"
      "title": "_TaxLossReq"
    "_WatchlistChangedReq":
      "properties":
        "tickers":
          "items": "{}"
          "type": "array"
          "title": "Tickers"
        "watchlist_id":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Watchlist Id"
        "price_move_pct":
          "type": "number"
          "title": "Price Move Pct"
          "default": 5.0
      "type": "object"
      "title": "_WatchlistChangedReq"
    "antigravity__api__preferences_router__PreferencesIn":
      "properties":
        "daily_brief_opt_in":
          "anyOf":
            - "type": "boolean"
            - "type": "null"
          "title": "Daily Brief Opt In"
          "description": "Opt in/out of the daily watchlist brief email. Default is OFF."
      "type": "object"
      "title": "PreferencesIn"
    "antigravity__api__routes__HealthResponse":
      "properties":
        "status":
          "type": "string"
          "title": "Status"
        "version":
          "type": "string"
          "title": "Version"
        "timestamp":
          "type": "string"
          "title": "Timestamp"
      "type": "object"
      "required":
        - "status"
        - "version"
        - "timestamp"
      "title": "HealthResponse"
    "antigravity__api__sharia_router__PreferencesIn":
      "properties":
        "preferred_standard":
          "type": "string"
          "title": "Preferred Standard"
          "default": "aaoifi"
        "show_review_required":
          "type": "boolean"
          "title": "Show Review Required"
          "default": true
        "charity_default":
          "anyOf":
            - "type": "string"
            - "type": "null"
          "title": "Charity Default"
      "type": "object"
      "title": "PreferencesIn"
    "antigravity__api__status_router__HealthResponse":
      "properties":
        "overall":
          "type": "string"
          "title": "Overall"
        "components":
          "items":
            "$ref": "#/components/schemas/ComponentStatus"
          "type": "array"
          "title": "Components"
        "cached":
          "type": "boolean"
          "title": "Cached"
        "checked_at":
          "type": "string"
          "title": "Checked At"
      "type": "object"
      "required":
        - "overall"
        - "components"
        - "cached"
        - "checked_at"
      "title": "HealthResponse"
  "securitySchemes":
    "ApiKeyAuth":
      "type": "http"
      "scheme": "bearer"
      "bearerFormat": "qt_live_..."
      "description": "Developer Data API key, sent as `Authorization: Bearer qt_live_...`. Mint one at /developers.html. The market-data operations in this document need no key; the /api/v1/data/ operations do."
"paths":
  "/api/v1/data/plans":
    "get":
      "operationId": "listPlans"
      "tags":
        - "Reference"
      "summary": "List API tiers and their rate limits"
      "description": "Returns every API tier with its price and per-key rate limit. Keyless by design: an agent can determine what access costs before holding any credential. This endpoint is the authoritative source for entitlements."
      "responses":
        "200":
          "description": "The full tier list."
          "content":
            "application/json":
              "schema":
                "type": "object"
                "properties":
                  "plans":
                    "type": "array"
                    "items":
                      "type": "object"
        "400":
          "description": "Malformed request."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
        "404":
          "description": "No data for the requested resource."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
        "429":
          "description": "Rate limit exceeded for this key tier."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
  "/api/v1/market/symbols":
    "get":
      "operationId": "listSymbols"
      "tags":
        - "Reference"
      "summary": "List tradable symbols for an exchange"
      "description": "Enumerates the symbol universe for one exchange. Use this to resolve or validate a ticker before calling other operations."
      "parameters":
        - "name": "exchange"
          "in": "query"
          "required": false
          "description": "Exchange code, e.g. US, TO (Toronto), V (TSX Venture)."
          "schema":
            "type": "string"
            "default": "US"
            "examples":
              - "US"
              - "TO"
              - "V"
        - "name": "limit"
          "in": "query"
          "required": false
          "description": "Maximum symbols to return."
          "schema":
            "type": "integer"
            "minimum": 1
            "maximum": 5000
            "default": 100
        - "name": "delisted"
          "in": "query"
          "required": false
          "description": "Include delisted symbols."
          "schema":
            "type": "boolean"
            "default": false
      "responses":
        "200":
          "description": "The symbol universe for the exchange."
          "content":
            "application/json":
              "schema":
                "type": "object"
                "properties":
                  "exchange":
                    "type": "string"
                  "count":
                    "type": "integer"
                    "description": "Total symbols on the exchange, before limit."
                  "symbols":
                    "type": "array"
                    "items":
                      "type": "object"
                      "properties":
                        "code":
                          "type": "string"
                        "name":
                          "type": "string"
                        "type":
                          "type": "string"
        "400":
          "description": "Malformed request."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
        "404":
          "description": "No data for the requested resource."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
        "429":
          "description": "Rate limit exceeded for this key tier."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
  "/api/v1/market/quotes":
    "get":
      "operationId": "getQuotes"
      "tags":
        - "Prices"
      "summary": "Get delayed quotes for up to 30 symbols"
      "description": "Batch quote lookup. Prefer one call with several symbols over several single-symbol calls."
      "parameters":
        - "name": "symbols"
          "in": "query"
          "required": true
          "description": "1-30 comma-separated symbols. Mixed venues are allowed."
          "schema":
            "type": "string"
            "examples":
              - "AAPL,MSFT,SHOP.TO"
      "responses":
        "200":
          "description": "One quote object per resolved symbol."
          "content":
            "application/json":
              "schema":
                "type": "array"
                "items":
                  "type": "object"
                  "properties":
                    "symbol":
                      "type": "string"
                    "price":
                      "type": "number"
                    "change_pct":
                      "type": "number"
                    "volume":
                      "type": "number"
                    "market_cap":
                      "type": "number"
        "400":
          "description": "Malformed request."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
        "404":
          "description": "No data for the requested resource."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
        "429":
          "description": "Rate limit exceeded for this key tier."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
  "/api/v1/market/eod/{symbol}":
    "get":
      "operationId": "getEndOfDayBars"
      "tags":
        - "Prices"
      "summary": "Get daily OHLCV history for a symbol"
      "description": "Daily bars with both raw and adjusted closes. adjusted_close is restated retroactively after a split or dividend, so a cached series should be refetched once a corporate action appears."
      "parameters":
        - "name": "symbol"
          "in": "path"
          "required": true
          "description": "Ticker symbol. US symbols need no suffix (AAPL); other venues use a suffix (SHOP.TO)."
          "schema":
            "type": "string"
            "pattern": "^[A-Za-z0-9.^-]{1,20}$"
            "examples":
              - "AAPL"
              - "SHOP.TO"
        - "name": "from"
          "in": "query"
          "required": false
          "description": "Inclusive start date."
          "schema":
            "type": "string"
            "format": "date"
        - "name": "to"
          "in": "query"
          "required": false
          "description": "Inclusive end date."
          "schema":
            "type": "string"
            "format": "date"
      "responses":
        "200":
          "description": "Daily bars, oldest first. An unknown symbol returns count 0 with an empty bars array rather than an error."
          "content":
            "application/json":
              "schema":
                "type": "object"
                "properties":
                  "symbol":
                    "type": "string"
                  "count":
                    "type": "integer"
                  "bars":
                    "type": "array"
                    "items":
                      "type": "object"
                      "properties":
                        "date":
                          "type": "string"
                          "format": "date"
                        "open":
                          "type": "number"
                        "high":
                          "type": "number"
                        "low":
                          "type": "number"
                        "close":
                          "type": "number"
                        "adjusted_close":
                          "type": "number"
                          "description": "Split- and dividend-adjusted close. Restated retroactively after a corporate action."
                        "volume":
                          "type": "integer"
        "400":
          "description": "Malformed request."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
        "404":
          "description": "No data for the requested resource."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
        "429":
          "description": "Rate limit exceeded for this key tier."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
  "/api/v1/market/intraday/{symbol}":
    "get":
      "operationId": "getIntradayBars"
      "tags":
        - "Prices"
      "summary": "Get intraday OHLCV bars for a symbol"
      "description": "Intraday bars at a fixed interval. History depth is limited; use the end-of-day operation for long ranges."
      "parameters":
        - "name": "symbol"
          "in": "path"
          "required": true
          "description": "Ticker symbol. US symbols need no suffix (AAPL); other venues use a suffix (SHOP.TO)."
          "schema":
            "type": "string"
            "pattern": "^[A-Za-z0-9.^-]{1,20}$"
            "examples":
              - "AAPL"
              - "SHOP.TO"
        - "name": "interval"
          "in": "query"
          "required": false
          "description": "Bar interval."
          "schema":
            "type": "string"
            "enum":
              - "1m"
              - "5m"
              - "1h"
            "default": "5m"
      "responses":
        "200":
          "description": "Intraday bars, oldest first."
          "content":
            "application/json":
              "schema":
                "type": "object"
                "properties":
                  "symbol":
                    "type": "string"
                  "interval":
                    "type": "string"
                  "count":
                    "type": "integer"
                  "bars":
                    "type": "array"
                    "items":
                      "type": "object"
        "400":
          "description": "Malformed request."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
        "404":
          "description": "No data for the requested resource."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
        "429":
          "description": "Rate limit exceeded for this key tier."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
  "/api/v1/market/fundamentals/{symbol}":
    "get":
      "operationId": "getFundamentals"
      "tags":
        - "Fundamentals"
      "summary": "Get company profile and financial statements"
      "description": "Company profile, highlights, valuation and annual/quarterly income statement, balance sheet and cash-flow history."
      "parameters":
        - "name": "symbol"
          "in": "path"
          "required": true
          "description": "Ticker symbol. US symbols need no suffix (AAPL); other venues use a suffix (SHOP.TO)."
          "schema":
            "type": "string"
            "pattern": "^[A-Za-z0-9.^-]{1,20}$"
            "examples":
              - "AAPL"
              - "SHOP.TO"
      "responses":
        "200":
          "description": "The fundamentals document for the issuer."
          "content":
            "application/json":
              "schema":
                "type": "object"
                "properties":
                  "General":
                    "type": "object"
                  "Highlights":
                    "type": "object"
                  "Valuation":
                    "type": "object"
                  "Financials":
                    "type": "object"
        "400":
          "description": "Malformed request."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
        "404":
          "description": "No data for the requested resource."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
        "429":
          "description": "Rate limit exceeded for this key tier."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
  "/api/v1/market/earnings/{symbol}":
    "get":
      "operationId": "getEarningsHistory"
      "tags":
        - "Fundamentals"
      "summary": "Get earnings history and the next reported date"
      "description": "Reported versus estimated EPS by period, plus next_report_date when the issuer has announced one. next_report_date is present only when confirmed; it is never inferred."
      "parameters":
        - "name": "symbol"
          "in": "path"
          "required": true
          "description": "Ticker symbol. US symbols need no suffix (AAPL); other venues use a suffix (SHOP.TO)."
          "schema":
            "type": "string"
            "pattern": "^[A-Za-z0-9.^-]{1,20}$"
            "examples":
              - "AAPL"
              - "SHOP.TO"
      "responses":
        "200":
          "description": "Earnings history, most recent first."
          "content":
            "application/json":
              "schema":
                "type": "object"
                "properties":
                  "symbol":
                    "type": "string"
                  "next_report_date":
                    "type":
                      - "string"
                      - "null"
                    "format": "date"
                    "description": "Confirmed next reporting date, or null when the issuer has not announced one."
                  "rows":
                    "type": "array"
                    "items":
                      "type": "object"
        "400":
          "description": "Malformed request."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
        "404":
          "description": "No data for the requested resource."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
        "429":
          "description": "Rate limit exceeded for this key tier."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
  "/api/v1/market/corporate-actions/{symbol}":
    "get":
      "operationId": "getCorporateActions"
      "tags":
        - "Fundamentals"
      "summary": "Get dividend and split history"
      "description": "Dividend and split events. Use this to detect when a cached adjusted price series has become stale."
      "parameters":
        - "name": "symbol"
          "in": "path"
          "required": true
          "description": "Ticker symbol. US symbols need no suffix (AAPL); other venues use a suffix (SHOP.TO)."
          "schema":
            "type": "string"
            "pattern": "^[A-Za-z0-9.^-]{1,20}$"
            "examples":
              - "AAPL"
              - "SHOP.TO"
      "responses":
        "200":
          "description": "Corporate actions, oldest first."
          "content":
            "application/json":
              "schema":
                "type": "object"
                "properties":
                  "symbol":
                    "type": "string"
                  "dividends":
                    "type": "array"
                    "items":
                      "type": "object"
                  "splits":
                    "type": "array"
                    "items":
                      "type": "object"
        "400":
          "description": "Malformed request."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
        "404":
          "description": "No data for the requested resource."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
        "429":
          "description": "Rate limit exceeded for this key tier."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
  "/api/v1/market/news/{symbol}":
    "get":
      "operationId": "getSymbolNews"
      "tags":
        - "Fundamentals"
      "summary": "Get recent news for a symbol"
      "description": "Recent headlines with publication timestamps and source links."
      "parameters":
        - "name": "symbol"
          "in": "path"
          "required": true
          "description": "Ticker symbol. US symbols need no suffix (AAPL); other venues use a suffix (SHOP.TO)."
          "schema":
            "type": "string"
            "pattern": "^[A-Za-z0-9.^-]{1,20}$"
            "examples":
              - "AAPL"
              - "SHOP.TO"
        - "name": "limit"
          "in": "query"
          "required": false
          "description": "Maximum articles to return."
          "schema":
            "type": "integer"
            "minimum": 1
            "maximum": 100
            "default": 20
      "responses":
        "200":
          "description": "Recent articles, newest first."
          "content":
            "application/json":
              "schema":
                "type": "object"
                "properties":
                  "symbol":
                    "type": "string"
                  "count":
                    "type": "integer"
                  "news":
                    "type": "array"
                    "items":
                      "type": "object"
        "400":
          "description": "Malformed request."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
        "404":
          "description": "No data for the requested resource."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
        "429":
          "description": "Rate limit exceeded for this key tier."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
  "/api/v1/market/ipos":
    "get":
      "operationId": "getIpoCalendar"
      "tags":
        - "Calendars"
      "summary": "Get the upcoming IPO calendar"
      "description": "Forward-looking IPO calendar over a rolling window, with pricing terms where disclosed."
      "responses":
        "200":
          "description": "Scheduled offerings in the window."
          "content":
            "application/json":
              "schema":
                "type": "object"
                "properties":
                  "from":
                    "type": "string"
                    "format": "date"
                  "to":
                    "type": "string"
                    "format": "date"
                  "count":
                    "type": "integer"
                  "ipos":
                    "type": "array"
                    "items":
                      "type": "object"
        "400":
          "description": "Malformed request."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
        "404":
          "description": "No data for the requested resource."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
        "429":
          "description": "Rate limit exceeded for this key tier."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
  "/api/v1/market/economic-events":
    "get":
      "operationId": "getEconomicEvents"
      "tags":
        - "Calendars"
      "summary": "Get the economic-events calendar"
      "description": "Scheduled macroeconomic releases with actual, estimate and prior values once published."
      "parameters":
        - "name": "country"
          "in": "query"
          "required": false
          "description": "ISO country code."
          "schema":
            "type": "string"
            "default": "US"
            "examples":
              - "US"
              - "CA"
      "responses":
        "200":
          "description": "Scheduled releases in the window."
          "content":
            "application/json":
              "schema":
                "type": "object"
                "properties":
                  "country":
                    "type": "string"
                  "count":
                    "type": "integer"
                  "events":
                    "type": "array"
                    "items":
                      "type": "object"
        "400":
          "description": "Malformed request."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
        "404":
          "description": "No data for the requested resource."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
        "429":
          "description": "Rate limit exceeded for this key tier."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
  "/api/v1/market/macro":
    "get":
      "operationId": "getMacroSeries"
      "tags":
        - "Macro"
      "summary": "Get a country-level macroeconomic time series"
      "description": "Annual macroeconomic series such as consumer inflation or unemployment, by country."
      "parameters":
        - "name": "country"
          "in": "query"
          "required": false
          "description": "ISO-3 country code."
          "schema":
            "type": "string"
            "default": "USA"
            "examples":
              - "USA"
              - "CAN"
        - "name": "indicator"
          "in": "query"
          "required": false
          "description": "Indicator identifier."
          "schema":
            "type": "string"
            "default": "inflation_consumer_prices_annual"
      "responses":
        "200":
          "description": "The requested series, oldest first."
          "content":
            "application/json":
              "schema":
                "type": "object"
                "properties":
                  "country":
                    "type": "string"
                  "indicator":
                    "type": "string"
                  "count":
                    "type": "integer"
                  "series":
                    "type": "array"
                    "items":
                      "type": "object"
        "400":
          "description": "Malformed request."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
        "404":
          "description": "No data for the requested resource."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
        "429":
          "description": "Rate limit exceeded for this key tier."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
  "/api/v1/market/screener":
    "get":
      "operationId": "screenEquities"
      "tags":
        - "Screening"
      "summary": "Screen equities across US and Canadian markets"
      "description": "Returns issuers ordered by a chosen field. Results are factual screening output over the whole universe; they are not ranked, selected or tailored for any individual and are not a recommendation."
      "parameters":
        - "name": "limit"
          "in": "query"
          "required": false
          "description": "Rows to return."
          "schema":
            "type": "integer"
            "minimum": 1
            "maximum": 500
            "default": 50
        - "name": "offset"
          "in": "query"
          "required": false
          "description": "Rows to skip, for paging."
          "schema":
            "type": "integer"
            "minimum": 0
            "default": 0
        - "name": "sort"
          "in": "query"
          "required": false
          "description": "Sort field and direction."
          "schema":
            "type": "string"
            "default": "market_capitalization.desc"
      "responses":
        "200":
          "description": "The screened result page."
          "content":
            "application/json":
              "schema":
                "type": "object"
                "properties":
                  "count":
                    "type": "integer"
                  "limit":
                    "type": "integer"
                  "offset":
                    "type": "integer"
                  "sort":
                    "type": "string"
                  "data":
                    "type": "array"
                    "items":
                      "type": "object"
        "400":
          "description": "Malformed request."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
        "404":
          "description": "No data for the requested resource."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
        "429":
          "description": "Rate limit exceeded for this key tier."
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/Error"
  "/health":
    "get":
      "operationId": "getHealth"
      "tags":
        - "Reference"
      "summary": "Service health check"
      "description": "Liveness probe. Returns status ok when the API is serving."
      "responses":
        "200":
          "description": "Service is healthy."
          "content":
            "application/json":
              "schema":
                "type": "object"
                "properties":
                  "status":
                    "type": "string"
                  "service":
                    "type": "string"
  "/api/v1/themes/by-ticker/{ticker}":
    "get":
      "tags":
        - "Themes"
      "summary": "Themes By Ticker"
      "description": "W3 #2 (2026-05-09): reverse lookup - which themes contain this ticker?\n\nStrips exchange suffix (\".TO\", \".V\", \".L\", etc.) on both sides for fuzzy\nmatch \u2014 so a query for \"AEM\" finds the curated \"AEM.TO\" entry. Returns\nup to 4 themes (the discovery-chip cap on the stock-detail modal)."
      "operationId": "themes_by_ticker_api_v1_themes_by_ticker__ticker__get"
      "parameters":
        - "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/v1/themes/{theme_id}":
    "get":
      "tags":
        - "Themes"
      "summary": "Theme Detail"
      "description": "Return theme detail with live quotes for each ticker.\nSprint12Close (2026-05-12): increments view counter for trending detection."
      "operationId": "theme_detail_api_v1_themes__theme_id__get"
      "parameters":
        - "name": "theme_id"
          "in": "path"
          "required": true
          "schema":
            "type": "string"
            "title": "Theme Id"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/ThemeDetail"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
  "/api/v1/status/health":
    "get":
      "tags":
        - "Public Status"
      "summary": "Health"
      "description": "Current status of every monitored component. Cached 30s."
      "operationId": "health_api_v1_status_health_get"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/antigravity__api__status_router__HealthResponse"
  "/api/v1/status/history":
    "get":
      "tags":
        - "Public Status"
      "summary": "History"
      "description": "Last N hours (default 7 days = 168h) of per-component hourly uptime %."
      "operationId": "history_api_v1_status_history_get"
      "parameters":
        - "name": "hours"
          "in": "query"
          "required": false
          "schema":
            "type": "integer"
            "default": 168
            "title": "Hours"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema":
                "type": "array"
                "items":
                  "$ref": "#/components/schemas/HistoryPoint"
                "title": "Response History Api V1 Status History Get"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
  "/api/v1/status/incidents":
    "get":
      "tags":
        - "Public Status"
      "summary": "Incidents"
      "description": "Recent published incidents (default: last 90 days)."
      "operationId": "incidents_api_v1_status_incidents_get"
      "parameters":
        - "name": "days"
          "in": "query"
          "required": false
          "schema":
            "type": "integer"
            "default": 90
            "title": "Days"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema":
                "type": "array"
                "items":
                  "$ref": "#/components/schemas/IncidentOut"
                "title": "Response Incidents Api V1 Status Incidents Get"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
  "/api/v1/sharia/resolve":
    "get":
      "tags":
        - "Sharia"
      "summary": "Resolve Query"
      "description": "Resolve a free-form query (company name OR ticker) to candidate\nNorth-American tickers. Public, no auth.\n\nStrategy:\n  1. Static alias dict for common companies (handles cases yfinance misses)\n  2. yfinance.Search() filtered to NA exchanges"
      "operationId": "resolve_query_api_v1_sharia_resolve_get"
      "parameters":
        - "name": "q"
          "in": "query"
          "required": true
          "schema":
            "type": "string"
            "minLength": 1
            "maxLength": 80
            "title": "Q"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
  "/api/v1/sharia/methodology":
    "get":
      "tags":
        - "Sharia"
      "summary": "Methodology"
      "description": "Public methodology endpoint \u2014 explains 3 standards.\nNo auth required."
      "operationId": "methodology_api_v1_sharia_methodology_get"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
  "/api/v1/sharia/screen-all/{ticker}":
    "get":
      "tags":
        - "Sharia"
      "summary": "Screen All"
      "description": "Screen one ticker against ALL 4 standards in a single call.\n\nSame data the per-standard /screen endpoint returns, but bundled so the\nfrontend can render a side-by-side comparison view. The verdicts can\nlegitimately diverge (PMN: AAOIFI PASS / MSCI Series FAIL / M-Series PASS)\nbecause the standards use different denominators \u2014 this endpoint helps\nexplain that to users without 4 round-trips.\n\nReturns: { ticker, results: {aaoifi, djim, msci_islamic, msci_islamic_m},\n           consensus: {strict, majority, any}, divergence_explainer }"
      "operationId": "screen_all_api_v1_sharia_screen_all__ticker__get"
      "security":
        - "OAuth2PasswordBearer": "[]"
      "parameters":
        - "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/v1/sharia/screen/{ticker}":
    "get":
      "tags":
        - "Sharia"
      "summary": "Screen"
      "description": "Screen a single ticker against the chosen standard.\n\nReads from `sharia_screen_results` (precomputed daily by Celery beat task).\nFalls back to live computation if no recent record exists."
      "operationId": "screen_api_v1_sharia_screen__ticker__get"
      "security":
        - "OAuth2PasswordBearer": "[]"
      "parameters":
        - "name": "ticker"
          "in": "path"
          "required": true
          "schema":
            "type": "string"
            "title": "Ticker"
        - "name": "standard"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "pattern": "^(aaoifi|djim|ftse_yasaar|msci_islamic|msci_islamic_m|sp_shariah)$"
            "default": "aaoifi"
            "title": "Standard"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/ScreenResponse"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
  "/api/v1/sharia/screener":
    "get":
      "tags":
        - "Sharia"
      "summary": "Screener"
      "description": "List Sharia-screened tickers from the precomputed table."
      "operationId": "screener_api_v1_sharia_screener_get"
      "security":
        - "OAuth2PasswordBearer": "[]"
      "parameters":
        - "name": "standard"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "pattern": "^(aaoifi|djim|ftse_yasaar|msci_islamic|msci_islamic_m|sp_shariah)$"
            "default": "aaoifi"
            "title": "Standard"
        - "name": "pass_only"
          "in": "query"
          "required": false
          "schema":
            "type": "boolean"
            "description": "Return only Sharia-passing tickers"
            "default": true
            "title": "Pass Only"
          "description": "Return only Sharia-passing tickers"
        - "name": "limit"
          "in": "query"
          "required": false
          "schema":
            "type": "integer"
            "maximum": 500
            "minimum": 1
            "default": 50
            "title": "Limit"
        - "name": "offset"
          "in": "query"
          "required": false
          "schema":
            "type": "integer"
            "minimum": 0
            "default": 0
            "title": "Offset"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
  "/api/v1/sharia/purification/{ticker}":
    "get":
      "tags":
        - "Sharia"
      "summary": "Purification Calc"
      "description": "Purification calculation for a dividend received from a passing ticker.\nReturns the amount to donate to charity to clean the dividend."
      "operationId": "purification_calc_api_v1_sharia_purification__ticker__get"
      "security":
        - "OAuth2PasswordBearer": "[]"
      "parameters":
        - "name": "ticker"
          "in": "path"
          "required": true
          "schema":
            "type": "string"
            "title": "Ticker"
        - "name": "dividend_received"
          "in": "query"
          "required": true
          "schema":
            "type": "number"
            "minimum": 0
            "description": "Dividend amount in dollars"
            "title": "Dividend Received"
          "description": "Dividend amount in dollars"
        - "name": "standard"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "pattern": "^(aaoifi|djim|ftse_yasaar|msci_islamic|msci_islamic_m|sp_shariah)$"
            "default": "aaoifi"
            "title": "Standard"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
  "/api/v1/sharia/preferences":
    "post":
      "tags":
        - "Sharia"
      "summary": "Save Preferences"
      "description": "Save user's preferred Sharia standard + show_review_required toggle."
      "operationId": "save_preferences_api_v1_sharia_preferences_post"
      "requestBody":
        "content":
          "application/json":
            "schema":
              "$ref": "#/components/schemas/antigravity__api__sharia_router__PreferencesIn"
        "required": true
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
      "security":
        - "OAuth2PasswordBearer": "[]"
  "/api/v1/data/usage":
    "get":
      "tags":
        - "Developer Data API"
      "summary": "Data Usage"
      "description": "Today's account usage vs plan quota (per-key rpm + pooled daily), for self-scheduling."
      "operationId": "data_usage_api_v1_data_usage_get"
      "parameters":
        - "name": "apikey"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Apikey"
        - "name": "authorization"
          "in": "header"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Authorization"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
      "security":
        - "ApiKeyAuth": "[]"
  "/api/v1/data/health":
    "get":
      "tags":
        - "Developer Data API"
      "summary": "Data Health"
      "description": "200 with a valid key; echoes the key's granted permissions."
      "operationId": "data_health_api_v1_data_health_get"
      "parameters":
        - "name": "apikey"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Apikey"
        - "name": "authorization"
          "in": "header"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Authorization"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
      "security":
        - "ApiKeyAuth": "[]"
  "/api/v1/data/catalog":
    "get":
      "tags":
        - "Developer Data API"
      "summary": "Data Catalog"
      "description": "Self-documenting index of every endpoint + the permission each requires."
      "operationId": "data_catalog_api_v1_data_catalog_get"
      "parameters":
        - "name": "apikey"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Apikey"
        - "name": "authorization"
          "in": "header"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Authorization"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
      "security":
        - "ApiKeyAuth": "[]"
  "/api/v1/data/filings/search":
    "get":
      "tags":
        - "Developer Data API"
      "summary": "Data Filings Search"
      "description": "SEC EDGAR filings for a ticker: form, filed date, accession, deep links. Optional ?form=10-K filter."
      "operationId": "data_filings_search_api_v1_data_filings_search_get"
      "parameters":
        - "name": "ticker"
          "in": "query"
          "required": true
          "schema":
            "type": "string"
            "title": "Ticker"
        - "name": "form"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Form"
        - "name": "limit"
          "in": "query"
          "required": false
          "schema":
            "type": "integer"
            "default": 40
            "title": "Limit"
        - "name": "format"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Format"
        - "name": "apikey"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Apikey"
        - "name": "authorization"
          "in": "header"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Authorization"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
      "security":
        - "ApiKeyAuth": "[]"
  "/api/v1/data/filings/s1/{ticker}":
    "get":
      "tags":
        - "Developer Data API"
      "summary": "Data Filings S1"
      "description": "IPO S-1/F-1/F-10 extraction: use-of-proceeds + pre-IPO financials, with accession + deep link."
      "operationId": "data_filings_s1_api_v1_data_filings_s1__ticker__get"
      "parameters":
        - "name": "ticker"
          "in": "path"
          "required": true
          "schema":
            "type": "string"
            "title": "Ticker"
        - "name": "format"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Format"
        - "name": "apikey"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Apikey"
        - "name": "authorization"
          "in": "header"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Authorization"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
      "security":
        - "ApiKeyAuth": "[]"
  "/api/v1/data/filing-diff/{ticker}":
    "get":
      "tags":
        - "Developer Data API"
      "summary": "Data Filing Diff"
      "description": "Risk-factor diff between the two latest filings of a form (10-K default). Deterministic, no LLM."
      "operationId": "data_filing_diff_api_v1_data_filing_diff__ticker__get"
      "parameters":
        - "name": "ticker"
          "in": "path"
          "required": true
          "schema":
            "type": "string"
            "title": "Ticker"
        - "name": "form"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": "10-K"
            "title": "Form"
        - "name": "format"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Format"
        - "name": "apikey"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Apikey"
        - "name": "authorization"
          "in": "header"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Authorization"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
      "security":
        - "ApiKeyAuth": "[]"
  "/api/v1/data/form4":
    "get":
      "tags":
        - "Developer Data API"
      "summary": "Data Form4"
      "description": "Form 4 insider transactions (SEC EDGAR). Per-ticker requests fetch live from EDGAR when the local ingest has no rows."
      "operationId": "data_form4_api_v1_data_form4_get"
      "parameters":
        - "name": "ticker"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Ticker"
        - "name": "since"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Since"
        - "name": "limit"
          "in": "query"
          "required": false
          "schema":
            "type": "integer"
            "default": 100
            "title": "Limit"
        - "name": "format"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Format"
        - "name": "apikey"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Apikey"
        - "name": "authorization"
          "in": "header"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Authorization"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
      "security":
        - "ApiKeyAuth": "[]"
  "/api/v1/data/13f/managers":
    "get":
      "tags":
        - "Developer Data API"
      "summary": "Data 13F Managers"
      "description": "Curated list of tracked 13F managers (name, CIK, category) usable with /13f/manager/{cik}."
      "operationId": "data_13f_managers_api_v1_data_13f_managers_get"
      "parameters":
        - "name": "format"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Format"
        - "name": "apikey"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Apikey"
        - "name": "authorization"
          "in": "header"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Authorization"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
      "security":
        - "ApiKeyAuth": "[]"
  "/api/v1/data/13f/manager/{cik}":
    "get":
      "tags":
        - "Developer Data API"
      "summary": "Data 13F Manager"
      "description": "Latest 13F-HR holdings for one manager CIK: positions, values, accession + period."
      "operationId": "data_13f_manager_api_v1_data_13f_manager__cik__get"
      "parameters":
        - "name": "cik"
          "in": "path"
          "required": true
          "schema":
            "type": "integer"
            "title": "Cik"
        - "name": "format"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Format"
        - "name": "apikey"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Apikey"
        - "name": "authorization"
          "in": "header"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Authorization"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
      "security":
        - "ApiKeyAuth": "[]"
  "/api/v1/data/13f/issuer/{query}":
    "get":
      "tags":
        - "Developer Data API"
      "summary": "Data 13F Issuer"
      "description": "Which tracked managers hold an issuer (matched by issuer-NAME substring, e.g. 'apple'). Cold call can take ~30-60s; cached 12h."
      "operationId": "data_13f_issuer_api_v1_data_13f_issuer__query__get"
      "parameters":
        - "name": "query"
          "in": "path"
          "required": true
          "schema":
            "type": "string"
            "title": "Query"
        - "name": "format"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Format"
        - "name": "apikey"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Apikey"
        - "name": "authorization"
          "in": "header"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Authorization"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
      "security":
        - "ApiKeyAuth": "[]"
  "/api/v1/data/activist-13d":
    "get":
      "tags":
        - "Developer Data API"
      "summary": "Data Activist 13D"
      "description": "US tickers with a SCHEDULE 13D / 13D-A filed in the last ~21 days (activist stakes)."
      "operationId": "data_activist_13d_api_v1_data_activist_13d_get"
      "parameters":
        - "name": "limit"
          "in": "query"
          "required": false
          "schema":
            "type": "integer"
            "default": 200
            "title": "Limit"
        - "name": "format"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Format"
        - "name": "apikey"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Apikey"
        - "name": "authorization"
          "in": "header"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Authorization"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
      "security":
        - "ApiKeyAuth": "[]"
  "/api/v1/data/passive-13g":
    "get":
      "tags":
        - "Developer Data API"
      "summary": "Data Passive 13G"
      "description": "US tickers with a SCHEDULE 13G / 13G-A filed in the last ~21 days (passive >5% stakes)."
      "operationId": "data_passive_13g_api_v1_data_passive_13g_get"
      "parameters":
        - "name": "limit"
          "in": "query"
          "required": false
          "schema":
            "type": "integer"
            "default": 200
            "title": "Limit"
        - "name": "format"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Format"
        - "name": "apikey"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Apikey"
        - "name": "authorization"
          "in": "header"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Authorization"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
      "security":
        - "ApiKeyAuth": "[]"
  "/api/v1/data/receipts/{receipt_id}/verify":
    "get":
      "tags":
        - "Developer Data API"
      "summary": "Data Receipt Verify"
      "description": "Re-verify a Quintarthai ed25519-signed research receipt (also keyless at /api/v1/lineage/verify/{id})."
      "operationId": "data_receipt_verify_api_v1_data_receipts__receipt_id__verify_get"
      "parameters":
        - "name": "receipt_id"
          "in": "path"
          "required": true
          "schema":
            "type": "string"
            "title": "Receipt Id"
        - "name": "format"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Format"
        - "name": "apikey"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Apikey"
        - "name": "authorization"
          "in": "header"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Authorization"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
      "security":
        - "ApiKeyAuth": "[]"
  "/api/v1/data/withholding":
    "get":
      "tags":
        - "Developer Data API"
      "summary": "Data Withholding"
      "description": "Canada\u2194US dividend withholding by issuer country + account type (taxable/RRSP/RRIF/TFSA), with treaty citations."
      "operationId": "data_withholding_api_v1_data_withholding_get"
      "parameters":
        - "name": "issuer_country"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Issuer Country"
        - "name": "account_type"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Account Type"
        - "name": "format"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Format"
        - "name": "apikey"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Apikey"
        - "name": "authorization"
          "in": "header"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Authorization"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
      "security":
        - "ApiKeyAuth": "[]"
  "/api/v1/data/dual-listings":
    "get":
      "tags":
        - "Developer Data API"
      "summary": "Data Dual Listings"
      "description": "Curated TSX\u2194US dual-listing (MJDS) symbology pairs: ca_ticker, us_ticker, company, sector."
      "operationId": "data_dual_listings_api_v1_data_dual_listings_get"
      "parameters":
        - "name": "format"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Format"
        - "name": "apikey"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Apikey"
        - "name": "authorization"
          "in": "header"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Authorization"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
      "security":
        - "ApiKeyAuth": "[]"
  "/api/v1/data/drill/interpret":
    "post":
      "tags":
        - "Developer Data API"
      "summary": "Data Drill"
      "description": "Interpret NI 43-101 drill results from press-release text OR structured intervals \u2192 grades/widths/AuEq/anomaly flags (deterministic)."
      "operationId": "data_drill_api_v1_data_drill_interpret_post"
      "parameters":
        - "name": "apikey"
          "in": "query"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Apikey"
        - "name": "authorization"
          "in": "header"
          "required": false
          "schema":
            "type": "string"
            "default": ""
            "title": "Authorization"
      "requestBody":
        "required": true
        "content":
          "application/json":
            "schema":
              "$ref": "#/components/schemas/_DrillReq"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
      "security":
        - "ApiKeyAuth": "[]"
  "/api/v1/data/keys":
    "get":
      "tags":
        - "Developer Data API"
      "summary": "Data Keys List"
      "description": "List your developer API keys (prefixes + usage only \u2014 plain keys are never stored)."
      "operationId": "data_keys_list_api_v1_data_keys_get"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
      "security":
        - "OAuth2PasswordBearer": "[]"
    "post":
      "tags":
        - "Developer Data API"
      "summary": "Data Keys Mint"
      "description": "Mint a developer API key (plain key shown ONCE). Active-key cap set by your plan."
      "operationId": "data_keys_mint_api_v1_data_keys_post"
      "requestBody":
        "content":
          "application/json":
            "schema":
              "$ref": "#/components/schemas/_MintReq"
        "required": true
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
      "security":
        - "OAuth2PasswordBearer": "[]"
  "/api/v1/data/keys/{key_id}/revoke":
    "post":
      "tags":
        - "Developer Data API"
      "summary": "Data Keys Revoke"
      "description": "Revoke one of your developer API keys (immediate)."
      "operationId": "data_keys_revoke_api_v1_data_keys__key_id__revoke_post"
      "security":
        - "OAuth2PasswordBearer": "[]"
      "parameters":
        - "name": "key_id"
          "in": "path"
          "required": true
          "schema":
            "type": "string"
            "title": "Key Id"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
  "/api/v1/marketing/email-capture":
    "post":
      "tags":
        - "Marketing"
      "summary": "Email Capture"
      "description": "Capture email for lead magnet / onboarding. Idempotent per (email, source)."
      "operationId": "email_capture_api_v1_marketing_email_capture_post"
      "requestBody":
        "content":
          "application/json":
            "schema":
              "$ref": "#/components/schemas/EmailCaptureRequest"
        "required": true
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/EmailCaptureResponse"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
  "/api/v1/marketing/health":
    "get":
      "tags":
        - "Marketing"
      "summary": "Health"
      "operationId": "health_api_v1_marketing_health_get"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
      "description": "Health"
  "/api/v1/synthetic/recent":
    "get":
      "tags":
        - "observability"
      "summary": "Synthetic Recent"
      "description": "Public \u2014 last N hours of URL uptime, aggregated per URL."
      "operationId": "synthetic_recent_api_v1_synthetic_recent_get"
      "parameters":
        - "name": "hours"
          "in": "query"
          "required": false
          "schema":
            "type": "integer"
            "default": 24
            "title": "Hours"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
  "/api/v1/sharia/webhooks":
    "get":
      "tags":
        - "sharia-webhooks"
      "summary": "List Subscriptions"
      "operationId": "list_subscriptions_api_v1_sharia_webhooks_get"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
      "security":
        - "OAuth2PasswordBearer": "[]"
      "description": "List Subscriptions"
    "post":
      "tags":
        - "sharia-webhooks"
      "summary": "Subscribe"
      "operationId": "subscribe_api_v1_sharia_webhooks_post"
      "requestBody":
        "content":
          "application/json":
            "schema":
              "$ref": "#/components/schemas/SubscribeIn"
        "required": true
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/SubscribeOut"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
      "security":
        - "OAuth2PasswordBearer": "[]"
      "description": "Subscribe"
  "/api/v1/sharia/webhooks/{sub_id}":
    "delete":
      "tags":
        - "sharia-webhooks"
      "summary": "Unsubscribe"
      "operationId": "unsubscribe_api_v1_sharia_webhooks__sub_id__delete"
      "security":
        - "OAuth2PasswordBearer": "[]"
      "parameters":
        - "name": "sub_id"
          "in": "path"
          "required": true
          "schema":
            "type": "integer"
            "title": "Sub Id"
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
      "description": "Unsubscribe"
  "/api/v1/sharia/portfolio-monitor":
    "post":
      "summary": "Sharia Portfolio Monitor"
      "description": "Engine #4 - Sharia portfolio monitor + purification ledger. SCHOLAR-GATED: hidden\nbehind QT_SHARIA_PORTFOLIO_ENABLED (default off) until scholar + legal sign-off."
      "operationId": "sharia_portfolio_monitor_api_v1_sharia_portfolio_monitor_post"
      "requestBody":
        "content":
          "application/json":
            "schema":
              "$ref": "#/components/schemas/_ShariaPortfolioReq"
        "required": true
      "responses":
        "200":
          "description": "Successful Response"
          "content":
            "application/json":
              "schema": "{}"
        "422":
          "description": "Validation Error"
          "content":
            "application/json":
              "schema":
                "$ref": "#/components/schemas/HTTPValidationError"
      "security":
        - "OAuth2PasswordBearer": "[]"
      "tags":
        - "Sharia screening"
