GET /
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/vnd.oai.openapi+json
Vary: Accept

{
  "openapi": "3.0.2",
  "info": {
    "title": "Trader Dashboard API",
    "version": "1.0.0",
    "description": "Interactive documentation for the Trader Dashboard service."
  },
  "paths": {
    "/api/all-alerts/": {
      "get": {
        "operationId": "listAllAlerts",
        "description": "Return all alert types using a DB-level union for speed.\n\nOptionally include `is_in_watchlist` and/or filter by watchlist with\n`?is_in_watchlist=1`.",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {}
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/trading-alerts/{alert_id}/plan/": {
      "get": {
        "operationId": "listTradingPlanDetails",
        "description": "",
        "parameters": [
          {
            "name": "alert_id",
            "in": "path",
            "required": true,
            "description": "",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {}
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/stocks/all/": {
      "get": {
        "operationId": "listAllStocks",
        "description": "Return all active stocks with ticker and name only.",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {}
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/stocks/": {
      "get": {
        "operationId": "listStocks",
        "description": "Return paginated stock data with watchlist info.",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {}
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/stocks/{stock_symbol}/": {
      "get": {
        "operationId": "retrieveAPIStockDetail",
        "description": "Return detailed information for a single stock.",
        "parameters": [
          {
            "name": "stock_symbol",
            "in": "path",
            "required": true,
            "description": "",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/portfolio/": {
      "get": {
        "operationId": "listAPIPortfolios",
        "description": "Return portfolio summary, chart data and positions for the authenticated user.",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {}
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/portfolio/asset-allocation/": {
      "get": {
        "operationId": "listAPIAssetAllocations",
        "description": "Return allocation by sector and by holding (percent of total).",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {}
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/portfolio/risk/": {
      "get": {
        "operationId": "listAPIPortfolioRisks",
        "description": "Return basic risk metrics computed from portfolio daily values.",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {}
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/portfolio/goals/": {
      "get": {
        "operationId": "listAPIGoalListCreates",
        "description": "",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {}
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "post": {
        "operationId": "createAPIGoalList",
        "description": "",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {}
            },
            "application/x-www-form-urlencoded": {
              "schema": {}
            },
            "multipart/form-data": {
              "schema": {}
            }
          }
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/user/": {
      "get": {
        "operationId": "listAPIUserInfos",
        "description": "Return basic information for the authenticated user.",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {}
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "partialUpdateAPIUserInfo",
        "description": "Allow a user to update first and last name.",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {}
            },
            "application/x-www-form-urlencoded": {
              "schema": {}
            },
            "multipart/form-data": {
              "schema": {}
            }
          }
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/manage-subscription/": {
      "get": {
        "operationId": "listAPIManageSubscriptions",
        "description": "Return a billing portal session URL or checkout redirect.",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {}
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/subscription-info/": {
      "get": {
        "operationId": "listAPISubscriptionInfos",
        "description": "Return the user's current plan and upcoming billing details.",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {}
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/create-checkout-session/": {
      "get": {
        "operationId": "listAPICreateCheckoutSessions",
        "description": "Create a checkout session and return the URL for the frontend.",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {}
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/user/alert-preferences/": {
      "get": {
        "operationId": "listAlertPreferencesViewSets",
        "description": "Retrieve and update alert preferences for the authenticated user.",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {}
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "patch": {
        "operationId": "partialUpdateAlertPreferencesViewSet",
        "description": "Retrieve and update alert preferences for the authenticated user.",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {}
            },
            "application/x-www-form-urlencoded": {
              "schema": {}
            },
            "multipart/form-data": {
              "schema": {}
            }
          }
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/dashboard/": {
      "get": {
        "operationId": "listAPIDashboards",
        "description": "Return summary information for the dashboard.",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {}
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/stripe/webhook/": {
      "post": {
        "operationId": "createStripeWebhook",
        "description": "Stripe webhook endpoint (no auth, no CSRF via DRF).\n\nStripe posts signed JSON payloads; we verify the signature using the\n`STRIPE_WEBHOOK_SECRET` from settings and update local subscription state.",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {}
            },
            "application/x-www-form-urlencoded": {
              "schema": {}
            },
            "multipart/form-data": {
              "schema": {}
            }
          }
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": ""
          }
        },
        "tags": [
          "stripe"
        ]
      }
    },
    "/api/contact/": {
      "post": {
        "operationId": "createAPIContact",
        "description": "Receive contact form submissions and email support.",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {}
            },
            "application/x-www-form-urlencoded": {
              "schema": {}
            },
            "multipart/form-data": {
              "schema": {}
            }
          }
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/signup/": {
      "post": {
        "operationId": "createAPISignup",
        "description": "Create a new user and send a verification email.",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {}
            },
            "application/x-www-form-urlencoded": {
              "schema": {}
            },
            "multipart/form-data": {
              "schema": {}
            }
          }
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/resend-verification/": {
      "post": {
        "operationId": "createAPIResendVerification",
        "description": "Resend verification email for inactive users.",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {}
            },
            "application/x-www-form-urlencoded": {
              "schema": {}
            },
            "multipart/form-data": {
              "schema": {}
            }
          }
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/verify-email/": {
      "post": {
        "operationId": "createAPIVerifyEmail",
        "description": "Verify a user's email using a token.",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {}
            },
            "application/x-www-form-urlencoded": {
              "schema": {}
            },
            "multipart/form-data": {
              "schema": {}
            }
          }
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/stripe-success/": {
      "post": {
        "operationId": "createAPIStripeSuccess",
        "description": "Handle Stripe checkout success via API.",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {}
            },
            "application/x-www-form-urlencoded": {
              "schema": {}
            },
            "multipart/form-data": {
              "schema": {}
            }
          }
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/unified-endpoint/": {
      "post": {
        "operationId": "createUnifiedEndpoint",
        "description": "Accept raw unified payload and queue async processing.\n\nThis keeps the endpoint fast during spikes (e.g., market close).",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {}
            },
            "application/x-www-form-urlencoded": {
              "schema": {}
            },
            "multipart/form-data": {
              "schema": {}
            }
          }
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/stocks/values": {
      "post": {
        "operationId": "createStockValue",
        "description": "",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {}
            },
            "application/x-www-form-urlencoded": {
              "schema": {}
            },
            "multipart/form-data": {
              "schema": {}
            }
          }
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/stocks/{stock_symbol}/weekly-trend/": {
      "post": {
        "operationId": "createWeeklyTrendSave",
        "description": "Queue async regeneration of the weekly trend snapshot for a stock.",
        "parameters": [
          {
            "name": "stock_symbol",
            "in": "path",
            "required": true,
            "description": "",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {}
            },
            "application/x-www-form-urlencoded": {
              "schema": {}
            },
            "multipart/form-data": {
              "schema": {}
            }
          }
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/watchlist/{stock_symbol}/": {
      "post": {
        "operationId": "createAPIWatchlist",
        "description": "Add a stock to the user's watchlist.",
        "parameters": [
          {
            "name": "stock_symbol",
            "in": "path",
            "required": true,
            "description": "",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {}
            },
            "application/x-www-form-urlencoded": {
              "schema": {}
            },
            "multipart/form-data": {
              "schema": {}
            }
          }
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "destroyAPIWatchlist",
        "description": "Remove a stock from the user's watchlist.",
        "parameters": [
          {
            "name": "stock_symbol",
            "in": "path",
            "required": true,
            "description": "",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/portfolio/transactions/": {
      "post": {
        "operationId": "createAPITransaction",
        "description": "Add a new transaction for the authenticated user.",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {}
            },
            "application/x-www-form-urlencoded": {
              "schema": {}
            },
            "multipart/form-data": {
              "schema": {}
            }
          }
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/change-password/": {
      "post": {
        "operationId": "createAPIChangePassword",
        "description": "Allow an authenticated user to change their password.",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {}
            },
            "application/x-www-form-urlencoded": {
              "schema": {}
            },
            "multipart/form-data": {
              "schema": {}
            }
          }
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/reset-password/": {
      "post": {
        "operationId": "createAPIRequestPasswordReset",
        "description": "Handle password reset requests by sending a reset link.",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {}
            },
            "application/x-www-form-urlencoded": {
              "schema": {}
            },
            "multipart/form-data": {
              "schema": {}
            }
          }
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/reset-password/confirm/": {
      "post": {
        "operationId": "createAPIResetPasswordConfirm",
        "description": "Confirm a password reset using a valid token.",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {}
            },
            "application/x-www-form-urlencoded": {
              "schema": {}
            },
            "multipart/form-data": {
              "schema": {}
            }
          }
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/token/": {
      "post": {
        "operationId": "createStripeTokenObtainPair",
        "description": "",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StripeTokenObtainPair"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/StripeTokenObtainPair"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/StripeTokenObtainPair"
              }
            }
          }
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StripeTokenObtainPair"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/token/refresh/": {
      "post": {
        "operationId": "createTokenRefresh",
        "description": "Takes a refresh type JSON web token and returns an access type JSON web\ntoken if the refresh token is valid.",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TokenRefresh"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/TokenRefresh"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/TokenRefresh"
              }
            }
          }
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TokenRefresh"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    },
    "/api/portfolio/goals/{goal_id}/": {
      "patch": {
        "operationId": "partialUpdateAPIGoalDetail",
        "description": "",
        "parameters": [
          {
            "name": "goal_id",
            "in": "path",
            "required": true,
            "description": "",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {}
            },
            "application/x-www-form-urlencoded": {
              "schema": {}
            },
            "multipart/form-data": {
              "schema": {}
            }
          }
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      },
      "delete": {
        "operationId": "destroyAPIGoalDetail",
        "description": "",
        "parameters": [
          {
            "name": "goal_id",
            "in": "path",
            "required": true,
            "description": "",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "api"
        ]
      }
    }
  },
  "components": {
    "schemas": {
      "StripeTokenObtainPair": {
        "type": "object",
        "properties": {
          "username": {
            "type": "string",
            "writeOnly": true
          },
          "password": {
            "type": "string",
            "writeOnly": true
          }
        },
        "required": [
          "username",
          "password"
        ]
      },
      "TokenRefresh": {
        "type": "object",
        "properties": {
          "refresh": {
            "type": "string"
          },
          "access": {
            "type": "string",
            "readOnly": true
          }
        },
        "required": [
          "refresh"
        ]
      }
    }
  }
}