endpoints: - category: Stock Prices code_examples: curl: "# Single ticker\ncurl -X POST https://api.prixe.io/api/price \\\n -H \"\ Authorization: Bearer YOUR_API_KEY\" \\\n -H \"Content-Type: application/json\"\ \ \\\n -d '{\"ticker\": \"MSFT\", \"start_date\": \"2024-10-01\", \"end_date\"\ : \"2024-10-30\", \"interval\": \"1d\"}'\n\n# Multiple tickers (Pro+ only)\n\ curl -X POST https://api.prixe.io/api/price \\\n -H \"Authorization: Bearer\ \ YOUR_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"tickers\"\ : [\"MSFT\", \"AAPL\", \"GOOGL\"], \"start_date\": \"2024-10-01\", \"end_date\"\ : \"2024-10-30\", \"interval\": \"1d\"}'" javascript: "// Single ticker\nfetch('https://api.prixe.io/api/price', {\n method:\ \ 'POST',\n headers: {\n 'Authorization': 'Bearer YOUR_API_KEY',\n 'Content-Type':\ \ 'application/json'\n },\n body: JSON.stringify({\n ticker: 'MSFT',\n\ \ start_date: '2024-10-01',\n end_date: '2024-10-30',\n interval: '1d'\n\ \ })\n})\n.then(response => response.json())\n.then(data => console.log(data));\n\ \n// Multiple tickers (Pro+ only, up to 20)\nfetch('https://api.prixe.io/api/price',\ \ {\n method: 'POST',\n headers: {\n 'Authorization': 'Bearer YOUR_API_KEY',\n\ \ 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n \ \ tickers: ['MSFT', 'AAPL', 'GOOGL'],\n start_date: '2024-10-01',\n end_date:\ \ '2024-10-30',\n interval: '1d'\n })\n})\n.then(response => response.json())\n\ .then(data => console.log(data));" python: "import requests\n\nurl = \"https://api.prixe.io/api/price\"\nheaders\ \ = {\n \"Authorization\": \"Bearer YOUR_API_KEY\",\n \"Content-Type\"\ : \"application/json\"\n}\n\n# Single ticker\npayload_single = {\n \"ticker\"\ : \"MSFT\",\n \"start_date\": \"2024-10-01\",\n \"end_date\": \"2024-10-30\"\ ,\n \"interval\": \"1d\"\n}\n\n# Multiple tickers (Pro+ only, up to 20)\n\ payload_multi = {\n \"tickers\": [\"MSFT\", \"AAPL\", \"GOOGL\"],\n \"\ start_date\": \"2024-10-01\",\n \"end_date\": \"2024-10-30\",\n \"interval\"\ : \"1d\"\n}\n\nresponse = requests.post(url, headers=headers, json=payload_multi)\n\ data = response.json()\nprint(data)" description: 'Get historical price data for a specified stock ticker and time range. Supports both Unix timestamp and YYYY-MM-DD string formats for date inputs. **Pro+ Feature**: Multiple tickers (up to 20) can be requested at once using the ''tickers'' array parameter. Derived intervals (2m, 5m, 15m, 30m, 90m) are resampled from 1-minute data; 5d, 1wk, 1mo, 3mo are resampled from daily data. **Important**: 1-minute based intervals (1m, 2m, 5m, 15m, 30m, 90m) are limited to approximately the last 5 days of data. Hourly data (60m, 1h) is available for approximately the last 2 years. Daily and above (1d, 5d, 1wk, 1mo, 3mo) have full historical data.' errors: - description: A required parameter is missing from the request message: Missing required parameter status: 400 - description: When using multiple tickers, the maximum allowed is 20 per request message: Maximum of 20 tickers allowed per request status: 400 - description: When using the '1m' interval, the start_date must be within the last 30 days. message: 1m interval is only available for the last 30 days. status: 400 - description: When using intraday intervals (2m, 5m, 15m, 30m, 90m), the start_date must be within the last 60 days message: Intraday interval requires data within the last 60 days status: 400 - description: Invalid API key or API key not provided message: Authentication failed status: 401 - description: The 'tickers' array parameter is only available for Pro+ subscribers message: Multiple tickers feature requires a Pro+ subscription status: 401 - description: adjust=raw is a Pro+ feature; non-Pro+ keys are rejected before any data is fetched. Use adjust=adjusted (default) on lower tiers. message: This endpoint requires a Pro+ subscription status: 401 - description: You have exceeded the allowed number of requests message: Rate limit exceeded status: 429 - description: An error occurred on the server message: Internal server error status: 500 example_request: end_date: 1752186964 interval: 1d start_date: 1752108881 ticker: W example_response: data: close: - 56.62 - 56.62 - 56.57 - 56.99 - 56.99 - 57.459999084472656 - 58.5099983215332 - 58.849998474121094 - 59.154998779296875 - 59.34000015258789 - 59.255001068115234 - 58.83000183105469 - 58.83 - 58.95 - 58.79 - 58.85 high: - 56.62 - 56.62 - 56.78 - 57.3852 - 56.99 - 57.630001068115234 - 58.959999084472656 - 58.90999984741211 - 59.31999969482422 - 59.47999954223633 - 59.5099983215332 - 59.400001525878906 - 59.0 - 59.0 - 58.83 - 58.85 low: - 56.62 - 56.62 - 56.57 - 55.77 - 56.99 - 56.525001525878906 - 57.40999984741211 - 58.23809814453125 - 58.650001525878906 - 58.9900016784668 - 58.86000061035156 - 58.77000045776367 - 58.5001 - 58.57 - 58.79 - 58.85 open: - 56.62 - 56.62 - 56.75 - 56.79 - 56.99 - 56.959999084472656 - 57.45000076293945 - 58.5099983215332 - 58.849998474121094 - 59.18000030517578 - 59.34000015258789 - 59.27000045776367 - 58.83 - 58.57 - 58.83 - 58.85 price: 58.83 ticker: W timestamp: - 1752134400 - 1752138000 - 1752145200 - 1752148800 - 1752152400 - 1752154200 - 1752157800 - 1752161400 - 1752165000 - 1752168600 - 1752172200 - 1752175800 - 1752177600 - 1752181200 - 1752184800 - 1752185539 volume: - 0 - 0 - 0 - 0 - 0 - 505383 - 1556023 - 357222 - 336612 - 437100 - 798095 - 1142203 - 365533 - 0 - 0 - 0 success: true method: POST name: Historical Price path: /api/price request_fields: adjust: allowed_values: - adjusted - raw default: adjusted description: 'Price adjustment mode. ''adjusted'' (default) returns prices adjusted for stock splits so the series is continuous across split dates, and is available on all plans. ''raw'' returns split-unadjusted prices, so historical bars before a split show the actual higher pre-split price (e.g. a stock that did a 4:1 split shows ~4x higher prices before the split date, then a discontinuity at the split). **''raw'' is a Pro+ Feature**: requests with adjust=raw on a non-Pro+ key are rejected with HTTP 401 before any data is fetched; ''adjusted''/omitted is unaffected.' example: raw required: false type: string callback_url: description: Optional URL to which the API response will be forwarded as a webhook example: https://your-server.com/webhooks/price-callback required: false type: string end_date: description: End date for historical data. Accepts Unix timestamp (integer) or YYYY-MM-DD format (string). examples: date_string: '2024-10-30' unix_timestamp: 1745328600 required: true type: integer or string full_data: description: If true, the response includes a 'full_data' object with company info and analyst price targets. Default false. example: true required: false type: boolean interval: allowed_values: - 1m - 2m - 5m - 15m - 30m - 60m - 90m - 1h - 1d - 5d - 1wk - 1mo - 3mo description: Time interval for the data points. Note specific date range limitations for intraday intervals. example: 1d required: true restrictions: 1m_based_intervals: 1m, 2m, 5m, 15m, 30m, 90m are derived from 1-minute data, available for approximately the last 7 days. daily_and_above: 1d, 5d, 1wk, 1mo, 3mo have full historical data available. hourly_intervals: 60m, 1h are available for approximately the last 2 years. type: string start_date: description: Start date for historical data. Accepts Unix timestamp (integer) or YYYY-MM-DD format (string). examples: date_string: '2024-10-01' unix_timestamp: 1735828200 required: true type: integer or string ticker: description: Single stock ticker symbol (e.g., AAPL, MSFT, GOOGL) example: MSFT required: Required if 'tickers' not provided type: string tickers: description: Array of stock ticker symbols (up to 20). Requires Pro+ subscription. example: - AAPL - MSFT - GOOGL max_items: 20 required: Required if 'ticker' not provided (Pro+ only) type: array response_fields: count: description: Number of tickers requested (only present for multi-ticker requests) type: integer data: description: Container for the filtered price data. For multi-ticker requests, this is an object where each key is a ticker symbol containing the price data. fields: close: description: Array of closing prices for each time period type: array high: description: Array of highest prices for each time period type: array low: description: Array of lowest prices for each time period type: array open: description: Array of opening prices for each time period type: array price: description: Current/regular market price type: number ticker: description: Stock ticker symbol type: string timestamp: description: Array of Unix timestamps for each data point type: array volume: description: Array of trading volumes for each time period type: array type: object full_data: description: 'Present when request included full_data: true. Contains company info and analyst price targets.' fields: company_info: Company details (address, officers, financials, etc.) price_target: Analyst price targets (current, high, low, mean, median) type: object multi_ticker: description: Present and true when multiple tickers were requested. When true, 'data' is an object keyed by ticker symbol. type: boolean success: description: Indicates if the request was successful type: boolean - category: Stock Prices code_examples: curl: "curl -X POST https://api.prixe.io/api/splits \\\n -H \"Authorization:\ \ Bearer YOUR_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d\ \ '{\"ticker\": \"AAPL\"}'" javascript: "fetch('https://api.prixe.io/api/splits', {\n method: 'POST',\n \ \ headers: {\n 'Authorization': 'Bearer YOUR_API_KEY',\n 'Content-Type':\ \ 'application/json'\n },\n body: JSON.stringify({ ticker: 'AAPL' })\n})\n\ .then(response => response.json())\n.then(data => {\n data.splits.forEach(s\ \ => console.log(`${s.date}: ${s.ratio}`));\n})\n.catch(error => console.error('Error:',\ \ error));" python: "import requests\n\nurl = \"https://api.prixe.io/api/splits\"\nheaders\ \ = {\n \"Authorization\": \"Bearer YOUR_API_KEY\",\n \"Content-Type\"\ : \"application/json\"\n}\npayload = {\"ticker\": \"AAPL\"}\n\nresponse = requests.post(url,\ \ headers=headers, json=payload)\ndata = response.json()\nfor s in data.get(\"\ splits\", []):\n print(f\"{s['date']}: {s['ratio']}\")" description: 'Get the stock split calendar for a ticker. Returns every split with its effective date and ratio, newest first. A ticker that has never split returns an empty list (not an error). **Pro+ Feature**: this endpoint requires a Pro+ subscription.' errors: - description: The required 'ticker' parameter was missing or empty message: 'Missing required parameter: ''ticker''' status: 400 - description: Invalid API key or API key not provided message: Authentication failed status: 401 - description: The /api/splits endpoint is a Pro+ feature; non-Pro+ keys are rejected message: This endpoint requires a Pro+ subscription status: 401 - description: You have exceeded the allowed number of requests message: Rate limit exceeded status: 429 - description: The split data source is temporarily unavailable; retry later message: Split calendar unavailable status: 502 example_request: ticker: AAPL example_response: splits: - date: '2020-08-31' ratio: 4.0 - date: '2014-06-09' ratio: 7.0 - date: '2005-02-28' ratio: 2.0 - date: '2000-06-21' ratio: 2.0 - date: '1987-06-16' ratio: 2.0 ticker: AAPL method: POST name: Stock Splits path: /api/splits request_fields: callback_url: description: Optional URL to which the API response will be forwarded as a webhook example: https://your-server.com/webhooks/splits-callback required: false type: string ticker: description: Stock ticker symbol (e.g., AAPL, TSLA, NVDA) example: AAPL required: true type: string response_fields: splits: description: List of split events, newest first. Empty if the ticker has never split. fields: date: description: Split effective date in YYYY-MM-DD format type: string ratio: description: Split ratio as a multiplier. 4.0 means a 4-for-1 forward split (one share became four); 0.5 means a 1-for-2 reverse split. type: number type: array ticker: description: The ticker the split calendar is for type: string - category: Stock Prices code_examples: curl: "curl -G https://api.prixe.io/api/nasdaq/snapshot \\\n -H 'Authorization:\ \ Bearer YOUR_API_KEY' \\\n --data-urlencode 'tickers=AAPL,MSFT' \\\n --data-urlencode\ \ 'category=US_STOCK'" javascript: "const url = new URL('https://api.prixe.io/api/nasdaq/snapshot');\n\ url.search = new URLSearchParams({tickers: 'AAPL,MSFT', category: 'US_STOCK'});\n\ fetch(url, {headers: {'Authorization': 'Bearer YOUR_API_KEY'}})\n .then(r =>\ \ r.json()).then(console.log);" python: "import requests\n\nr = requests.get(\n 'https://api.prixe.io/api/nasdaq/snapshot',\n\ \ headers={'Authorization': 'Bearer YOUR_API_KEY'},\n params={'tickers':\ \ 'AAPL,MSFT', 'category': 'US_STOCK'},\n)\nprint(r.json())" description: "Top-of-book bid/ask, last trade, OHL, 52-week high/low, and reference\ \ data (market cap, shares outstanding, P/E, dividend yield) for one or more tickers.\ \ Sourced from Nasdaq. Fields that are not available for an instrument or at a\ \ given moment are returned as null \u2014 always handle null on the nullable\ \ fields. **Pro+ Feature**." errors: - description: Caller's plan is not Pro+ or Master Key. message: This endpoint requires a Pro+ subscription. status: 401 - description: Caller exceeded per-plan rate limits. message: Rate limit exceeded status: 429 example_request: category: US_STOCK tickers: AAPL,MSFT example_response: - ask: '296.86' ask_size: '33' bid: '273.43' bid_size: '2' change: '2.12' change_ratio: '0.007243' close: '294.80' fifty_two_wk_high: '295.27' fifty_two_wk_low: '192.695527' high: '295.27' last_trade_time: 1778616001065 low: '292.56' market_value: '4329832548800.00' neg_market_value: '4258484204660.40' open: '292.56' out_standing_shares: '14445333123' pb_ratio: '40.604942' pe_ratio: '35.661578' pre_close: '292.68' price: '294.80' ps_ratio: '9.578270' quote_time: 1778630400252 ticker: AAPL total_shares: '14687356000' volume: '45748129' yield: '0.003664' method: GET name: Nasdaq Snapshot path: /api/nasdaq/snapshot request_fields: category: description: US_STOCK or US_ETF. If the ticker is not found under the requested category, the other category is tried automatically, so either value works for both stocks and ETFs. example: US_STOCK required: true type: string tickers: description: "Comma-separated tickers (e.g. AAPL,MSFT,SPY). Maximum 100 tickers\ \ per request. Note: if any requested ticker is invalid, the whole request\ \ fails \u2014 all tickers must be valid." example: AAPL,MSFT required: true type: string response_fields: description: One object per requested ticker. items: fields: ask: description: Best ask price type: string ask_size: description: Best ask size type: string bid: description: Best bid price type: string bid_size: description: Best bid size type: string change: description: Price change vs. pre_close type: string change_ratio: description: Price change as decimal (e.g. 0.0072 = +0.72%) type: string close: description: Today's close (equals price during the live session) type: string fifty_two_wk_high: description: 52-week high price nullable: true type: string fifty_two_wk_low: description: 52-week low price nullable: true type: string high: description: Today's high type: string last_trade_time: description: Last trade timestamp (Unix milliseconds) type: integer low: description: Today's low type: string market_value: description: Market capitalization (stocks only) nullable: true type: string neg_market_value: description: Free-float market capitalization (stocks only) nullable: true type: string open: description: Today's opening price type: string out_standing_shares: description: Float shares (stocks only) nullable: true type: string pb_ratio: description: Price-to-book ratio (stocks only) nullable: true type: string pe_ratio: description: Price-to-earnings ratio nullable: true type: string pre_close: description: Previous trading day's closing price type: string price: description: Last trade price type: string ps_ratio: description: Price-to-sales ratio (stocks only) nullable: true type: string quote_time: description: Quote timestamp (Unix milliseconds) type: integer ticker: description: Ticker type: string total_shares: description: Total shares outstanding (stocks only) nullable: true type: string volume: description: Today's traded volume type: string yield: description: Dividend yield as decimal (e.g. 0.0037 = 0.37%) nullable: true type: string type: object type: array - category: Stock Prices code_examples: curl: "curl -G https://api.prixe.io/api/nasdaq/quotes \\\n -H 'Authorization:\ \ Bearer YOUR_API_KEY' \\\n --data-urlencode 'ticker=AAPL' \\\n --data-urlencode\ \ 'category=US_STOCK'" javascript: "const url = new URL('https://api.prixe.io/api/nasdaq/quotes');\n\ url.search = new URLSearchParams({ticker: 'AAPL', category: 'US_STOCK'});\n\ fetch(url, {headers: {'Authorization': 'Bearer YOUR_API_KEY'}})\n .then(r =>\ \ r.json()).then(console.log);" python: "import requests\n\nr = requests.get(\n 'https://api.prixe.io/api/nasdaq/quotes',\n\ \ headers={'Authorization': 'Bearer YOUR_API_KEY'},\n params={'ticker':\ \ 'AAPL', 'category': 'US_STOCK'},\n)\nprint(r.json())" description: Top-of-book bid and ask levels (price + size) for a single ticker, sourced from Nasdaq. **Pro+ Feature**. errors: - description: Caller's plan is not Pro+ or Master Key. message: This endpoint requires a Pro+ subscription. status: 401 example_request: category: US_STOCK ticker: AAPL example_response: asks: - price: '296.86' size: '33' bids: - price: '273.43' size: '2' quote_time: 1778630400252 ticker: AAPL method: GET name: Nasdaq Quotes path: /api/nasdaq/quotes request_fields: category: description: US_STOCK or US_ETF. If the ticker is not found under the requested category, the other category is tried automatically, so either value works for both stocks and ETFs. example: US_STOCK required: true type: string ticker: description: Single ticker example: AAPL required: true type: string response_fields: fields: asks: description: Ask side of the book, sorted ascending by price. Top-of-book only (single element). items: fields: price: description: Ask price type: string size: description: Ask size type: string type: object type: array bids: description: Bid side of the book, sorted descending by price. Top-of-book only. items: fields: price: description: Bid price type: string size: description: Bid size type: string type: object type: array quote_time: description: Quote timestamp (Unix milliseconds) type: integer ticker: description: Ticker type: string type: object - category: Stock Prices code_examples: curl: "curl -G https://api.prixe.io/api/nasdaq/tick \\\n -H 'Authorization: Bearer\ \ YOUR_API_KEY' \\\n --data-urlencode 'ticker=AAPL' \\\n --data-urlencode\ \ 'category=US_STOCK' \\\n --data-urlencode 'count=10'" javascript: "const url = new URL('https://api.prixe.io/api/nasdaq/tick');\nurl.search\ \ = new URLSearchParams({ticker: 'AAPL', category: 'US_STOCK', count: '10'});\n\ fetch(url, {headers: {'Authorization': 'Bearer YOUR_API_KEY'}})\n .then(r =>\ \ r.json()).then(console.log);" python: "import requests\n\nr = requests.get(\n 'https://api.prixe.io/api/nasdaq/tick',\n\ \ headers={'Authorization': 'Bearer YOUR_API_KEY'},\n params={'ticker':\ \ 'AAPL', 'category': 'US_STOCK', 'count': '10'},\n)\nprint(r.json())" description: "Most recent N trade prints (time, price, volume, side) \u2014 per-print\ \ trade tape sourced from Nasdaq. **Pro+ Feature**." errors: - description: Caller's plan is not Pro+ or Master Key. message: This endpoint requires a Pro+ subscription. status: 401 example_request: category: US_STOCK count: 10 ticker: AAPL example_response: result: - price: '294.53' side: S time: '1778616055704' trading_session: RTH volume: '3' - price: '294.65' side: B time: '1778616050197' trading_session: RTH volume: '1' - price: '294.50' side: L time: '1778616044028' trading_session: RTH volume: '10' ticker: AAPL method: GET name: Nasdaq Tick path: /api/nasdaq/tick request_fields: category: description: US_STOCK or US_ETF. If the ticker is not found under the requested category, the other category is tried automatically, so either value works for both stocks and ETFs. example: US_STOCK required: true type: string count: description: Number of most-recent prints to return (default 10, server cap ~200) example: 10 required: false type: integer ticker: description: Single ticker example: AAPL required: true type: string response_fields: fields: result: description: Most recent trade prints, newest first. items: fields: price: description: Trade price type: string side: description: '''B'' (buy-side print), ''S'' (sell-side print), ''N'' (neutral), or a single-letter trade condition code' type: string time: description: Trade timestamp (Unix milliseconds, as a string) type: string trading_session: description: RTH (regular), ETH (pre/post), or OVN (overnight) type: string volume: description: Trade size in shares type: string type: object type: array ticker: description: Ticker type: string type: object - category: Stock Prices code_examples: curl: "curl -G https://api.prixe.io/api/nasdaq/bars \\\n -H 'Authorization: Bearer\ \ YOUR_API_KEY' \\\n --data-urlencode 'ticker=AAPL' \\\n --data-urlencode\ \ 'category=US_STOCK' \\\n --data-urlencode 'timespan=D' \\\n --data-urlencode\ \ 'count=10'" javascript: "const url = new URL('https://api.prixe.io/api/nasdaq/bars');\nurl.search\ \ = new URLSearchParams({ticker: 'AAPL', category: 'US_STOCK', timespan: 'D',\ \ count: '10'});\nfetch(url, {headers: {'Authorization': 'Bearer YOUR_API_KEY'}})\n\ \ .then(r => r.json()).then(console.log);" python: "import requests\n\nr = requests.get(\n 'https://api.prixe.io/api/nasdaq/bars',\n\ \ headers={'Authorization': 'Bearer YOUR_API_KEY'},\n params={'ticker':\ \ 'AAPL', 'category': 'US_STOCK', 'timespan': 'D', 'count': '10'},\n)\nprint(r.json())" description: Historical OHLCV bars for one ticker. **Pro+ Feature**. errors: - description: Caller's plan is not Pro+ or Master Key. message: This endpoint requires a Pro+ subscription. status: 401 example_request: category: US_STOCK count: 10 ticker: AAPL timespan: D example_response: - close: '294.80' high: '295.27' low: '292.56' open: '292.56' ticker: AAPL time: 2026-05-12T04:00:00.000+0000 trading_session: '' volume: '45687251' - close: '292.68' high: '293.88' low: '290.23' open: '291.979' ticker: AAPL time: 2026-05-11T04:00:00.000+0000 trading_session: '' volume: '42247285' method: GET name: Nasdaq Bars (single ticker) path: /api/nasdaq/bars request_fields: category: description: US_STOCK or US_ETF. If the ticker is not found under the requested category, the other category is tried automatically, so either value works for both stocks and ETFs. example: US_STOCK required: true type: string count: description: Number of most-recent bars (default 200, server cap typically 200). Accepts integer or string (e.g. 30 or "30"). example: 30 required: false type: integer real_time_required: description: Set to 'true' to include the still-forming current bar example: 'true' required: false type: string ticker: description: Single ticker example: AAPL required: true type: string timespan: description: M1, M5, M15, M30, M60, M120, M240, D, W, M, or Y example: D required: true type: string trading_sessions: description: 'Comma-separated sessions to include: RTH (regular), ETH (pre/post), OVN (overnight)' example: RTH required: false type: string response_fields: description: Bars newest to oldest. Returned as a top-level JSON array (not wrapped in an object). items: fields: close: description: Closing price of the bar type: string high: description: Highest price during the bar type: string low: description: Lowest price during the bar type: string open: description: Opening price of the bar type: string ticker: description: Ticker type: string time: description: Bar start time in ISO 8601 with timezone (e.g. 2026-05-12T19:55:00.000+0000) type: string trading_session: description: RTH / ETH / OVN, or empty string for daily/weekly/monthly bars type: string volume: description: Volume during the bar type: string type: object type: array - category: Stock Prices code_examples: curl: "curl -X POST https://api.prixe.io/api/nasdaq/batch_bars \\\n -H 'Authorization:\ \ Bearer YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"\ tickers\":[\"AAPL\",\"MSFT\",\"NVDA\"],\"category\":\"US_STOCK\",\"timespan\"\ :\"D\",\"count\":3}'" javascript: "fetch('https://api.prixe.io/api/nasdaq/batch_bars', {\n method:\ \ 'POST',\n headers: {'Authorization': 'Bearer YOUR_API_KEY', 'Content-Type':\ \ 'application/json'},\n body: JSON.stringify({tickers: ['AAPL', 'MSFT', 'NVDA'],\ \ category: 'US_STOCK', timespan: 'D', count: 3})\n}).then(r => r.json()).then(console.log);" python: "import requests\n\nr = requests.post(\n 'https://api.prixe.io/api/nasdaq/batch_bars',\n\ \ headers={'Authorization': 'Bearer YOUR_API_KEY', 'Content-Type': 'application/json'},\n\ \ json={'tickers': ['AAPL', 'MSFT', 'NVDA'], 'category': 'US_STOCK', 'timespan':\ \ 'D', 'count': 3},\n)\nprint(r.json())" description: Historical OHLCV bars for multiple tickers in one call. Same fields as /api/nasdaq/bars but `tickers` is an array. **Pro+ Feature**. errors: - description: Caller's plan is not Pro+ or Master Key. message: This endpoint requires a Pro+ subscription. status: 401 example_request: category: US_STOCK count: 3 tickers: - AAPL - MSFT - NVDA timespan: D example_response: result: - result: - close: '294.80' high: '295.27' low: '292.56' open: '292.56' time: 2026-05-12T04:00:00.000+0000 trading_session: '' volume: '45687251' - close: '292.68' high: '293.88' low: '290.23' open: '291.979' time: 2026-05-11T04:00:00.000+0000 trading_session: '' volume: '42247285' ticker: AAPL - result: - close: '407.77' high: '415.50' low: '406.64' open: '414.48' time: 2026-05-12T04:00:00.000+0000 trading_session: '' volume: '38520196' ticker: MSFT method: POST name: Nasdaq Batch Bars (multi-ticker) path: /api/nasdaq/batch_bars request_fields: category: description: US_STOCK or US_ETF. If the ticker is not found under the requested category, the other category is tried automatically, so either value works for both stocks and ETFs. example: US_STOCK required: true type: string count: description: Number of most-recent bars per ticker (default 200). Accepts integer or string (e.g. 5 or "5"). example: 5 required: false type: integer real_time_required: description: Set to 'true' to include the still-forming current bar example: 'true' required: false type: string tickers: description: Array of tickers example: - AAPL - MSFT - NVDA required: true type: array timespan: description: M1, M5, M15, M30, M60, M120, M240, D, W, M, or Y example: D required: true type: string trading_sessions: description: 'Sessions to include: RTH, ETH, OVN' example: - RTH required: false type: array response_fields: fields: result: description: One object per requested ticker. items: fields: result: description: Bars for this ticker, newest to oldest. items: fields: close: type: string high: type: string low: type: string open: type: string time: description: Bar start time in ISO 8601 with timezone type: string trading_session: description: RTH / ETH / OVN, or empty string for daily/weekly/monthly bars type: string volume: type: string type: object type: array ticker: description: Ticker type: string type: object type: array type: object - category: Crypto code_examples: curl: "curl -X POST https://api.prixe.io/api/crypto \\\n -H 'Authorization: Bearer\ \ YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"type\"\ :\"snapshot\",\"tickers\":[\"BTC\",\"ETH\"]}'" javascript: "fetch('https://api.prixe.io/api/crypto', {\n method: 'POST',\n \ \ headers: {'Authorization': 'Bearer YOUR_API_KEY', 'Content-Type': 'application/json'},\n\ \ body: JSON.stringify({type: 'snapshot', tickers: ['BTC', 'ETH']})\n}).then(r\ \ => r.json()).then(console.log);" python: "import requests\n\nr = requests.post(\n 'https://api.prixe.io/api/crypto',\n\ \ headers={'Authorization': 'Bearer YOUR_API_KEY', 'Content-Type': 'application/json'},\n\ \ json={'type': 'snapshot', 'tickers': ['BTC', 'ETH']},\n)\nprint(r.json())" description: Crypto market data for one or more pairs. Single endpoint with a `type` field that selects between a real-time snapshot (top-of-book quote, OHL, change) and historical OHLC bars. Tickers are the base symbol only (e.g. `BTC`, `ETH`, `SOL`); all pairs are quoted in USD. Use `/api/crypto/list` to discover supported tickers. **Pro+ Feature**. errors: - description: '`type` must be `snapshot` or `bars`.' message: invalid_type status: 400 - description: '`tickers` is required (string or array).' message: missing_tickers status: 400 - description: Bars `timespan` is not one of the supported codes. message: invalid_timespan status: 400 - description: Caller's plan is not Pro+ or Master Key. message: This endpoint requires a Pro+ subscription. status: 401 - description: Caller exceeded per-plan rate limits. message: Rate limit exceeded status: 429 example_request: count: 3 tickers: - BTC timespan: D type: bars example_response: - result: - close: '76668.85' high: '77276.29' low: '74268.42' open: '75553.26' time: 2026-05-23T04:00:00.000+0000 - close: '75554.49' high: '77844.50' low: '75139.91' open: '77717.55' time: 2026-05-22T04:00:00.000+0000 - close: '77717.63' high: '78110.15' low: '76658.66' open: '78009.46' time: 2026-05-21T04:00:00.000+0000 ticker: BTC method: POST name: Crypto path: /api/crypto request_fields: count: description: Bars only. Number of most-recent bars per symbol. example: 5 required: false type: integer tickers: description: Crypto pair(s) as base symbol(s). Comma-separated string or array, uppercase (e.g. BTC, ETH). All pairs are USD-quoted. example: BTC,ETH required: true type: string or array timespan: description: Bars only. One of M1, M5, M15, M30, M60, M120, M240, D, W, M, Y. Defaults to D. example: D required: false type: string type: description: One of `snapshot` or `bars`. example: snapshot required: true type: string response_fields: description: "For `type=snapshot`: one snapshot object per requested pair. For\ \ `type=bars`: one object per pair with a nested `result` array of bars (newest\ \ to oldest, OHLC only \u2014 no volume)." items: fields: ask: description: 'snapshot: best ask' type: string ask_size: description: 'snapshot: best ask size' type: string bid: description: 'snapshot: best bid' type: string bid_size: description: 'snapshot: best bid size' type: string change: description: 'snapshot: price change vs pre_close' type: string change_ratio: description: 'snapshot: change as decimal (e.g. -0.000735 = -0.0735%)' type: string close: description: 'snapshot: current close (equals price during the live session)' type: string high: description: 'snapshot: session high' type: string last_trade_time: description: 'snapshot: last trade timestamp (Unix milliseconds)' type: integer low: description: 'snapshot: session low' type: string open: description: 'snapshot: session open' type: string pre_close: description: 'snapshot: previous session close' type: string price: description: "snapshot only \u2014 last trade price" type: string quote_time: description: 'snapshot: quote timestamp (Unix milliseconds)' type: integer result: description: "bars only \u2014 array of OHLC bars" items: fields: close: type: string high: type: string low: type: string open: type: string time: description: Bar start time in ISO 8601 with timezone type: string type: object type: array ticker: description: Crypto pair base symbol (e.g. BTC, ETH) type: string type: object type: array - category: Crypto code_examples: curl: "curl -G https://api.prixe.io/api/crypto/list \\\n -H 'Authorization: Bearer\ \ YOUR_API_KEY'" javascript: "fetch('https://api.prixe.io/api/crypto/list', {\n headers: {'Authorization':\ \ 'Bearer YOUR_API_KEY'}\n}).then(r => r.json()).then(console.log);" python: "import requests\n\nr = requests.get(\n 'https://api.prixe.io/api/crypto/list',\n\ \ headers={'Authorization': 'Bearer YOUR_API_KEY'},\n)\nprint(r.json())" description: List every crypto pair supported by `/api/crypto`. Returns `ticker`, `name`, and quote `currency` for each pair. Tickers are base symbols only (USD quote is implicit). Useful for discovering valid `tickers` values before calling `/api/crypto`. **Pro+ Feature**. errors: - description: Caller's plan is not Pro+ or Master Key. message: This endpoint requires a Pro+ subscription. status: 401 - description: Caller exceeded per-plan rate limits. message: Rate limit exceeded status: 429 example_request: {} example_response: - currency: USD name: BTC ticker: BTC - currency: USD name: ETH ticker: ETH - currency: USD name: USD Coin ticker: USDC - currency: USD name: Fantom ticker: FTM method: GET name: Crypto Supported Pairs path: /api/crypto/list request_fields: {} response_fields: description: One object per supported pair. items: fields: currency: description: Quote currency (always `USD` today). type: string name: description: Human-readable name when available (e.g. `USD Coin`, `Fantom`); otherwise equals `ticker`. type: string ticker: description: Crypto pair base symbol (e.g. BTC, ETH, SOL). USD quote is implicit. type: string type: object type: array - category: SEC Filings code_examples: curl: "# IPO calendar for a specific month\ncurl -X POST https://api.prixe.io/api/ipo_calendar\ \ \\\n -H \"Authorization: Bearer YOUR_API_KEY\" \\\n -H \"Content-Type: application/json\"\ \ \\\n -d '{\"month\": \"2025-05\"}'\n\n# Current month (omit 'month')\ncurl\ \ -X POST https://api.prixe.io/api/ipo_calendar \\\n -H \"Authorization: Bearer\ \ YOUR_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{}'" javascript: "fetch('https://api.prixe.io/api/ipo_calendar', {\n method: 'POST',\n\ \ headers: {\n 'Authorization': 'Bearer YOUR_API_KEY',\n 'Content-Type':\ \ 'application/json'\n },\n body: JSON.stringify({ month: '2025-05' })\n})\n\ .then(r => r.json())\n.then(data => console.log(data.counts, data.priced));" python: "import requests\n\nurl = 'https://api.prixe.io/api/ipo_calendar'\nheaders\ \ = {\n 'Authorization': 'Bearer YOUR_API_KEY',\n 'Content-Type': 'application/json'\n\ }\n\nresponse = requests.post(url, headers=headers, json={'month': '2025-05'})\n\ data = response.json()\nprint(data['counts'])\nfor deal in data['priced']:\n\ \ print(deal['ticker'], deal['company_name'], deal['offer_amount'])" description: 'Monthly IPO calendar from Nasdaq: deals that priced, were newly filed, or were withdrawn in the month, plus upcoming/expected IPOs. Specify the month as YYYY-MM (defaults to the current month). Historical data is available from 1996 onward. Requires Pro+ subscription.' errors: - description: Invalid 'month' format (must be YYYY-MM), month out of range, or a year before 1996. message: Invalid request format status: 400 - description: Invalid API key, or this endpoint requires a Pro+ subscription. message: Unauthorized status: 401 - description: You have exceeded the allowed number of requests. message: Rate limit exceeded status: 429 - description: The upstream IPO calendar source was unreachable. Try again later. message: Failed to fetch IPO calendar status: 502 - description: An error occurred on the server. message: Internal server error status: 500 method: POST name: IPO Calendar path: /api/ipo_calendar request_fields: month: description: Month to retrieve in YYYY-MM format. Defaults to the current month. Data is available from 1996-01 onward; future months return scheduled/upcoming IPOs. example: 2025-05 required: false type: string month_number: description: 'Alternative to ''month'': the month number (1-12). Used together with ''year'' when ''month'' is not provided.' example: 5 required: false type: integer year: description: 'Alternative to ''month'': the calendar year. Used together with ''month_number'' when ''month'' is not provided.' example: 2025 required: false type: integer response_fields: counts: description: Number of deals in each section. fields: filed: description: Count of IPOs newly filed during the month. type: integer priced: description: Count of IPOs that priced during the month. type: integer upcoming: description: Count of upcoming/expected IPOs (populated for the current and future months). type: integer withdrawn: description: Count of IPOs withdrawn during the month. type: integer type: object filed: description: IPOs newly filed during the month. items: fields: company_name: description: Company name. type: string filed_date: description: Date the registration was filed (YYYY-MM-DD). type: string offer_amount: description: Total dollar value of shares offered (USD). nullable: true type: number ticker: description: Proposed ticker symbol. nullable: true type: string type: object type: array month: description: The month returned, in YYYY-MM format. type: string month_number: description: Month number (1-12) of the returned month. type: integer priced: description: IPOs that priced during the month. items: fields: company_name: description: Company name. type: string exchange: description: Listing exchange/market. nullable: true type: string offer_amount: description: Total dollar value of shares offered (USD). nullable: true type: number price: description: Offer price per share as a string (e.g. '4.00'). May be null when not disclosed. nullable: true type: string priced_date: description: Date the IPO priced (YYYY-MM-DD). type: string shares_offered: description: Number of shares offered. nullable: true type: integer status: description: Deal status (e.g. 'Priced'). type: string ticker: description: Proposed ticker symbol. nullable: true type: string type: object type: array success: description: Indicates if the request was successfully processed. type: boolean upcoming: description: Upcoming/expected IPOs (populated for the current and future months). items: fields: company_name: description: Company name. type: string exchange: description: Listing exchange/market. nullable: true type: string expected_price_date: description: Expected IPO/pricing date (YYYY-MM-DD). type: string offer_amount: description: Expected total dollar value of shares offered (USD). nullable: true type: number price: description: Expected offer price per share. Often a range string (e.g. '25.00-27.00') for upcoming deals. nullable: true type: string shares_offered: description: Number of shares expected to be offered. nullable: true type: integer ticker: description: Proposed ticker symbol. nullable: true type: string type: object type: array withdrawn: description: IPOs withdrawn during the month. items: fields: company_name: description: Company name. type: string exchange: description: Listing exchange/market. nullable: true type: string filed_date: description: Original filing date (YYYY-MM-DD). type: string offer_amount: description: Total dollar value of shares offered (USD). nullable: true type: number shares_offered: description: Number of shares that had been offered. nullable: true type: integer ticker: description: Proposed ticker symbol. nullable: true type: string withdrawn_date: description: Date the IPO was withdrawn (YYYY-MM-DD). type: string type: object type: array year: description: Calendar year of the returned month. type: integer - category: WebSocket client_messages: - data: category: description: US_STOCK or US_ETF. example: US_STOCK required: true type: string sub_types: description: Any combination of SNAPSHOT, TICK, QUOTE (uppercase preferred; lowercase accepted). example: - SNAPSHOT - TICK required: true type: array symbol: description: Ticker (e.g. AAPL, SPY). example: AAPL required: true type: string description: Start receiving real-time pushes for a symbol. event: subscribe - data: symbol: description: Ticker to unsubscribe. If omitted, unsubscribes ALL symbols. example: AAPL required: false type: string description: Stop receiving pushes. Omit `data` to unsubscribe from every symbol on this connection. event: unsubscribe - data: {} description: Heartbeat. Server replies with `pong`. event: ping code_examples: curl: '# WebSocket; not curl-able. Use wscat: wscat -c ''wss://ws.prixe.io/nasdaq?api_key=YOUR_API_KEY'' then send: {"event":"subscribe","data":{"symbol":"AAPL","category":"US_STOCK","sub_types":["SNAPSHOT","TICK"]}}' javascript: "const ws = new WebSocket('wss://ws.prixe.io/nasdaq?api_key=YOUR_API_KEY');\n\ \nws.onopen = () => {\n ws.send(JSON.stringify({\n event: 'subscribe',\n\ \ data: { symbol: 'AAPL', category: 'US_STOCK', sub_types: ['SNAPSHOT', 'TICK']\ \ }\n }));\n};\n\nws.onmessage = (e) => {\n const msg = JSON.parse(e.data);\n\ \ if (msg.event === 'market_data') {\n console.log(msg.data.topic, msg.data.symbol,\ \ msg.data.payload);\n } else if (msg.event === 'subscription_status') {\n\ \ console.log('sub:', msg.data.status, msg.data.symbol);\n } else if (msg.event\ \ === 'error') {\n console.error(msg.data.message);\n }\n};\n\nws.onclose\ \ = (e) => console.log('closed', e.code, e.reason);" python: "import asyncio, json, websockets\n\nasync def main():\n url = 'wss://ws.prixe.io/nasdaq?api_key=YOUR_API_KEY'\n\ \ async with websockets.connect(url) as ws:\n await ws.send(json.dumps({\n\ \ 'event': 'subscribe',\n 'data': {'symbol': 'AAPL', 'category':\ \ 'US_STOCK', 'sub_types': ['SNAPSHOT', 'TICK']}\n }))\n async\ \ for raw in ws:\n msg = json.loads(raw)\n if msg.get('event')\ \ == 'market_data':\n d = msg['data']\n print(d['topic'],\ \ d['symbol'], d['payload'])\n\nasyncio.run(main())" connection: auth: API key in the `api_key` query parameter (URL-encoded if it contains `+`). plan_restriction: Pro+ and Master Key only. url: wss://ws.prixe.io/nasdaq?api_key=YOUR_API_KEY description: "Real-time market-data stream for US stocks and ETFs (top-of-book snapshots,\ \ Best Bid & Offer, and Time & Sales prints). **Pro+ Feature** \u2014 non-Pro+\ \ keys are rejected with WebSocket close-code 1008." errors: - description: Connection opened without an api_key query parameter. message: 'API key required in URL: ?api_key=YOUR_KEY' status: 1008 - description: API key not recognized. message: Invalid API key status: 1008 - description: Caller's plan is not Pro+ or Master Key. message: This feature requires a Pro+ subscription. status: 1008 example_request: data: category: US_STOCK sub_types: - SNAPSHOT - TICK symbol: AAPL event: subscribe example_response: data: payload: basic: symbol: AAPL timestamp: '1778616001065' change: '2.12' change_ratio: '0.007243' high: '295.27' low: '292.56' open: '292.56' pre_close: '292.68' price: '294.80' trade_time: '1778616001065' volume: '45748129' symbol: AAPL topic: snapshot event: market_data method: WebSocket name: Nasdaq Real-Time Streaming path: wss://ws.prixe.io/nasdaq server_messages: - data: plan: description: Caller's plan example: Pro+ type: string status: description: Always 'connected' example: connected type: string description: Sent on successful authentication. event: connected - data: message: description: Present only when status is 'error'. Upstream error description. nullable: true type: string status: description: subscribed | unsubscribed | error example: subscribed type: string symbol: description: Ticker affected example: AAPL type: string description: Confirms a subscribe/unsubscribe action or reports a subscribe failure. event: subscription_status - data: category: description: US_STOCK or US_ETF. example: US_STOCK type: string message: description: Human-readable explanation of what data cadence to expect during this session. example: Overnight session (8:00 PM - 4:00 AM ET). Very few names trade overnight; even large caps like AAPL/TSLA may push 0-1 updates per minute. This is expected - the stream is connected and subscribed. type: string session: description: regular | pre_market | after_hours | overnight | closed_weekend example: overnight type: string symbol: description: Ticker the message refers to. example: AAPL type: string description: Sent once immediately after a successful US_STOCK / US_ETF subscribe. Tells the client which US equity session is active so a quiet stream (overnight, weekend, holiday) doesn't look like a bug. Not sent for non-US-equity categories. event: market_status - data: payload: description: 'Topic-specific fields. snapshot: price/open/high/low/pre_close/volume/change/change_ratio. tick: time/price/volume/side. quote: asks[]/bids[] with price+size.' example: basic: symbol: AAPL timestamp: '1778616001065' change: '2.12' price: '294.80' trade_time: '1778616001065' volume: '45748129' type: object symbol: description: Symbol identifier matching the subscribe call. example: AAPL type: string topic: description: snapshot | tick | quote example: snapshot type: string description: A real-time push. Payload shape depends on `topic`. event: market_data - data: {} description: Reply to a `ping`. event: pong - data: message: description: Error description example: This feature requires a Pro+ subscription. type: string description: Connection-level error. The server may close the connection after sending. event: error - category: Crypto client_messages: - data: sub_types: description: Currently only `SNAPSHOT` is supported by the upstream for crypto. example: - SNAPSHOT required: true type: array ticker: description: Crypto pair base symbol. example: BTC required: true type: string description: Start receiving real-time pushes for a crypto pair. Use the base symbol (e.g. `BTC`); the server appends USD before forwarding to the upstream feed. The legacy full form (`BTCUSD`) is accepted as a passthrough. event: subscribe - data: ticker: description: Pair to unsubscribe. If omitted, unsubscribes ALL pairs. example: BTC required: false type: string description: Stop receiving pushes. Omit `data` to unsubscribe from every pair on this connection. event: unsubscribe - data: {} description: Heartbeat. Server replies with `pong`. event: ping code_examples: curl: '# WebSocket; not curl-able. Use wscat: wscat -c ''wss://ws.prixe.io/crypto?api_key=YOUR_API_KEY'' then send: {"event":"subscribe","data":{"ticker":"BTC","sub_types":["SNAPSHOT"]}}' javascript: "const ws = new WebSocket('wss://ws.prixe.io/crypto?api_key=YOUR_API_KEY');\n\ \nws.onopen = () => {\n ws.send(JSON.stringify({\n event: 'subscribe',\n\ \ data: { ticker: 'BTC', sub_types: ['SNAPSHOT'] }\n }));\n};\n\nws.onmessage\ \ = (e) => {\n const msg = JSON.parse(e.data);\n if (msg.event === 'market_data')\ \ {\n console.log(msg.data.topic, msg.data.ticker, msg.data.payload);\n \ \ } else if (msg.event === 'subscription_status') {\n console.log('sub:',\ \ msg.data.status, msg.data.ticker);\n } else if (msg.event === 'error') {\n\ \ console.error(msg.data.message);\n }\n};\n\nws.onclose = (e) => console.log('closed',\ \ e.code, e.reason);" python: "import asyncio, json, websockets\n\nasync def main():\n url = 'wss://ws.prixe.io/crypto?api_key=YOUR_API_KEY'\n\ \ async with websockets.connect(url) as ws:\n await ws.send(json.dumps({\n\ \ 'event': 'subscribe',\n 'data': {'ticker': 'BTC', 'sub_types':\ \ ['SNAPSHOT']}\n }))\n async for raw in ws:\n msg\ \ = json.loads(raw)\n if msg.get('event') == 'market_data':\n \ \ d = msg['data']\n print(d['topic'], d['ticker'],\ \ d['payload'])\n\nasyncio.run(main())" connection: auth: API key in the `api_key` query parameter (URL-encoded if it contains `+`). plan_restriction: Pro+ and Master Key only. url: wss://ws.prixe.io/crypto?api_key=YOUR_API_KEY description: "Real-time crypto market-data stream. Public frame protocol matches\ \ REST `/api/crypto`: clients send `ticker` as the base symbol (e.g. `BTC`, `ETH`),\ \ and responses carry `ticker` everywhere with USD stripped. `category` is always\ \ `US_CRYPTO` and is injected server-side. **Pro+ Feature** \u2014 non-Pro+ keys\ \ are rejected with WebSocket close-code 1008." errors: - description: Connection opened without an api_key query parameter. message: 'API key required in URL: ?api_key=YOUR_KEY' status: 1008 - description: API key not recognized. message: Invalid API key status: 1008 - description: Caller's plan is not Pro+ or Master Key. message: This feature requires a Pro+ subscription. status: 1008 example_request: data: sub_types: - SNAPSHOT ticker: BTC event: subscribe example_response: data: payload: basic: ticker: BTC timestamp: '1779664805704' change: '76836.98' change_ratio: '0.0022' high: '77392.52' low: '76013.79' open: '76651.16' pre_close: '76668.85' price: '76836.98' trade_time: '1779664805704' ticker: BTC topic: snapshot event: market_data method: WebSocket name: Crypto Real-Time Streaming path: wss://ws.prixe.io/crypto server_messages: - data: plan: description: Caller's plan example: Pro+ type: string status: description: Always 'connected' example: connected type: string description: Sent on successful authentication. event: connected - data: message: description: Present only when status is 'error'. Upstream error description. nullable: true type: string status: description: subscribed | unsubscribed | error example: subscribed type: string ticker: description: Pair affected (base symbol, USD-stripped). example: BTC type: string description: Confirms a subscribe/unsubscribe action or reports a subscribe failure. event: subscription_status - data: payload: description: Decoded fields. snapshot includes basic.{ticker, timestamp}, trade_time, price, open, high, low, pre_close, change, change_ratio. example: basic: ticker: BTC timestamp: '1779664805704' change: '76836.98' change_ratio: '0.0022' high: '77392.52' low: '76013.79' open: '76651.16' pre_close: '76668.85' price: '76836.98' trade_time: '1779664805704' type: object ticker: description: Pair base symbol matching the subscribe call. example: BTC type: string topic: description: snapshot example: snapshot type: string description: A real-time push. event: market_data - data: {} description: Reply to a `ping`. event: pong - data: message: description: Error description example: This feature requires a Pro+ subscription. type: string description: Connection-level error. The server may close the connection after sending. event: error - category: WebSocket client_messages: - description: "Start receiving snapshots + L2 updates for one or more crypto tickers.\ \ The ticker(s) may be given as a top-level `tickers` array (canonical), a singular\ \ top-level `ticker`, or nested under `data` (`data.ticker` / `data.tickers`,\ \ the same shape used by /crypto and /nasdaq). Any `sub_types` field is ignored\ \ \u2014 this stream is always full L2 depth and the snapshot is delivered first\ \ automatically." event: subscribe fields: event: description: 'Literal value: `subscribe`.' example: subscribe required: true type: string tickers: description: Base ticker symbols. USD quote is implicit (`BTC`, `ETH`, etc.). `BTC-USD` form is also accepted. Alternatively pass a singular `ticker` (string) or wrap either under `data`. example: - BTC - ETH required: true type: array - description: Stop receiving updates for the listed tickers. Accepts the same ticker shapes as `subscribe` (top-level `tickers`/`ticker` or a `data` wrapper). event: unsubscribe fields: event: description: 'Literal value: `unsubscribe`.' example: unsubscribe required: true type: string tickers: description: Base ticker symbols to unsubscribe. example: - BTC required: true type: array code_examples: curl: '# WebSocket; not curl-able. Use wscat: wscat -c ''wss://ws.prixe.io/order_book?api_key=YOUR_API_KEY'' then send: {"event":"subscribe","tickers":["BTC","ETH"]}' javascript: "const ws = new WebSocket('wss://ws.prixe.io/order_book?api_key=YOUR_API_KEY');\n\ \nws.onopen = () => {\n ws.send(JSON.stringify({ event: 'subscribe', tickers:\ \ ['BTC', 'ETH'] }));\n};\n\nws.onmessage = (e) => {\n const msg = JSON.parse(e.data);\n\ \ if (msg.event === 'snapshot') {\n console.log(msg.ticker, 'snapshot',\ \ msg.bids.length, 'bids x', msg.asks.length, 'asks');\n } else if (msg.event\ \ === 'l2update') {\n for (const [side, price, size] of msg.changes) {\n\ \ console.log(msg.ticker, side, price, size === '0' ? 'REMOVE' : `size=${size}`);\n\ \ }\n } else if (msg.event === 'error') {\n console.error(msg.data?.message\ \ || msg.message);\n }\n};\n\nws.onclose = (e) => console.log('closed', e.code,\ \ e.reason);" python: "import asyncio, json, websockets\n\nasync def main():\n url = 'wss://ws.prixe.io/order_book?api_key=YOUR_API_KEY'\n\ \ async with websockets.connect(url) as ws:\n await ws.send(json.dumps({'event':\ \ 'subscribe', 'tickers': ['BTC', 'ETH']}))\n async for raw in ws:\n\ \ msg = json.loads(raw)\n if msg.get('event') == 'snapshot':\n\ \ print(msg['ticker'], 'snapshot', len(msg['bids']), 'bids x',\ \ len(msg['asks']), 'asks')\n elif msg.get('event') == 'l2update':\n\ \ for side, price, size in msg['changes']:\n \ \ action = 'REMOVE' if size == '0' else f'size={size}'\n \ \ print(msg['ticker'], side, price, action)\n\nasyncio.run(main())" connection: auth: API key in the `api_key` query parameter (URL-encoded if it contains `+`). plan_restriction: Pro+ and Master Key only. url: wss://ws.prixe.io/order_book?api_key=YOUR_API_KEY description: "Real-time Level 2 order book depth for crypto. Receive an initial\ \ full-book snapshot followed by incremental updates of every price level on both\ \ sides of the book. Tickers are base symbols (USD quote is implicit, e.g. send\ \ `BTC` not `BTC-USD`). Depth-only \u2014 no trade prints. Use this stream when\ \ you need true exchange-native order book depth; use `/crypto` for trades and\ \ top-of-book. **Pro+ Feature** \u2014 non-Pro+ keys are rejected with WebSocket\ \ close-code 1008. **Note:** the initial `snapshot` frame for a liquid book (e.g.\ \ BTC) can exceed 1 MB. Many WebSocket clients default to a 1 MB frame-size limit\ \ and will drop the connection with close-code 1009 ('message too big') when the\ \ snapshot arrives \u2014 raise your client's max frame size (e.g. to 8 MB) before\ \ subscribing." envelope_note: "Every frame on this path \u2014 both directions \u2014 is keyed\ \ by `event`, consistent with /live, /nasdaq, and /crypto. The `connected` frame\ \ (and any pre-stream auth/setup error) uses the `{ \"event\": ..., \"data\":\ \ {...} }` envelope. Market-data frames (`subscriptions`, `snapshot`, `l2update`,\ \ in-stream `error`) are top-level frames keyed by `event` with their L2 fields\ \ at the top level (no nested `data` wrapper, since each frame type carries a\ \ different shape). Always discriminate on `event`." errors: - description: Connection opened without an api_key query parameter. message: 'API key required in URL: ?api_key=YOUR_KEY' status: 1008 - description: API key not recognized. message: Invalid API key status: 1008 - description: Caller's plan is not Pro+ or Master Key. message: This feature requires a Pro+ subscription. status: 1008 - description: Could not reach the order book market-data feed. message: upstream unavailable status: 1011 method: WebSocket name: L2 Order Book Streaming path: wss://ws.prixe.io/order_book server_messages: - data: channel: description: Upstream channel (always `level2_batch`). example: level2_batch type: string plan: description: Caller's plan. example: Pro+ type: string status: description: Always 'connected'. example: connected type: string venue: description: Opaque venue identifier for this depth feed (subject to change). example: order_book_l2 type: string description: Sent on successful authentication. The ONLY market-path frame that uses the `{event, data}` envelope. envelope: event event: connected - description: 'Top-level frame (L2 fields at top level, no nested `data` wrapper). Confirmation echoing the current subscription state. Example: `{"event":"subscriptions","channels":[{"name":"level2_batch","tickers":["BTC"]}]}`.' envelope: top-level event: subscriptions fields: channels: description: Array of `{ name, tickers }` objects describing active channels. type: array event: description: 'Literal: `subscriptions`.' example: subscriptions type: string - description: 'Top-level frame (L2 fields at top level, no nested `data` wrapper). Initial full-book snapshot for a ticker, sent once per subscribe. Example: `{"event":"snapshot","ticker":"BTC","bids":[...],"asks":[...]}`.' envelope: top-level event: snapshot fields: asks: description: Asks ordered best (lowest) to worst. Each entry is `[price_string, size_string]`. example: - - '43211.00' - '0.1500' - - '43211.50' - '0.8000' type: array bids: description: Bids ordered best (highest) to worst. Each entry is `[price_string, size_string]`. example: - - '43210.50' - '0.4127' - - '43210.00' - '1.0500' type: array event: description: 'Literal: `snapshot`.' example: snapshot type: string ticker: description: Base symbol. example: BTC type: string - description: 'Top-level frame (L2 fields at top level, no nested `data` wrapper). Incremental price-level changes, batched to roughly 50ms windows. Example: `{"event":"l2update","ticker":"BTC","time":"...","changes":[["buy","43210.50","0.5"]]}`.' envelope: top-level event: l2update fields: changes: description: Array of `[side, price, size]` where `side` is `buy` or `sell`. `size="0"` means the level was removed; otherwise it's the new total resting size at that price (NOT a delta). example: - - buy - '43210.50' - '0.5000' - - sell - '43215.00' - '0' type: array event: description: 'Literal: `l2update`.' example: l2update type: string ticker: description: Base symbol. example: BTC type: string time: description: ISO 8601 timestamp of the batch. example: '2026-05-27T14:32:11.123456Z' type: string - description: 'Top-level frame (L2 fields at top level, no nested `data` wrapper). In-stream market-data error. The message is generic and brand-free; low-level provider detail is not exposed. NOTE: errors raised BEFORE the stream starts (bad API key, plan gate, rate limit, service unavailable) instead use the `{event:''error'', data:{message}}` envelope, then the socket closes.' envelope: top-level event: error fields: event: description: 'Literal: `error`.' example: error type: string message: description: Generic, brand-free error message. example: Market-data service is temporarily unavailable. Please retry. type: string - category: AI code_examples: curl: "curl -X POST https://api.prixe.io/api/news \\\n -H \"Authorization: Bearer\ \ YOUR_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"ticker\"\ : \"AAPL\", \"ai_summary\": true}'" javascript: "// Example with /api/forms\nfetch('https://api.prixe.io/api/forms',\ \ {\n method: 'POST',\n headers: {\n 'Authorization': 'Bearer YOUR_API_KEY',\n\ \ 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n \ \ ticker: 'AAPL',\n form: '10-K',\n year: '2024',\n ai_summary: true\n\ \ })\n})\n.then(response => response.json())\n.then(data => {\n // Each filing\ \ will include 'ai_title' and 'ai_summary' fields\n data.filings.data.forEach(filing\ \ => {\n console.log('AI Title:', filing.ai_title);\n console.log('AI\ \ Summary:', filing.ai_summary);\n });\n})\n.catch(error => console.error('Error:',\ \ error));" python: "import requests\n\n# Example with /api/news\nurl = \"https://api.prixe.io/api/news\"\ \nheaders = {\n \"Authorization\": \"Bearer YOUR_API_KEY\",\n \"Content-Type\"\ : \"application/json\"\n}\npayload = {\n \"ticker\": \"AAPL\",\n \"ai_summary\"\ : True\n}\n\nresponse = requests.post(url, headers=headers, json=payload)\n\ data = response.json()\n\n# Each article will include a 'summary' field\nfor\ \ article in data.get('news_data', {}).get('data', []):\n print(f\"Title:\ \ {article.get('title')}\")\n print(f\"Summary: {article.get('summary')}\"\ )" description: Optional AI-powered summarization available on supported endpoints. When enabled, uses Google Gemini to generate concise 3-4 sentence summaries of content. Available on /api/news, /api/forms (POST), and /api/board_members endpoints. errors: - description: The request was not properly formatted message: Invalid request format status: 400 - description: Invalid API key or API key not provided message: Authentication failed status: 401 - description: You have exceeded the allowed number of requests message: Rate limit exceeded status: 429 - description: An error occurred on the server or AI service is temporarily unavailable message: Internal server error status: 500 method: POST name: AI Summary notes: - AI summaries may add latency to responses - Summaries are generated using AI - Rate limits apply - the API will gracefully fall back to lighter models if needed path: /api/news, /api/forms, /api/board_members request_fields: ai_summary: default: false description: Set to true to enable AI-generated summaries in the response. Works with /api/news, /api/forms, and /api/board_members endpoints. example: true required: false type: boolean response_fields: ai_summary: description: AI-generated 3-4 sentence summary (returned in /api/forms responses) type: string ai_title: description: AI-generated title (returned in /api/forms responses only) type: string summary: description: AI-generated 3-4 sentence summary (returned in /api/news and /api/board_members responses) type: string supported_endpoints: /api/board_members: Returns an AI biographical summary in the 'summary' field for each officer found in the SEC DEF 14A proxy statement. Officers not in the proxy will not have a summary. /api/forms: Returns an AI-generated title ('ai_title') and 3-4 sentence summary ('ai_summary') for each SEC filing /api/news: Returns a 3-4 sentence summary of each news article in the 'summary' field - category: Market Data code_examples: curl: "curl -X POST https://api.prixe.io/api/news \\\n -H \"Authorization: Bearer\ \ YOUR_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"ticker\"\ : \"TSLA\"}'" javascript: "fetch('https://api.prixe.io/api/news', {\n method: 'POST',\n headers:\ \ {\n 'Authorization': 'Bearer YOUR_API_KEY',\n 'Content-Type': 'application/json'\n\ \ },\n body: JSON.stringify({\n ticker: 'TSLA'\n })\n})\n.then(response\ \ => response.json())\n.then(data => console.log(data))\n.catch(error => console.error('Error:',\ \ error));" python: "import requests\n\nurl = \"https://api.prixe.io/api/news\"\nheaders =\ \ {\n \"Authorization\": \"Bearer YOUR_API_KEY\",\n \"Content-Type\":\ \ \"application/json\"\n}\npayload = {\n \"ticker\": \"TSLA\"\n}\n\nresponse\ \ = requests.post(url, headers=headers, json=payload)\ndata = response.json()\n\ print(data)" description: "Fetches news data based on a search text. This endpoint communicates\ \ with a separate service to perform the action and retrieve news articles. \n\ \n Please note: Non cached responses can take up to 10 seconds as we are fetching\ \ the news in real time." errors: - description: The request was not properly formatted or 'ticker' is missing. message: Invalid request format status: 400 - description: Invalid API key or API key not provided or this feature requires a Pro+ subscription. message: Authentication failed status: 401 - description: You have exceeded the allowed number of requests message: Rate limit exceeded status: 429 - description: The server was unable to communicate with the tab creation service. message: Failed to communicate with external service status: 503 - description: An error occurred on the server message: Internal server error status: 500 example_request: ticker: TSLA example_response: news_data: count: 2 data: - body: The big driver for Q3 deliveries is the Sept. 30 expiration of the $7,500 U.S. tax credit, pulling forward demand. Buyers can take delivery later and still get the EV tax credit as long as they make a firm order by Sept. 30 with at least a nominal payment...... title: Tesla Deliveries Due, But This Is The Big News For TSLA Bulls url: https://www.investors.com/news/tesla-deliveries-due-fsd-v14-tsla-bulls/ - body: It seems to me that fewer and fewer people realize that Tesla (NASDAQ:TSLA) is still primarily a car manufacturer. Sales in Q2 2025 fell by 12% YoY, and CEO Elon Musk himself spoke of a few tough quarters ahead. Two months have passed, and something has changed, so suddenly the next few quarters are looking bright? I don't think so. The company is still not in a position to justify its premium valuation multiples. title: Tesla Board Prints Billions In Pay As Musk Buys $1B, And I'm Shorting The Signal url: https://seekingalpha.com/article/4826258-tesla-board-prints-billions-in-pay-as-musk-buys-1b-and-im-shorting-the-signal status: success ticker: TSLA success: true method: POST name: Fetch News path: /api/news request_fields: ai_summary: default: false description: If true, generates a 3-4 sentence AI summary for each article. example: true required: false type: boolean callback_url: description: Optional URL to which the API response will be forwarded as a webhook example: https://your-server.com/webhooks/news-callback required: false type: string end_date: description: Optional inclusive end of the news date range. YYYY-MM-DD or unix epoch seconds. example: '2024-03-01' required: false type: string limit: default: 10 description: Maximum number of articles to return (1-50). example: 10 required: false type: integer published_date: default: false description: If true, includes the published date/time for each article (ISO 8601). example: true required: false type: boolean start_date: description: Optional inclusive start of the news date range. YYYY-MM-DD or unix epoch seconds. example: '2024-01-01' required: false type: string ticker: description: The ticker to use for fetching news data. Must be a valid ticker from the SEC list. example: TSLA required: true type: string validation_source: https://www.sec.gov/files/company_tickers.json tickers: description: Optional additional tickers to include in the news search alongside 'ticker'. example: - TSLA - NVDA required: false type: array response_fields: news_data: description: The news data retrieved for the search term. fields: count: description: Number of news articles found type: integer data: description: Array of news articles items: fields: body: description: Article content/excerpt type: string published_date: description: "ISO 8601 published date/time of the article (only if\ \ published_date=true). Extracted from article metadata using best-effort\ \ methods. May not always be available or accurate \u2014 verify\ \ independently for time-sensitive use cases." example: '2026-04-04T18:27:41+00:00' type: string summary: description: AI-generated summary of the article (only if ai_summary=true) type: string title: description: The article title type: string url: description: URL to the full article type: string type: object type: array status: description: Status of the news fetch operation type: string ticker: description: The search term used type: string type: object success: description: Indicates if the request was successfully processed. type: boolean - category: SEC Filings code_examples: curl: "# Get all available forms for a ticker\ncurl -X GET \"https://api.prixe.io/api/forms?ticker=TSLA\"\ \ \\\n -H \"Authorization: Bearer YOUR_API_KEY\"\n\n# Get forms for a specific\ \ year\ncurl -X GET \"https://api.prixe.io/api/forms?ticker=TSLA&year=2024\"\ \ \\\n -H \"Authorization: Bearer YOUR_API_KEY\"" javascript: "fetch('https://api.prixe.io/api/forms?ticker=TSLA&year=2024', {\n\ \ method: 'GET',\n headers: {\n 'Authorization': 'Bearer YOUR_API_KEY'\n\ \ }\n})\n.then(response => response.json())\n.then(data => console.log(data))\n\ .catch(error => console.error('Error:', error));" python: "import requests\n\nurl = \"https://api.prixe.io/api/forms\"\nheaders\ \ = {\n \"Authorization\": \"Bearer YOUR_API_KEY\"\n}\nparams = {\n \"\ ticker\": \"TSLA\",\n \"year\": 2024\n}\n\nresponse = requests.get(url, headers=headers,\ \ params=params)\ndata = response.json()\nprint(data)" description: Get a list of available SEC form types for a stock ticker. Returns unique form types with filing counts within a specific year or all time. Only returns supported form types (see POST /api/forms for the full list). Useful for discovering what SEC filings are available before requesting specific form data. Requires Pro+ subscription. errors: '400': Invalid request - missing ticker or invalid year '401': Unauthorized - invalid API key or insufficient plan (requires Pro+) '500': Internal server error method: GET name: Available SEC Forms path: /api/forms request_fields: ticker: description: The stock ticker symbol to retrieve available forms for. example: TSLA required: true type: string year: description: 'Optional year to filter forms by filing_date (last 6 years only). If not provided, returns all available forms. Note: This filters by when the form was filed with the SEC, not the fiscal period it covers.' example: 2024 required: false type: integer response_fields: company_name: description: The full name of the company from SEC EDGAR. type: string filing_date_range: description: The date range of filings found. fields: end: description: Latest filing date (YYYY-MM-DD format) type: string start: description: Earliest filing date (YYYY-MM-DD format) type: string type: object forms: description: Array of available form types with counts items: fields: count: description: Number of filings of this form type type: integer filing_dates: description: List of filing_date values (when filed with SEC) for each filing of this form type. Length matches 'count'. items: type: string nullable: true type: array form: description: The SEC form type (e.g., '10-K', '8-K', '4') type: string report_dates: description: List of period_of_report dates (fiscal periods covered) for each filing of this form type. Length matches 'count'. For example, a 10-K filed in 2024 might have report_date 2023-12-31. items: type: string nullable: true type: array type: object type: array note: description: Explanation that the year parameter and filing_date_range filter by filing_date. Each form includes both filing_dates and report_dates. type: string success: description: Indicates if the request was successfully processed. type: boolean ticker: description: The stock ticker symbol. type: string total_filings: description: Total number of filings across all form types. type: integer total_form_types: description: Total number of unique form types found. type: integer year: description: The year for which forms were retrieved (by filing_date). Only present if year was provided. nullable: true type: integer - category: SEC Filings code_examples: curl: "# Get 10-K filings for full year (with optional AI summary)\ncurl -X POST\ \ https://api.prixe.io/api/forms \\\n -H \"Authorization: Bearer YOUR_API_KEY\"\ \ \\\n -H \"Content-Type: application/json\" \\\n -d '{\"ticker\": \"MSFT\"\ , \"form\": \"10-K\", \"year\": 2024, \"ai_summary\": true}'\n\n# Get Form 4\ \ insider trading for a specific date range\ncurl -X POST https://api.prixe.io/api/forms\ \ \\\n -H \"Authorization: Bearer YOUR_API_KEY\" \\\n -H \"Content-Type: application/json\"\ \ \\\n -d '{\"ticker\": \"AAPL\", \"form\": \"4\", \"year\": 2024, \"start_date\"\ : \"2024-07-01\", \"end_date\": \"2024-09-30\"}'" javascript: "// Get 10-K filings for full year with AI summary\nfetch('https://api.prixe.io/api/forms',\ \ {\n method: 'POST',\n headers: {\n 'Authorization': 'Bearer YOUR_API_KEY',\n\ \ 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n \ \ ticker: 'MSFT',\n form: '10-K',\n year: 2024,\n ai_summary: true\n\ \ })\n})\n.then(response => response.json())\n.then(data => console.log(data))\n\ .catch(error => console.error('Error:', error));\n\n// Get Form 4 insider trading\ \ for a specific date range\nfetch('https://api.prixe.io/api/forms', {\n method:\ \ 'POST',\n headers: {\n 'Authorization': 'Bearer YOUR_API_KEY',\n 'Content-Type':\ \ 'application/json'\n },\n body: JSON.stringify({\n ticker: 'AAPL',\n\ \ form: '4',\n year: 2024,\n start_date: '2024-07-01',\n end_date:\ \ '2024-09-30'\n })\n})\n.then(response => response.json())\n.then(data =>\ \ console.log(data));" python: "import requests\n\nurl = \"https://api.prixe.io/api/forms\"\nheaders\ \ = {\n \"Authorization\": \"Bearer YOUR_API_KEY\",\n \"Content-Type\"\ : \"application/json\"\n}\n\n# Get 10-K filings for full year with AI summary\n\ payload_annual = {\n \"ticker\": \"MSFT\",\n \"form\": \"10-K\",\n \ \ \"year\": 2024,\n \"ai_summary\": True\n}\n\n# Get Form 4 insider trading\ \ for a specific date range\npayload_date_range = {\n \"ticker\": \"AAPL\"\ ,\n \"form\": \"4\",\n \"year\": 2024,\n \"start_date\": \"2024-07-01\"\ ,\n \"end_date\": \"2024-09-30\"\n}\n\nresponse = requests.post(url, headers=headers,\ \ json=payload_annual)\ndata = response.json()\nprint(data)" description: Get SEC filing data for a stock ticker. Returns filings within a date range (last 6 years) from SEC EDGAR. Use year for full year, or specify start_date/end_date for custom ranges. Filters by filing_date (when filed with SEC). Each filing includes both filing_date and period_of_report so you can see the fiscal period covered. Requires Pro+ subscription. errors: - description: The request was not properly formatted, 'ticker', 'form', or 'year' is missing or invalid. message: Invalid request format status: 400 - description: Invalid API key, API key not provided, or this feature requires a Pro+ subscription. message: Unauthorized status: 401 - description: You have exceeded the allowed number of requests message: Rate limit exceeded status: 429 - description: An error occurred on the server message: Internal server error status: 500 method: POST name: SEC Form Data path: /api/forms request_fields: ai_summary: default: false description: If true, generates a title and 3-4 sentence AI summary for each filing. example: true required: false type: boolean end_date: description: End date for filtering filings by filing_date (YYYY-MM-DD format). Defaults to December 31st of the year if not provided. example: '2024-12-31' required: false type: string form: description: 'The SEC form type to retrieve. See ''supported_forms'' field for the complete list of supported form types. Categories include: Annual/Quarterly Reports (10-K, 10-Q), Insider Transactions (3, 4, 5), Institutional Holdings (13F-HR), Current Reports (8-K), Prospectuses (424B2-8), Tender Offers (SC TO-C/I/T), and more.' example: 10-K required: true type: string limit: default: 10 description: Maximum number of filings to return per request. Defaults to 10, maximum is 100. example: 10 required: false type: integer offset: default: 0 description: Number of filings to skip for pagination. Defaults to 0. example: 0 required: false type: integer start_date: description: Start date for filtering filings by filing_date (YYYY-MM-DD format). Defaults to January 1st of the year if not provided. example: '2024-01-01' required: false type: string ticker: description: The stock ticker symbol to retrieve SEC filings for. example: MSFT required: true type: string year: description: The year to retrieve filings for (last 6 years only). Used as default date range if start_date/end_date not provided. example: 2024 required: true type: integer response_fields: company_name: description: The full name of the company from SEC EDGAR. type: string filing_date_range: description: The date range used to filter filings by filing_date. fields: end: description: End date of the period (YYYY-MM-DD format) type: string start: description: Start date of the period (YYYY-MM-DD format) type: string type: object filings: description: SEC filings data fields: count: description: Number of filings type: integer data: description: Array of filing records items: fields: accession_number: description: SEC accession number for the filing type: string ai_summary: description: AI-generated summary (only if ai_summary=true) nullable: true type: string ai_title: description: AI-generated short title (only if ai_summary=true) nullable: true type: string attachments: description: List of attachments with document name, description, and type nullable: true type: array description: description: Description of the filing nullable: true type: string filing_date: description: Date the form was filed with SEC (ISO format). This is what the 'year' parameter filters on. type: string financials: description: For 10-K/10-Q filings, XBRL financial statements (income_statement, balance_sheet, cash_flow_statement, statement_of_equity, comprehensive_income) nullable: true type: object form: description: The SEC form type type: string holdings: description: For 13F-HR filings, array of institutional holdings nullable: true type: array items: description: For 8-K filings, the item numbers reported nullable: true type: array period_of_report: description: The fiscal period the filing covers (ISO format). For example, a 10-K filed 2024-02-15 might have period_of_report 2023-12-31. Also known as 'report_date' in some contexts. nullable: true type: string text_content: description: For text-only forms (CORRESP, 425, etc.), the extracted text content (limited to 50000 characters) nullable: true type: string text_truncated: description: True if the text_content was truncated due to length nullable: true type: boolean transactions: description: For Form 4/3/5 filings, array of insider transactions nullable: true type: array type: object type: array type: object filings_processed: description: Number of filings processed. type: integer form_type: description: The SEC form type requested. type: string pagination: description: Pagination information for the results. fields: has_more: description: Whether there are more filings available type: boolean limit: description: Maximum filings per page (default 10, max 100) type: integer offset: description: Number of filings skipped type: integer returned: description: Number of filings returned in this response type: integer total: description: Total number of filings matching the query type: integer type: object success: description: Indicates if the request was successfully processed. type: boolean ticker: description: The stock ticker symbol. type: string year: description: The year used for the query. type: integer supported_forms: - 10-K - 10-K/A - 10-Q - 10-Q/A - 13F-HR - 13F-HR/A - '144' - 144/A - '3' - 3/A - '4' - 4/A - '5' - 5/A - 424B2 - 424B3 - 424B5 - 424B7 - 424B8 - '425' - 8-A12B - 8-A12G - 8-K - 8-K/A - CORRESP - D - D/A - EFFECT - FWP - SC TO-C - SC TO-I - SC TO-I/A - SC TO-T - SC TO-T/A - SD - category: SEC Filings code_examples: curl: "# Single ticker, annual only, last 8 fiscal years\ncurl -X POST https://api.prixe.io/api/forms/financials\ \ \\\n -H \"Authorization: Bearer YOUR_API_KEY\" \\\n -H \"Content-Type: application/json\"\ \ \\\n -d '{\"ticker\": \"AAPL\", \"period\": \"annual\", \"limit\": 8}'\n\n\ # Multi-ticker (up to 10), both quarterly + annual\ncurl -X POST https://api.prixe.io/api/forms/financials\ \ \\\n -H \"Authorization: Bearer YOUR_API_KEY\" \\\n -H \"Content-Type: application/json\"\ \ \\\n -d '{\"tickers\": [\"AAPL\", \"MSFT\", \"GOOG\"], \"period\": \"both\"\ , \"limit\": 12}'" javascript: "fetch('https://api.prixe.io/api/forms/financials', {\n method: 'POST',\n\ \ headers: {\n 'Authorization': 'Bearer YOUR_API_KEY',\n 'Content-Type':\ \ 'application/json'\n },\n body: JSON.stringify({\n ticker: 'AAPL',\n\ \ period: 'annual',\n limit: 8\n })\n})\n.then(r => r.json())\n.then(data\ \ => console.log(data));" python: "import requests\n\nurl = \"https://api.prixe.io/api/forms/financials\"\ \nheaders = {\n \"Authorization\": \"Bearer YOUR_API_KEY\",\n \"Content-Type\"\ : \"application/json\"\n}\n\n# Single ticker, last 8 annual periods\nresponse\ \ = requests.post(url, headers=headers, json={\n \"ticker\": \"AAPL\",\n\ \ \"period\": \"annual\",\n \"limit\": 8\n})\nprint(response.json())\n\ \n# Multi-ticker (Pro+)\nresponse = requests.post(url, headers=headers, json={\n\ \ \"tickers\": [\"AAPL\", \"MSFT\", \"GOOG\"],\n \"period\": \"both\"\ ,\n \"limit\": 12\n})\nprint(response.json())" description: Standardized financial fundamentals for a stock ticker, sourced from SEC XBRL filings. Returns quarterly and annual time series of revenue, earnings (net income), gross profit, total assets, total debt (long-term + current portion), book value (stockholders' equity), and return on equity (computed). Accepts a single 'ticker' or a 'tickers' array (up to 10). Requires Pro+ subscription. errors: - description: Missing 'ticker'/'tickers', invalid 'period', or 'tickers' exceeds 10 entries. message: Invalid request format status: 400 - description: Invalid API key, or this endpoint requires a Pro+ subscription. message: Unauthorized status: 401 - description: You have exceeded the allowed number of requests. message: Rate limit exceeded status: 429 - description: Could not fetch SEC company facts (single-ticker requests only). Per-ticker errors in multi-ticker requests are surfaced inside 'results' with success:false. message: Upstream unavailable status: 502 - description: An error occurred on the server. message: Internal server error status: 500 method: POST name: SEC Financials path: /api/forms/financials request_fields: limit: default: 20 description: Maximum number of periods to return per period type. Defaults to 20, maximum is 40. example: 8 required: false type: integer offset: default: 0 description: Number of periods to skip for pagination. Defaults to 0. example: 0 required: false type: integer period: default: both description: 'Which period type to return: ''quarterly'', ''annual'', or ''both'' (default).' example: annual required: false type: string ticker: description: Single stock ticker. Required if 'tickers' is not provided. example: AAPL required: false type: string tickers: description: Array of stock tickers (maximum 10). Required if 'ticker' is not provided. When provided, the response uses a per-ticker 'results' array instead of returning a single ticker's payload. example: - AAPL - MSFT - GOOG required: false type: array response_fields: annual: description: Annual (fiscal year) time series. Omitted when period='quarterly'. fields: count: description: Number of periods returned in this page. type: integer data: description: Newest-first array of annual periods. items: fields: accession_number: description: SEC accession number of that filing. type: string filed: description: Filing date (YYYY-MM-DD) of the most recent filing supplying any metric for this period. type: string fiscal_period: description: '''FY'' for annual periods; ''Q1''/''Q2''/''Q3''/''Q4'' for quarterly.' type: string fiscal_year: description: Fiscal year as reported by the issuer. type: integer form: description: SEC form type of that filing (10-K, 10-Q, 10-K/A, etc.). type: string metrics: description: Standardized metrics for the period. Any metric may be null if not reported by the issuer for this period. fields: book_value: description: Stockholders' equity (book value) at period end. nullable: true type: number earnings: description: Net income (loss) for the period. nullable: true type: number gross_profit: description: Gross profit for the period. nullable: true type: number revenue: description: Total revenue / net sales for the period. nullable: true type: number roe: description: Return on equity for the period, computed as earnings / book_value (closing equity). Null when either input is missing or equity is zero. nullable: true type: number total_assets: description: Total assets at period end. nullable: true type: number total_debt: description: Sum of long-term debt plus the current portion of long-term debt and short-term borrowings, at period end. nullable: true type: number type: object period_end: description: Period end date (YYYY-MM-DD). type: string type: object type: array has_more: description: Whether there are more periods after this page. type: boolean limit: description: Page size used. type: integer offset: description: Page offset used. type: integer total: description: Total number of annual periods available. type: integer nullable: true type: object company_name: description: Issuer name from the SEC entity facts. type: string currency: description: Currency for all monetary metric values. Always 'USD' for now. type: string period: description: Echoed period filter ('quarterly', 'annual', or 'both'). type: string quarterly: description: Quarterly time series. Omitted when period='annual'. Same shape as 'annual'. nullable: true type: object results: description: Per-ticker results (multi-ticker requests only). Each entry has the same shape as a single-ticker response, plus a per-ticker 'success' flag. nullable: true type: array success: description: Indicates whether the overall request was processed successfully. type: boolean ticker: description: The stock ticker (single-ticker requests only). type: string - category: Calendars code_examples: curl: "curl -X POST https://api.prixe.io/api/dividends_calendar \\\n -H \"Authorization:\ \ Bearer YOUR_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d\ \ '{\"date\": \"2025-05-21\"}'" javascript: "fetch('https://api.prixe.io/api/dividends_calendar', {\n method:\ \ 'POST',\n headers: {'Authorization': 'Bearer YOUR_API_KEY', 'Content-Type':\ \ 'application/json'},\n body: JSON.stringify({ date: '2025-05-21' })\n}).then(r\ \ => r.json()).then(d => console.log(d.count, d.dividends));" python: "import requests\n\nr = requests.post('https://api.prixe.io/api/dividends_calendar',\n\ \ headers={'Authorization': 'Bearer YOUR_API_KEY', 'Content-Type': 'application/json'},\n\ \ json={'date': '2025-05-21'})\nprint(r.json()['count'])\nfor d in r.json()['dividends']:\n\ \ print(d['ticker'], d['dividend'], d['ex_dividend_date'])" description: 'Dividends calendar for a single day: companies whose ex-dividend date falls on the requested day, with payment/record/announcement dates and dividend amounts. Specify the day as YYYY-MM-DD (defaults to today). Historical data is available from 1988 onward; future days return upcoming ex-dividend dates. Requires Pro+ subscription.' errors: - description: Invalid 'date' format (must be YYYY-MM-DD), or a year before 1988. message: Invalid request format status: 400 - description: Invalid API key, or this endpoint requires a Pro+ subscription. message: Unauthorized status: 401 - description: You have exceeded the allowed number of requests. message: Rate limit exceeded status: 429 - description: The upstream calendar source was unreachable. Try again later. message: Failed to fetch calendar data status: 502 - description: An error occurred on the server. message: Internal server error status: 500 method: POST name: Dividends Calendar path: /api/dividends_calendar request_fields: date: description: Day to retrieve, YYYY-MM-DD (or unix epoch seconds). Defaults to today. Available from 1988 onward. example: '2025-05-21' required: false type: string response_fields: count: description: Number of dividend entries for the day. type: integer date: description: The day returned (YYYY-MM-DD). type: string dividends: description: Dividend entries (ex-dividend date = requested day). items: fields: announcement_date: description: Announcement date (YYYY-MM-DD). nullable: true type: string annual_dividend: description: Indicated annual dividend per share. nullable: true type: number company_name: description: Company name. type: string dividend: description: Dividend amount per share for this distribution. nullable: true type: number ex_dividend_date: description: Ex-dividend date (YYYY-MM-DD). type: string payment_date: description: Payment date (YYYY-MM-DD). nullable: true type: string record_date: description: Record date (YYYY-MM-DD). nullable: true type: string ticker: description: Stock ticker. nullable: true type: string type: object type: array success: description: Indicates if the request was successfully processed. type: boolean - category: Calendars code_examples: curl: "curl -X POST https://api.prixe.io/api/earnings_calendar \\\n -H \"Authorization:\ \ Bearer YOUR_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d\ \ '{\"date\": \"2025-05-21\"}'" javascript: "fetch('https://api.prixe.io/api/earnings_calendar', {\n method:\ \ 'POST',\n headers: {'Authorization': 'Bearer YOUR_API_KEY', 'Content-Type':\ \ 'application/json'},\n body: JSON.stringify({ date: '2025-05-21' })\n}).then(r\ \ => r.json()).then(d => console.log(d.count, d.earnings));" python: "import requests\n\nr = requests.post('https://api.prixe.io/api/earnings_calendar',\n\ \ headers={'Authorization': 'Bearer YOUR_API_KEY', 'Content-Type': 'application/json'},\n\ \ json={'date': '2025-05-21'})\nprint(r.json()['count'])\nfor e in r.json()['earnings']:\n\ \ print(e['ticker'], e['eps'], e['eps_forecast'], e['time'])" description: 'Earnings calendar for a single day: companies reporting earnings on the requested day, with reported/forecast EPS, surprise %, market cap, fiscal quarter, and analyst estimate count. Specify the day as YYYY-MM-DD (defaults to today). Historical data is available from ~2009 onward; future days return scheduled earnings. Requires Pro+ subscription.' errors: - description: Invalid 'date' format (must be YYYY-MM-DD), or a year before 2008. message: Invalid request format status: 400 - description: Invalid API key, or this endpoint requires a Pro+ subscription. message: Unauthorized status: 401 - description: You have exceeded the allowed number of requests. message: Rate limit exceeded status: 429 - description: The upstream calendar source was unreachable. Try again later. message: Failed to fetch calendar data status: 502 - description: An error occurred on the server. message: Internal server error status: 500 method: POST name: Earnings Calendar path: /api/earnings_calendar request_fields: date: description: Day to retrieve, YYYY-MM-DD (or unix epoch seconds). Defaults to today. Available from ~2009 onward. example: '2025-05-21' required: false type: string response_fields: count: description: Number of companies reporting on the day. type: integer date: description: The day returned (YYYY-MM-DD). type: string earnings: description: Earnings entries for the day. items: fields: company_name: description: Company name. type: string eps: description: Reported EPS (null if not yet reported). nullable: true type: number eps_forecast: description: Consensus EPS forecast. nullable: true type: number eps_surprise_pct: description: EPS surprise vs. consensus, in percent. nullable: true type: number fiscal_quarter_ending: description: Fiscal quarter the report covers (e.g. 'Mar/2025'). nullable: true type: string market_cap: description: Market capitalization (USD). nullable: true type: number num_estimates: description: Number of analyst estimates behind the forecast. nullable: true type: number ticker: description: Stock ticker. nullable: true type: string time: description: 'Reporting time: ''pre_market'', ''after_hours'', or null when not supplied.' nullable: true type: string type: object type: array success: description: Indicates if the request was successfully processed. type: boolean - category: Calendars code_examples: curl: "curl -X POST https://api.prixe.io/api/economic_calendar \\\n -H \"Authorization:\ \ Bearer YOUR_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d\ \ '{\"date\": \"2025-05-21\"}'" javascript: "fetch('https://api.prixe.io/api/economic_calendar', {\n method:\ \ 'POST',\n headers: {'Authorization': 'Bearer YOUR_API_KEY', 'Content-Type':\ \ 'application/json'},\n body: JSON.stringify({ date: '2025-05-21' })\n}).then(r\ \ => r.json()).then(d => console.log(d.count, d.events));" python: "import requests\n\nr = requests.post('https://api.prixe.io/api/economic_calendar',\n\ \ headers={'Authorization': 'Bearer YOUR_API_KEY', 'Content-Type': 'application/json'},\n\ \ json={'date': '2025-05-21'})\nprint(r.json()['count'])\nfor e in r.json()['events']:\n\ \ print(e['time_gmt'], e['country'], e['event'], e['actual'])" description: 'Economic events calendar for a single day: scheduled macroeconomic releases by country, with actual/consensus/previous readings and a plain-language description of each indicator. Specify the day as YYYY-MM-DD (defaults to today). Historical data is available from ~2009 onward. Requires Pro+ subscription.' errors: - description: Invalid 'date' format (must be YYYY-MM-DD), or a year before 2008. message: Invalid request format status: 400 - description: Invalid API key, or this endpoint requires a Pro+ subscription. message: Unauthorized status: 401 - description: You have exceeded the allowed number of requests. message: Rate limit exceeded status: 429 - description: The upstream calendar source was unreachable. Try again later. message: Failed to fetch calendar data status: 502 - description: An error occurred on the server. message: Internal server error status: 500 method: POST name: Economic Calendar path: /api/economic_calendar request_fields: date: description: Day to retrieve, YYYY-MM-DD (or unix epoch seconds). Defaults to today. Available from ~2009 onward. example: '2025-05-21' required: false type: string response_fields: count: description: Number of economic events for the day. type: integer date: description: The day returned (YYYY-MM-DD). type: string events: description: Economic events for the day. items: fields: actual: description: Actual reading (units vary by indicator; string). nullable: true type: string consensus: description: Consensus / forecast reading (string). nullable: true type: string country: description: Country the indicator pertains to. type: string description: description: Plain-language description of the indicator. nullable: true type: string event: description: Event / indicator name (e.g. 'GDP', 'Core CPI'). type: string previous: description: Previous reading (string). nullable: true type: string time_gmt: description: Release time in GMT (HH:MM), when supplied. nullable: true type: string type: object type: array success: description: Indicates if the request was successfully processed. type: boolean - category: Market Data code_examples: curl: "# Get all board members\ncurl -X POST https://api.prixe.io/api/board_members\ \ \\\n -H 'Authorization: Bearer YOUR_API_KEY' \\\n -H 'Content-Type: application/json'\ \ \\\n -d '{\"ticker\": \"TSLA\"}'\n\n# Get board members with AI biographical\ \ summaries\ncurl -X POST https://api.prixe.io/api/board_members \\\n -H 'Authorization:\ \ Bearer YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"\ ticker\": \"TSLA\", \"ai_summary\": true}'" javascript: "fetch('https://api.prixe.io/api/board_members', {\n method: 'POST',\n\ \ headers: {\n 'Authorization': 'Bearer YOUR_API_KEY',\n 'Content-Type':\ \ 'application/json'\n },\n body: JSON.stringify({\n ticker: 'TSLA',\n\ \ ai_summary: true\n })\n})\n.then(response => response.json())\n.then(data\ \ => {\n data.board_members.data.forEach(member => {\n console.log(`${member.name}\ \ - ${member.title}`);\n if (member.summary) console.log(` ${member.summary}`);\n\ \ });\n})\n.catch(error => console.error('Error:', error));" python: "import requests\n\nurl = \"https://api.prixe.io/api/board_members\"\n\ headers = {\n \"Authorization\": \"Bearer YOUR_API_KEY\",\n \"Content-Type\"\ : \"application/json\"\n}\n\n# Get all board members\npayload = {\"ticker\"\ : \"TSLA\"}\n\n# With AI biographical summaries\npayload_ai = {\"ticker\": \"\ TSLA\", \"ai_summary\": True}\n\nresponse = requests.post(url, headers=headers,\ \ json=payload_ai)\ndata = response.json()\nfor member in data['board_members']['data']:\n\ \ print(f\"{member['name']} - {member.get('title', '')}\")\n if member.get('summary'):\n\ \ print(f\" {member['summary']}\")" description: Get board members and company officers for a stock ticker. Returns all board members with their compensation data. Use ai_summary=true to generate AI biographical summaries sourced from SEC DEF 14A proxy statements. Summaries are only included for officers found in the proxy filing. Requires Pro+ subscription. errors: - description: The request was not properly formatted or 'ticker' is missing or invalid. message: Invalid request format status: 400 - description: Invalid API key, API key not provided, or this feature requires a Pro+ subscription. message: Unauthorized status: 401 - description: You have exceeded the allowed number of requests message: Rate limit exceeded status: 429 - description: An error occurred on the server message: Internal server error status: 500 method: POST name: Board Members & Company Officers path: /api/board_members request_fields: ai_summary: default: false description: If true, generates AI biographical summaries for board members found in the company's SEC DEF 14A proxy statement. Summaries cover the person's role, career history, education, and board memberships. Officers not found in the proxy filing will not have a summary field. example: true required: false type: boolean ticker: description: The stock ticker symbol to retrieve board members for. example: TSLA required: true type: string response_fields: board_members: description: Board members and company officers data fields: count: description: Number of board members/officers returned type: integer data: description: Array of board member/officer records items: fields: age: description: Age of the person nullable: true type: integer exercisedValue: description: Value of exercised stock options type: number fiscalYear: description: Fiscal year for compensation data type: integer name: description: Name of the board member/officer type: string summary: description: AI-generated biographical summary sourced from SEC DEF 14A proxy statement. Only present when ai_summary=true and the officer was found in the proxy filing. nullable: true type: string title: description: Title/position of the person (e.g., 'Chief Executive Officer', 'Director') type: string totalPay: description: Total compensation paid nullable: true type: number unexercisedValue: description: Value of unexercised stock options type: number yearBorn: description: Year the person was born nullable: true type: integer type: object type: array type: object company_name: description: The full name of the company. type: string success: description: Indicates if the request was successfully processed. type: boolean ticker: description: The stock ticker symbol. type: string - category: Market Data code_examples: curl: "curl -X POST https://api.prixe.io/api/search \\\n -H \"Authorization:\ \ Bearer YOUR_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d\ \ '{\"query\": \"Tesla\"}'" javascript: "fetch('https://api.prixe.io/api/search', {\n method: 'POST',\n \ \ headers: {\n 'Authorization': 'Bearer YOUR_API_KEY',\n 'Content-Type':\ \ 'application/json'\n },\n body: JSON.stringify({\n query: 'Tesla'\n \ \ })\n})\n.then(response => response.json())\n.then(data => console.log(data))\n\ .catch(error => console.error('Error:', error));" python: "import requests\n\nurl = \"https://api.prixe.io/api/search\"\nheaders\ \ = {\n \"Authorization\": \"Bearer YOUR_API_KEY\",\n \"Content-Type\"\ : \"application/json\"\n}\npayload = {\n \"query\": \"Tesla\"\n}\n\nresponse\ \ = requests.post(url, headers=headers, json=payload)\ndata = response.json()\n\ print(data)" description: Search for tickers, company names, or CUSIPs errors: - description: The request was not properly formatted message: Invalid request format status: 400 - description: Invalid API key or API key not provided message: Authentication failed status: 401 - description: You have exceeded the allowed number of requests message: Rate limit exceeded status: 429 - description: An error occurred on the server message: Internal server error status: 500 example_request: query: Tesla example_response: - cusip: 88160R101 industry: Motor Vehicles & Passenger Car Bodies main_category: Automotive stockName: Tesla, Inc. ticker: TSLA method: POST name: Search path: /api/search request_fields: callback_url: description: Optional URL to which the API response will be forwarded as a webhook example: https://your-server.com/webhooks/search-callback required: false type: string cik: description: Search by specific CIK number example: '884394' required: false type: string cusip: description: Search by specific CUSIP number example: 88160R101 required: false type: string query: description: General search term for stock names, tickers, etc. example: Tesla required: false type: string ticker: description: Search by specific ticker symbol example: TSLA required: false type: string response_fields: description: Array of matching securities items: fields: cik: description: The CIK identifier type: string cusip: description: The CUSIP identifier type: string industry: description: SEC SIC industry classification (e.g. 'Motor Vehicles & Passenger Car Bodies') nullable: true type: string main_category: description: High-level sector category derived from SIC code (e.g. 'Technology', 'Healthcare', 'Energy', 'Financial Services', 'Automotive') nullable: true type: string stockName: description: The name of the stock/company type: string ticker: description: The ticker symbol type: string type: object type: array - category: Market Data code_examples: curl: "curl -X POST https://api.prixe.io/api/stats \\\n -H \"Authorization: Bearer\ \ YOUR_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"data_type\"\ : \"gainers\"}'" javascript: "fetch('https://api.prixe.io/api/stats', {\n method: 'POST',\n headers:\ \ {\n 'Authorization': 'Bearer YOUR_API_KEY',\n 'Content-Type': 'application/json'\n\ \ },\n body: JSON.stringify({\n data_type: 'gainers'\n })\n})\n.then(response\ \ => response.json())\n.then(data => console.log(data))\n.catch(error => console.error('Error:',\ \ error));" python: "import requests\n\nurl = \"https://api.prixe.io/api/stats\"\nheaders\ \ = {\n \"Authorization\": \"Bearer YOUR_API_KEY\",\n \"Content-Type\"\ : \"application/json\"\n}\npayload = {\n \"data_type\": \"gainers\"\n}\n\n\ response = requests.post(url, headers=headers, json=payload)\ndata = response.json()\n\ print(data)" description: Get market statistics including top gainers, losers, most active stocks, and top mutual funds. errors: - description: The request was not properly formatted or 'data_type' is missing or invalid. message: Invalid request format status: 400 - description: Invalid API key or API key not provided. message: Authentication failed status: 401 - description: You have exceeded the allowed number of requests message: Rate limit exceeded status: 429 - description: The server was unable to retrieve market data. message: Failed to fetch market data status: 503 - description: An error occurred on the server message: Internal server error status: 500 example_request: data_type: gainers example_response: count: 25 data: - averageDailyVolume10Day: 1408700 averageDailyVolume3Month: 2023929 displayName: Beam Therapeutics longName: Beam Therapeutics Inc. marketCap: 3418690816 regularMarketChange: 33.69 regularMarketChangePercent: 22.2868 regularMarketDayHigh: 36.44 regularMarketDayLow: 29.16 regularMarketDayRange: 29.16 - 36.44 regularMarketOpen: 29.41 regularMarketPreviousClose: 27.55 regularMarketPrice: 33.69 regularMarketTime: 1768251601 regularMarketVolume: 7044582 sharesOutstanding: 101474944 shortName: Beam Therapeutics Inc. ticker: BEAM data_type: gainers success: true method: POST name: Market Statistics path: /api/stats request_fields: data_type: description: 'The type of market data to retrieve. Valid options: gainers, losers, active, mutual_funds' example: gainers required: true type: string valid_options: - gainers - losers - active - mutual_funds response_fields: count: description: Number of items returned. type: integer data: description: Array of stock/fund data items: fields: averageDailyVolume10Day: description: 10-day average daily volume type: number averageDailyVolume3Month: description: 3-month average daily volume type: number displayName: description: Display name of the company (may not be present for all items) type: string longName: description: Full company name type: string marketCap: description: Market capitalization type: number regularMarketChange: description: Price change type: number regularMarketChangePercent: description: Price change percentage type: number regularMarketDayHigh: description: Day high price type: number regularMarketDayLow: description: Day low price type: number regularMarketDayRange: description: Day price range type: string regularMarketOpen: description: Market open price type: number regularMarketPreviousClose: description: Previous close price type: number regularMarketPrice: description: Current market price type: number regularMarketTime: description: Unix timestamp of last update type: integer regularMarketVolume: description: Trading volume type: number sharesOutstanding: description: Number of shares outstanding type: number shortName: description: Short company name type: string ticker: description: Stock ticker symbol type: string type: object type: array data_type: description: The type of market data returned. type: string success: description: Indicates if the request was successfully processed. type: boolean - category: Politicians code_examples: curl: "curl -X POST https://api.prixe.io/api/politicians \\\n -H 'Authorization:\ \ Bearer YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"\ year\": 2024, \"ticker\": \"AAPL\", \"transaction_type\": \"purchase\"}'" javascript: "fetch('https://api.prixe.io/api/politicians', {\n method: 'POST',\n\ \ headers: {\n 'Authorization': 'Bearer YOUR_API_KEY',\n 'Content-Type':\ \ 'application/json'\n },\n body: JSON.stringify({ year: 2024, ticker: 'AAPL',\ \ transaction_type: 'purchase' })\n})\n.then(r => r.json())\n.then(console.log);" python: "import requests\n\nurl = 'https://api.prixe.io/api/politicians'\nheaders\ \ = {\n 'Authorization': 'Bearer YOUR_API_KEY',\n 'Content-Type': 'application/json'\n\ }\npayload = {'year': 2024, 'ticker': 'AAPL', 'transaction_type': 'purchase'}\n\ \nresponse = requests.post(url, headers=headers, json=payload)\nprint(response.json())" description: "Returns U.S. Congressional stock transactions (purchases and sales)\ \ for both the U.S. House and U.S. Senate, sourced from official Periodic Transaction\ \ Report (PTR) filings. When `chamber` is omitted, both are returned. Amounts\ \ are disclosed as ranges \u2014 the response includes the raw range string plus\ \ parsed min/max. Supports filtering by ticker, politician name, chamber, transaction\ \ type, and date range. Note: Senate paper-format PTRs (~11-13% of Senate filings)\ \ are scanned image submissions and may not be available \u2014 they contribute\ \ zero transactions. **Available on all plans.**" errors: - description: Bad year, missing JSON body, or invalid parameters. message: Invalid request format status: 400 - description: Invalid or missing API key. message: Authentication failed status: 401 - description: You have exceeded the allowed number of requests. message: Rate limit exceeded status: 429 - description: This year's data is still being prepared. Retry shortly. message: Data not ready status: 503 - description: An error occurred on the server. message: Internal server error status: 500 example_request: limit: 10 ticker: AAPL transaction_type: purchase year: 2024 example_response: count: 1 success: true total: 1 transactions: - amount_max: 15000 amount_min: 1001 amount_range: $1,001 - $15,000 asset_name: Apple Inc. asset_type: ST chamber: house filing_date: 04/01/2024 filing_doc_id: '20020938' politician: Hon. Jane Smith state_district: CA12 ticker: AAPL transaction_date: 03/15/2024 transaction_type: purchase year: 2024 method: POST name: Congressional Stock Transactions path: /api/politicians request_fields: callback_url: description: Optional URL to forward the response to as a webhook. required: false type: string chamber: description: 'Filter by chamber: ''house'' or ''senate''. When omitted, both are returned.' example: senate required: false type: string description: description: "When true, include the filer's free-text DESCRIPTION for each\ \ transaction (e.g. 'Advisor-driven quarterly rebalancing', 'Exercised 50\ \ call options...'). Off by default because descriptions can be long multi-sentence\ \ notes and most callers don't need them. Many filings have empty descriptions\ \ \u2014 the field will be null for those." example: true required: false type: boolean end_date: description: Inclusive transaction-date upper bound (YYYY-MM-DD). example: '2024-12-31' required: false type: string limit: description: Max transactions per response (default 50, max 500). example: 50 required: false type: integer offset: description: Pagination offset (default 0). example: 0 required: false type: integer politician: description: Accepts either an exact politician_slug from /api/politicians/list (e.g. 'hon_nancy_pelosi') or a case-insensitive substring of the full name (e.g. 'pelosi'). example: hon_nancy_pelosi required: false type: string start_date: description: Inclusive transaction-date lower bound (YYYY-MM-DD). example: '2024-01-01' required: false type: string state: description: 'Filter by 2-letter US state postal code (e.g. ''CA'', ''NY'', ''DC'', ''PR''). 400 on invalid codes. Case-insensitive. Note: state metadata is only available for House transactions, so applying this filter implicitly excludes all Senate rows.' example: CA required: false type: string ticker: description: Filter to a single ticker symbol. example: AAPL required: false type: string transaction_type: description: '''purchase'', ''sale'', or ''all'' (default ''all''). ''sale'' includes partial sales.' example: purchase required: false type: string year: description: 'Disclosure year (defaults to current year). Valid range: 2008 to current year.' example: 2024 required: false type: integer response_fields: chambers_missing: description: "Chambers that were requested but didn't return data \u2014 typically\ \ still scraping, locked, or temporarily unavailable. Retry shortly to pick\ \ them up." type: array chambers_requested: description: Chambers the request asked for (derived from the `chamber` filter; defaults to both house and senate when omitted). type: array chambers_returned: description: Chambers that successfully returned data for this request. type: array count: description: Number of transactions in this page. type: integer partial: description: True when the caller asked for multiple chambers but only some answered. When true, the response is a partial view; chambers_missing names the chambers to retry. type: boolean total: description: Total matching transactions across all pages. type: integer transactions: description: 'Array of transaction objects with politician, ticker, transaction_type (''purchase'' | ''sale'' | ''sale_partial'' | ''exchange''), transaction_date, amount_range, amount_min, amount_max, and filing metadata. Each object also carries a `description` field (filer''s free-text note) when the request sets `description: true`.' type: array year: description: Disclosure year covered by the response. type: integer - category: Politicians code_examples: curl: "curl -X POST https://api.prixe.io/api/politicians/list \\\n -H 'Authorization:\ \ Bearer YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"\ year\": 2024, \"chamber\": \"senate\"}'" javascript: "fetch('https://api.prixe.io/api/politicians/list', {\n method: 'POST',\n\ \ headers: {\n 'Authorization': 'Bearer YOUR_API_KEY',\n 'Content-Type':\ \ 'application/json'\n },\n body: JSON.stringify({ year: 2024, chamber: 'senate'\ \ })\n})\n.then(r => r.json())\n.then(console.log);" python: "import requests\n\nurl = 'https://api.prixe.io/api/politicians/list'\n\ headers = {\n 'Authorization': 'Bearer YOUR_API_KEY',\n 'Content-Type':\ \ 'application/json'\n}\npayload = {'year': 2024, 'chamber': 'senate'}\n\nresponse\ \ = requests.post(url, headers=headers, json=payload)\nprint(response.json())" description: Returns the set of politicians (House Representatives and U.S. Senators) that filed PTRs in the requested year, along with aggregate counts (total transactions, purchases, sales, distinct tickers traded, and midpoint notional total). Useful as an index view before drilling into /api/politicians or /api/politicians/holdings. Each row includes a `politician_slug` that can be passed back as the `politician` param on the other two endpoints for an exact match. **Available on all plans.** errors: - description: Bad year or body. message: Invalid request format status: 400 - description: Invalid or missing API key. message: Authentication failed status: 401 - description: Too many requests. message: Rate limit exceeded status: 429 - description: This year's data is still being prepared. message: Data not ready status: 503 example_request: limit: 50 year: 2024 example_response: count: 1 limit: 50 offset: 0 politicians: - chamber: house notional_midpoint: 2350000 politician: Hon. Jane Smith politician_slug: hon_jane_smith purchases: 30 sales: 12 state_district: CA12 tickers: - AAPL - MSFT - NVDA transactions: 42 success: true total: 1 year: 2024 method: POST name: Politicians List path: /api/politicians/list request_fields: callback_url: description: Optional webhook URL. required: false type: string chamber: description: 'Filter to one chamber: ''house'' or ''senate''. When omitted, both are returned.' example: senate required: false type: string limit: description: Max politicians per response (default 50, max 500). example: 50 required: false type: integer offset: description: Pagination offset (default 0). example: 0 required: false type: integer state: description: "Filter by 2-letter US state postal code (e.g. 'CA', 'NY', 'DC',\ \ 'PR'). 400 on invalid codes. Note: state metadata is only available for\ \ House politicians \u2014 applying this filter excludes all Senate rows." example: CA required: false type: string year: description: Disclosure year (default current year). Senate data is available from 2012 onward; House data from 2008. example: 2024 required: false type: integer response_fields: chambers_missing: description: "Chambers that were requested but didn't return data \u2014 retry\ \ shortly." type: array chambers_requested: description: Chambers the request asked for. type: array chambers_returned: description: Chambers that successfully returned data. type: array count: description: Number of politicians in this page. type: integer partial: description: True when only some of the requested chambers returned data. type: boolean politicians: description: Array of {politician, politician_slug, state_district, chamber, transactions, purchases, sales, tickers, notional_midpoint} sorted by transaction count desc. type: array total: description: Total politicians matching the filter across all pages. type: integer - category: Politicians code_examples: curl: "curl -X POST https://api.prixe.io/api/politicians/holdings \\\n -H 'Authorization:\ \ Bearer YOUR_API_KEY' \\\n -H 'Content-Type: application/json' \\\n -d '{\"\ politician\": \"Pelosi\", \"year\": 2024}'" javascript: "fetch('https://api.prixe.io/api/politicians/holdings', {\n method:\ \ 'POST',\n headers: {\n 'Authorization': 'Bearer YOUR_API_KEY',\n 'Content-Type':\ \ 'application/json'\n },\n body: JSON.stringify({ politician: 'Pelosi', year:\ \ 2024 })\n})\n.then(r => r.json())\n.then(console.log);" python: "import requests\n\nurl = 'https://api.prixe.io/api/politicians/holdings'\n\ headers = {\n 'Authorization': 'Bearer YOUR_API_KEY',\n 'Content-Type':\ \ 'application/json'\n}\npayload = {'politician': 'Pelosi', 'year': 2024}\n\n\ response = requests.post(url, headers=headers, json=payload)\nprint(response.json())" description: "Returns per-ticker NET DISCLOSED TRADING ACTIVITY for a specific politician\ \ (House or Senate) in the requested year/range \u2014 computed as purchases minus\ \ sales using the midpoint of each disclosed amount range. This is NOT a current\ \ portfolio balance: PTRs disclose dollar ranges and we do not ingest Annual FD\ \ asset schedules, so starting positions are unknown. Response sets `is_true_holding:\ \ false` for clarity. **Available on all plans.**" errors: - description: Missing politician filter. message: '''politician'' is required' status: 400 - description: Invalid or missing API key. message: Authentication failed status: 401 - description: Too many requests. message: Rate limit exceeded status: 429 - description: This year's data is still being prepared. message: Data not ready status: 503 example_request: limit: 50 politician: Pelosi year: 2024 example_response: activity: - asset_name: NVIDIA Corp asset_type: ST chamber: house gross_purchased_midpoint: 2750000 gross_sold_midpoint: 0 net_activity_midpoint: 2750000 politician: Hon. Nancy Pelosi politician_slug: hon_nancy_pelosi purchase_count: 2 sale_count: 0 ticker: NVDA count: 1 is_true_holding: false limit: 50 matched_politicians: - chamber: house politician: Hon. Nancy Pelosi politician_slug: hon_nancy_pelosi transaction_count: 2 note: "Values are NET DISCLOSED TRADING ACTIVITY \u2014 not a current portfolio\ \ balance." offset: 0 politician: Pelosi success: true total: 1 year: 2024 method: POST name: Politician Net Trading Activity path: /api/politicians/holdings request_fields: callback_url: description: Optional webhook URL. required: false type: string end_date: description: Transaction-date upper bound (YYYY-MM-DD). required: false type: string limit: description: Max activity rows per response (default 50, max 500). example: 50 required: false type: integer offset: description: Pagination offset (default 0). example: 0 required: false type: integer politician: description: Accepts either an exact politician_slug from /api/politicians/list (e.g. 'hon_nancy_pelosi') or a case-insensitive substring of the full name (e.g. 'pelosi'). example: hon_nancy_pelosi required: true type: string start_date: description: Transaction-date lower bound (YYYY-MM-DD). required: false type: string ticker: description: Restrict output to a single ticker. required: false type: string year: description: Disclosure year (default current year). example: 2024 required: false type: integer response_fields: activity: description: Array of {politician, politician_slug, chamber, ticker, asset_name, asset_type, purchase_count, sale_count, gross_purchased_midpoint, gross_sold_midpoint, net_activity_midpoint}. Rows are grouped by (politician_slug, ticker), so when multiple politicians matched, each person's activity stays separate. Sorted with same-politician rows adjacent and biggest |net_activity_midpoint| first within a politician. type: array chambers_missing: description: "Chambers that were requested but didn't return data \u2014 retry\ \ shortly." type: array chambers_requested: description: Chambers the request asked for (always both for /holdings since this endpoint has no chamber filter). type: array chambers_returned: description: Chambers that successfully returned data. type: array count: description: Number of activity rows in this page. type: integer is_true_holding: description: "Always false \u2014 the figures represent net disclosed activity,\ \ not portfolio balances." type: boolean matched_politicians: description: Politicians whose names matched the politician filter, with their per-person transaction count. Useful when a substring match returned more than one person (e.g. 'Scott' matches both Tim Scott and Rick Scott). Pass an exact politician_slug from this list to narrow to one person. type: array partial: description: True when only one chamber's data was available for this request. type: boolean total: description: Total activity rows matching the filter across all pages. type: integer - category: Politicians code_examples: curl: "curl -X POST https://api.prixe.io/api/politicians/executive_disclosures\ \ \\\n -H 'Authorization: Bearer YOUR_API_KEY' \\\n -H 'Content-Type: application/json'\ \ \\\n -d '{\"ticker\": \"TSLA\", \"limit\": 10}'" javascript: "fetch('https://api.prixe.io/api/politicians/executive_disclosures',\ \ {\n method: 'POST',\n headers: {\n 'Authorization': 'Bearer YOUR_API_KEY',\n\ \ 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ ticker:\ \ 'TSLA', limit: 10 })\n})\n.then(r => r.json())\n.then(console.log);" python: "import requests\n\nurl = 'https://api.prixe.io/api/politicians/executive_disclosures'\n\ headers = {\n 'Authorization': 'Bearer YOUR_API_KEY',\n 'Content-Type':\ \ 'application/json'\n}\npayload = {'ticker': 'TSLA', 'limit': 10}\n\nresponse\ \ = requests.post(url, headers=headers, json=payload)\nprint(response.json())" description: 'Returns OGE Form 278e annual public financial disclosures for senior White House personnel (cabinet officials and other agencies file separately and are out of scope). Each disclosure has up to 9 schedules: positions held, employment assets & income, employment agreements, compensation sources >$5,000, spouse''s employment assets, other assets and income, transactions, liabilities, and gifts/travel reimbursements. Each schedule row carries a parse_quality field (''ok'' / ''partial'') so callers can filter low-confidence rows. Most filings are ''New Entrant Report'' for newly-appointed staff; ''Annual'' reports surface holdings as of Dec 31. When a filing''s structure can''t be decomposed into schedules, parse_status=''layout_unsupported'' and pdf_url is returned so callers can render the original PDF directly. **Requires Pro+ subscription.**' errors: - description: Invalid or missing API key, or plan is below Pro+. message: Authentication failed status: 401 - description: Too many requests. message: Rate limit exceeded status: 429 - description: Upstream data source unreachable. Try again in a few minutes. message: Data temporarily unavailable status: 503 example_request: limit: 10 ticker: TSLA example_response: count: 1 filings: - filer_name: Adolphsen, Samuel filer_slug: adolphsen_samuel header: appointment_type: Non-Career date_of_appointment: 01/2025 filer_information: name_line: Adolphsen, Samuel position_line: Deputy Assistant to the President for Domestic Policy report_type: New Entrant Report parse_status: ok pdf_url: https://www.whitehouse.gov/wp-content/uploads/2025/06/Adolphsen-Samuel.pdf schedules: other_assets: - description: Tesla, Inc. (TSLA) eif: N/A income_amount: $1,001 - $2,500 parse_quality: ok row: '1.6' schedule: other_assets ticker: TSLA value: $1,001 - $15,000 positions: - description: The Foundation for Government Accountability Naples, Florida Non-Profit Vice President from: 8/2018 parse_quality: ok row: 1 to: 1/2025 tickers: - AAPL - MSFT - SPY - TSLA upload_year: 2025 success: true total: 1 method: POST name: Executive Branch Disclosures path: /api/politicians/executive_disclosures request_fields: callback_url: description: Optional URL to forward the response to as a webhook. required: false type: string limit: description: "Max filings per response (default 50, max 500). With no ticker\ \ / report_type filter, paginated requests are fast (a default 50-filer page\ \ returns in seconds). Adding ticker or report_type requires scanning every\ \ disclosure to find matches, which can be slow for large pages \u2014 narrow\ \ with `politician` or use a smaller `limit` to keep responses snappy." example: 50 required: false type: integer offset: description: Pagination offset (default 0). example: 0 required: false type: integer politician: description: Accepts either an exact filer_slug (e.g. 'president_donald_j_trump', 'vice_president_jd_vance', 'wiles_susie') OR a case-insensitive substring of the full filer name (e.g. 'trump', 'Vance', 'Sacks'). When set, the upstream scrape is narrowed to just the matching filer so requests don't wait on the full ~258-PDF scrape. Same matching pattern as the politician param on /api/politicians/holdings. example: president_donald_j_trump required: false type: string report_type: description: 'Filter by report type: ''Annual Report'', ''New Entrant Report'', ''Termination Report'', or ''Annual/Final Report''.' example: New Entrant Report required: false type: string ticker: description: Filter to filers who hold this ticker in any of their asset schedules. Tickers are extracted from parenthesized symbols like 'Apple Inc. (AAPL)' in the filing. example: TSLA required: false type: string response_fields: count: description: Number of filings in this page. type: integer filings: description: "Array of filing objects. Each filing includes filer_name, filer_slug,\ \ pdf_url, upload_year, parse_status ('ok' / 'layout_unsupported' / 'scanned_no_text'\ \ / 'download_failed'), header (report_type / annual_year / dates / appointment_type\ \ / filer_information), tickers (sorted unique list extracted from asset schedules),\ \ and schedules (positions, employment_assets, employment_agreements, compensation_sources,\ \ spouse_employment_assets, other_assets, transactions, liabilities, gifts_travel).\ \ Each schedule row carries `parse_quality: 'ok' | 'partial'` \u2014 'partial'\ \ means structured fields like value/amount/date weren't recovered (description\ \ is still present). Trump and Vice President annual reports surface with\ \ parse_status='layout_unsupported' \u2014 render the pdf_url directly for\ \ those." type: array total: description: Total filings matching the filter across all pages. type: integer - category: WebSocket code_examples: javascript: "// Connect to the WebSocket\nconst socket = new WebSocket('wss://ws.prixe.io/ws?api_key=YOUR_API_KEY');\n\ \n// Handle connection open\nsocket.onopen = function(e) {\n console.log('Connection\ \ established');\n \n // Subscribe to a ticker to receive updated data\n \ \ socket.send(JSON.stringify({\n 'event': 'subscribe',\n 'data': {\n \ \ 'ticker': 'AAPL'\n }\n }));\n};\n\n// Handle incoming messages\nsocket.onmessage\ \ = function(event) {\n const data = JSON.parse(event.data);\n \n // Handle\ \ different event types\n switch(data.event) {\n case 'connect_status':\n\ \ console.log('Connected with ID:', data.data.connection_id);\n break;\n\ \ case 'subscription_status':\n console.log('Subscription status:',\ \ data.data.status);\n // After successful subscription, you will receive\ \ updated data\n // Send subscribe again to get the latest price update\n\ \ if (data.data.status === 'subscribed') {\n socket.send(JSON.stringify({\n\ \ 'event': 'subscribe',\n 'data': {\n 'ticker':\ \ data.data.ticker\n }\n }));\n }\n break;\n case\ \ 'error':\n console.error('Error:', data.data.message);\n break;\n\ \ }\n};\n\n// Handle errors\nsocket.onerror = function(error) {\n console.error('WebSocket\ \ Error:', error);\n};\n\n// Handle connection close\nsocket.onclose = function(event)\ \ {\n console.log('Connection closed:', event.code, event.reason);\n};\n\n\ // To unsubscribe\nfunction unsubscribe() {\n socket.send(JSON.stringify({\n\ \ 'event': 'unsubscribe'\n }));\n}\n\n// To disconnect\nfunction disconnect()\ \ {\n socket.close();\n}" python: "import websocket\nimport json\nimport threading\nimport time\nfrom datetime\ \ import datetime\nimport ssl, certifi\n\n# Add api.prixe.io certs to trust\ \ store\n# To get certs: openssl s_client -connect api.prixe.io:443 -servername\ \ api.prixe.io -showcerts\n# get location of cert store: python3 -c \"import\ \ certifi; print(certifi.where())\"\n\n# SSL context for secure connections\n\ ssl_context = ssl.create_default_context()\nssl_context.load_verify_locations(cafile=certifi.where())\n\ \ndef get_timestamp():\n \"\"\"Get current timestamp for logging\"\"\"\n\ \ return datetime.now().strftime(\"%Y-%m-%d %H:%M:%S.%f\")[:-3]\n\n# Define\ \ WebSocket callback functions\ndef on_message(ws, message):\n print(f\"\ [{get_timestamp()}] RAW MESSAGE RECEIVED: {message}\")\n \n try:\n \ \ data = json.loads(message)\n print(f\"[{get_timestamp()}] PARSED\ \ JSON DATA: {json.dumps(data, indent=2)}\")\n \n event_type =\ \ data.get('event')\n print(f\"[{get_timestamp()}] EVENT TYPE: {event_type}\"\ )\n \n if event_type == 'connect_status':\n connection_id\ \ = data.get('data', {}).get('connection_id', 'Unknown')\n print(f\"\ [{get_timestamp()}] \u2705 CONNECTED with ID: {connection_id}\")\n elif\ \ event_type == 'subscription_status':\n status = data.get('data',\ \ {}).get('status', 'Unknown')\n ticker = data.get('data', {}).get('ticker',\ \ 'Unknown')\n print(f\"[{get_timestamp()}] \U0001F4CA SUBSCRIPTION\ \ STATUS: {status} for {ticker}\")\n # After successful subscription,\ \ send subscribe again to get updated data\n if status == 'subscribed':\n\ \ subscribe_message = {\n 'event': 'subscribe',\n\ \ 'data': {\n 'ticker': ticker\n \ \ }\n }\n ws.send(json.dumps(subscribe_message))\n\ \ print(f\"[{get_timestamp()}] \U0001F4E4 REQUESTING UPDATED\ \ DATA for {ticker}\")\n elif event_type == 'error':\n error_msg\ \ = data.get('data', {}).get('message', 'Unknown error')\n print(f\"\ [{get_timestamp()}] \u274C SERVER ERROR: {error_msg}\")\n else:\n \ \ print(f\"[{get_timestamp()}] \u2753 UNKNOWN EVENT TYPE: {event_type}\"\ )\n \n except json.JSONDecodeError as e:\n print(f\"[{get_timestamp()}]\ \ \u26A0\uFE0F JSON DECODE ERROR: {e}\")\n print(f\"[{get_timestamp()}]\ \ RAW MESSAGE WAS: {message}\")\n except Exception as e:\n print(f\"\ [{get_timestamp()}] \u26A0\uFE0F UNEXPECTED ERROR in on_message: {e}\")\n\n\ def on_error(ws, error):\n print(f\"[{get_timestamp()}] \U0001F6A8 WEBSOCKET\ \ ERROR: {error}\")\n print(f\"[{get_timestamp()}] ERROR TYPE: {type(error)}\"\ )\n\ndef on_close(ws, close_status_code, close_msg):\n print(f\"[{get_timestamp()}]\ \ \U0001F50C CONNECTION CLOSED\")\n print(f\"[{get_timestamp()}] CLOSE STATUS\ \ CODE: {close_status_code}\")\n print(f\"[{get_timestamp()}] CLOSE MESSAGE:\ \ {close_msg}\")\n\ndef on_open(ws):\n print(f\"[{get_timestamp()}] \U0001F517\ \ CONNECTION ESTABLISHED SUCCESSFULLY\")\n \n # Subscribe to a ticker\n\ \ subscribe_message = {\n 'event': 'subscribe',\n 'data': {\n\ \ 'ticker': 'AAPL'\n }\n }\n \n print(f\"[{get_timestamp()}]\ \ \U0001F4E4 SENDING SUBSCRIPTION MESSAGE: {json.dumps(subscribe_message, indent=2)}\"\ )\n \n try:\n ws.send(json.dumps(subscribe_message))\n print(f\"\ [{get_timestamp()}] \u2705 SUBSCRIPTION MESSAGE SENT SUCCESSFULLY\")\n except\ \ Exception as e:\n print(f\"[{get_timestamp()}] \u274C FAILED TO SEND\ \ SUBSCRIPTION MESSAGE: {e}\")\n\n# Connect to WebSocket\nws_url = \"wss://ws.prixe.io/ws?api_key=YOUR_API_KEY\"\ \n\nprint(f\"[{get_timestamp()}] \U0001F680 STARTING WEBSOCKET CLIENT\")\nprint(f\"\ [{get_timestamp()}] \U0001F310 CONNECTING TO: {ws_url}\")\n\nws = websocket.WebSocketApp(ws_url,\n\ \ on_open=on_open,\n on_message=on_message,\n\ \ on_error=on_error,\n on_close=on_close)\n\ \nprint(f\"[{get_timestamp()}] \U0001F4CB WEBSOCKET APP CREATED SUCCESSFULLY\"\ )\n\n# Start WebSocket connection in a separate thread\nprint(f\"[{get_timestamp()}]\ \ \U0001F9F5 STARTING WEBSOCKET THREAD\")\nwst = threading.Thread(target=lambda:\ \ ws.run_forever(sslopt={\"context\": ssl_context}))\nwst.daemon = True\nwst.start()\n\ \nprint(f\"[{get_timestamp()}] \u2705 WEBSOCKET THREAD STARTED\")\nprint(f\"\ [{get_timestamp()}] \U0001F504 ENTERING MAIN LOOP (Press Ctrl+C to exit)\")\n\ \n# Keep the main thread running\ncounter = 0\ntry:\n while True:\n \ \ time.sleep(5) # Heartbeat every 5 seconds\n counter += 1\n \ \ print(f\"[{get_timestamp()}] \U0001F493 HEARTBEAT #{counter} - WebSocket\ \ thread alive: {wst.is_alive()}\")\nexcept KeyboardInterrupt:\n print(f\"\ [{get_timestamp()}] \U0001F6D1 KEYBOARD INTERRUPT RECEIVED\")\n print(f\"\ [{get_timestamp()}] \U0001F4E4 SENDING UNSUBSCRIBE MESSAGE\")\n \n # To\ \ unsubscribe before disconnecting\n try:\n unsubscribe_message =\ \ {'event': 'unsubscribe'}\n ws.send(json.dumps(unsubscribe_message))\n\ \ print(f\"[{get_timestamp()}] \u2705 UNSUBSCRIBE MESSAGE SENT: {json.dumps(unsubscribe_message)}\"\ )\n except Exception as e:\n print(f\"[{get_timestamp()}] \u274C FAILED\ \ TO SEND UNSUBSCRIBE MESSAGE: {e}\")\n \n # Close the connection\n \ \ try:\n print(f\"[{get_timestamp()}] \U0001F50C CLOSING WEBSOCKET CONNECTION\"\ )\n ws.close()\n print(f\"[{get_timestamp()}] \u2705 WEBSOCKET\ \ CONNECTION CLOSED\")\n except Exception as e:\n print(f\"[{get_timestamp()}]\ \ \u274C ERROR CLOSING WEBSOCKET: {e}\")\n \n print(f\"[{get_timestamp()}]\ \ \U0001F44B WEBSOCKET CLIENT TERMINATED\")" connection: description: Connect to this WebSocket URL with your API key as a query parameter. Alternative path /live is also supported. url: wss://ws.prixe.io/ws?api_key=YOUR_API_KEY description: WebSocket connection for receiving real-time price updates for a specified stock ticker events: client_to_server: - data: ticker: description: The stock ticker symbol to subscribe to (e.g., AAPL, MSFT) example: AAPL required: true type: string description: Subscribe to real-time updates for a ticker. You must send a subscribe message each time you want updated data for the ticker. name: subscribe - data: null description: Unsubscribe from the current ticker updates name: unsubscribe server_to_client: - data: connection_id: description: Unique identifier for this connection example: abcd1234 type: string status: description: Connection status example: connected type: string description: Sent when a connection is established name: connect_status - data: status: description: Subscription status example: subscribed type: string ticker: description: The ticker symbol that was subscribed to example: AAPL type: string description: Sent in response to subscribe/unsubscribe events name: subscription_status - data: message: description: Error message example: 'Error fetching price data: Connection timeout' type: string description: Sent when an error occurs name: error method: WEBSOCKET name: Live Price Data (WebSocket) path: wss://ws.prixe.io/ws - category: Stock Prices code_examples: curl: "curl -X POST https://api.prixe.io/api/last_sold \\\n -H \"Authorization:\ \ Bearer YOUR_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d\ \ '{\"ticker\": \"TSLA\"}'" javascript: "fetch('https://api.prixe.io/api/last_sold', {\n method: 'POST',\n\ \ headers: {\n 'Authorization': 'Bearer YOUR_API_KEY',\n 'Content-Type':\ \ 'application/json'\n },\n body: JSON.stringify({\n ticker: 'TSLA'\n \ \ })\n})\n.then(response => response.json())\n.then(data => console.log(data))\n\ .catch(error => console.error('Error:', error));" python: "import requests\n\nurl = \"https://api.prixe.io/api/last_sold\"\nheaders\ \ = {\n \"Authorization\": \"Bearer YOUR_API_KEY\",\n \"Content-Type\"\ : \"application/json\"\n}\npayload = {\n \"ticker\": \"TSLA\"\n}\n\nresponse\ \ = requests.post(url, headers=headers, json=payload)\ndata = response.json()\n\ print(data)" description: Get the last sold price data for a specified stock ticker including bid/ask prices, volume, and other market data errors: - description: The ticker parameter is missing from the request message: 'Missing required parameter: ticker' status: 400 - description: Invalid API key or API key not provided message: Authentication failed status: 401 - description: You have exceeded the allowed number of requests message: Rate limit exceeded status: 429 - description: An error occurred on the server message: Internal server error status: 500 example_request: ticker: TSLA example_response: lastSalePrice: $58.79 lastTradeTimestamp: Jul 10, 2025 6:48 PM ET ticker: W method: POST name: Last Sold Price path: /api/last_sold request_fields: callback_url: description: Optional URL to which the API response will be forwarded as a webhook example: https://your-server.com/webhooks/price-callback required: false type: string ticker: description: The stock ticker symbol (e.g., AAPL, MSFT, GOOGL) example: W required: true type: string response_fields: lastSalePrice: description: Price of the last executed trade with currency symbol type: string lastTradeTimestamp: description: Timestamp of the last trade type: string ticker: description: Stock ticker symbol type: string - category: Market Data code_examples: curl: "curl -X POST https://api.prixe.io/api/sip/bars \\\n -H \"Authorization:\ \ Bearer YOUR_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d\ \ '{\"ticker\": \"AAPL\", \"timeframe\": \"1Day\", \"start_date\": \"2024-01-02\"\ , \"end_date\": \"2024-01-05\"}'" javascript: "fetch('https://api.prixe.io/api/sip/bars', {\n method: 'POST',\n\ \ headers: {\n 'Authorization': 'Bearer YOUR_API_KEY',\n 'Content-Type':\ \ 'application/json'\n },\n body: JSON.stringify({ ticker: 'AAPL', timeframe:\ \ '1Day', start_date: '2024-01-02', end_date: '2024-01-05' })\n})\n.then(r =>\ \ r.json())\n.then(data => console.log(data));" python: "import requests\n\nurl = \"https://api.prixe.io/api/sip/bars\"\nheaders\ \ = {\n \"Authorization\": \"Bearer YOUR_API_KEY\",\n \"Content-Type\"\ : \"application/json\"\n}\npayload = {\"ticker\": \"AAPL\", \"timeframe\": \"\ 1Day\", \"start_date\": \"2024-01-02\", \"end_date\": \"2024-01-05\"}\n\nresponse\ \ = requests.post(url, headers=headers, json=payload)\nprint(response.json())" description: 'OHLCV price bars for one or many tickers. The `/api/iex/*` path returns real-time IEX data; the `/api/sip/*` path returns the full consolidated tape (all U.S. exchanges) with volume-weighted average price and trade counts. Set `latest: true` for just the most recent bar per ticker. **Pro+ Feature**: requires a Pro+ subscription.' errors: - description: ticker/tickers missing, or an invalid timeframe/adjustment/date message: Missing or invalid parameter status: 400 - description: Invalid API key, or plan below Pro+ message: Authentication failed status: 401 - description: You have exceeded the allowed number of requests message: Rate limit exceeded status: 429 - description: The market-data provider could not be reached message: Upstream unavailable status: 502 example_request: end_date: '2024-01-05' start_date: '2024-01-02' ticker: AAPL timeframe: 1Day example_response: bars: AAPL: - close: 185.55 high: 188.34 low: 183.9 open: 187.17 timestamp: '2024-01-02T05:00:00Z' trade_count: 18557 volume: 1795262 vwap: 185.842446 next_page_token: null method: POST name: Historical & Latest Bars (IEX / SIP) path: /api/iex/bars, /api/sip/bars request_fields: adjustment: default: raw description: 'Corporate-action adjustment: raw, split, dividend, or all.' example: split required: false type: string end_date: description: Inclusive range end. YYYY-MM-DD or unix epoch seconds. example: '2024-03-01' required: false type: string latest: default: false description: If true, return only the most recent bar per ticker (ignores the date range). example: false required: false type: boolean limit: default: 1000 description: Max bars to return (1-10000). example: 100 required: false type: integer sort: default: asc description: asc or desc by time. example: desc required: false type: string start_date: description: Inclusive range start. YYYY-MM-DD or unix epoch seconds. example: '2024-01-01' required: false type: string ticker: description: Stock ticker symbol example: AAPL required: Required if 'tickers' not provided type: string tickers: description: Multiple ticker symbols example: - AAPL - MSFT required: Required if 'ticker' not provided type: array timeframe: default: 1Day description: 'Bar size: 1Min, 5Min, 15Min, 30Min, 1Hour, 1Day, 1Week, 1Month (and similar multiples).' example: 1Day required: false type: string response_fields: bars: description: Map of ticker to its list of bars (or a single bar when latest=true). fields: close: description: Close price type: number high: description: High price type: number low: description: Low price type: number open: description: Open price type: number timestamp: description: Bar start time (RFC-3339 / ISO 8601, UTC) type: string trade_count: description: Number of trades in the bar type: number volume: description: Total volume type: number vwap: description: Volume-weighted average price type: number type: object next_page_token: description: Cursor for the next page, or null when complete. Pass it back as page_token. type: string - category: Market Data code_examples: curl: "curl -X POST https://api.prixe.io/api/sip/quotes \\\n -H \"Authorization:\ \ Bearer YOUR_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d\ \ '{\"ticker\": \"AAPL\", \"latest\": true}'" javascript: "fetch('https://api.prixe.io/api/sip/quotes', {\n method: 'POST',\n\ \ headers: {\n 'Authorization': 'Bearer YOUR_API_KEY',\n 'Content-Type':\ \ 'application/json'\n },\n body: JSON.stringify({ ticker: 'AAPL', latest:\ \ true })\n})\n.then(r => r.json())\n.then(data => console.log(data));" python: "import requests\n\nurl = \"https://api.prixe.io/api/sip/quotes\"\nheaders\ \ = {\n \"Authorization\": \"Bearer YOUR_API_KEY\",\n \"Content-Type\"\ : \"application/json\"\n}\npayload = {\"ticker\": \"AAPL\", \"latest\": True}\n\ \nresponse = requests.post(url, headers=headers, json=payload)\nprint(response.json())" description: 'Best bid/ask (NBBO) quotes for one or many tickers. `/api/iex/*` = real-time IEX; `/api/sip/*` = full consolidated tape. Set `latest: true` for the most recent quote per ticker. **Pro+ Feature**: requires a Pro+ subscription.' errors: - description: ticker/tickers missing, or an invalid sort/date message: Missing or invalid parameter status: 400 - description: Invalid API key, or plan below Pro+ message: Authentication failed status: 401 - description: You have exceeded the allowed number of requests message: Rate limit exceeded status: 429 - description: The market-data provider could not be reached message: Upstream unavailable status: 502 example_request: latest: true ticker: AAPL example_response: quotes: AAPL: ask_exchange: V ask_price: 181.5 ask_size: 2 bid_exchange: V bid_price: 181.48 bid_size: 5 conditions: - R tape: C timestamp: '2024-01-05T20:59:59Z' method: POST name: Historical & Latest Quotes (IEX / SIP) path: /api/iex/quotes, /api/sip/quotes request_fields: end_date: description: Inclusive range end. YYYY-MM-DD or unix epoch seconds. example: '2024-01-03' required: false type: string latest: default: false description: If true, return only the most recent quote per ticker. required: false type: boolean limit: default: 1000 description: Max quotes to return (1-10000). example: 100 required: false type: integer sort: default: asc description: asc or desc by time. required: false type: string start_date: description: Inclusive range start. YYYY-MM-DD or unix epoch seconds. example: '2024-01-02' required: false type: string ticker: description: Stock ticker symbol example: AAPL required: Required if 'tickers' not provided type: string tickers: description: Multiple ticker symbols example: - AAPL - MSFT required: Required if 'ticker' not provided type: array response_fields: next_page_token: description: Cursor for the next page, or null when complete. type: string quotes: description: Map of ticker to its list of quotes (or a single quote when latest=true). fields: ask_exchange: description: Ask exchange code type: string ask_price: description: Ask (offer) price type: number ask_size: description: Ask size type: number bid_exchange: description: Bid exchange code type: string bid_price: description: Bid price type: number bid_size: description: Bid size type: number conditions: description: Quote condition codes type: array tape: description: Tape (A/B/C) type: string timestamp: description: Quote time (RFC-3339, UTC) type: string type: object - category: Market Data code_examples: curl: "curl -X POST https://api.prixe.io/api/sip/trades \\\n -H \"Authorization:\ \ Bearer YOUR_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d\ \ '{\"ticker\": \"AAPL\", \"latest\": true}'" javascript: "fetch('https://api.prixe.io/api/sip/trades', {\n method: 'POST',\n\ \ headers: {\n 'Authorization': 'Bearer YOUR_API_KEY',\n 'Content-Type':\ \ 'application/json'\n },\n body: JSON.stringify({ ticker: 'AAPL', latest:\ \ true })\n})\n.then(r => r.json())\n.then(data => console.log(data));" python: "import requests\n\nurl = \"https://api.prixe.io/api/sip/trades\"\nheaders\ \ = {\n \"Authorization\": \"Bearer YOUR_API_KEY\",\n \"Content-Type\"\ : \"application/json\"\n}\npayload = {\"ticker\": \"AAPL\", \"latest\": True}\n\ \nresponse = requests.post(url, headers=headers, json=payload)\nprint(response.json())" description: 'Individual trade prints (time & sales) for one or many tickers. `/api/iex/*` = real-time IEX; `/api/sip/*` = full consolidated tape. Set `latest: true` for the most recent trade per ticker. **Pro+ Feature**: requires a Pro+ subscription.' errors: - description: ticker/tickers missing, or an invalid sort/date message: Missing or invalid parameter status: 400 - description: Invalid API key, or plan below Pro+ message: Authentication failed status: 401 - description: You have exceeded the allowed number of requests message: Rate limit exceeded status: 429 - description: The market-data provider could not be reached message: Upstream unavailable status: 502 example_request: latest: true ticker: AAPL example_response: trades: AAPL: conditions: - '@' exchange: V price: 181.18 size: 100 tape: C timestamp: '2024-01-05T20:59:59Z' trade_id: 12727 method: POST name: Historical & Latest Trades (IEX / SIP) path: /api/iex/trades, /api/sip/trades request_fields: end_date: description: Inclusive range end. YYYY-MM-DD or unix epoch seconds. example: '2024-01-03' required: false type: string latest: default: false description: If true, return only the most recent trade per ticker. required: false type: boolean limit: default: 1000 description: Max trades to return (1-10000). example: 100 required: false type: integer sort: default: asc description: asc or desc by time. required: false type: string start_date: description: Inclusive range start. YYYY-MM-DD or unix epoch seconds. example: '2024-01-02' required: false type: string ticker: description: Stock ticker symbol example: AAPL required: Required if 'tickers' not provided type: string tickers: description: Multiple ticker symbols example: - AAPL - MSFT required: Required if 'ticker' not provided type: array response_fields: next_page_token: description: Cursor for the next page, or null when complete. type: string trades: description: Map of ticker to its list of trades (or a single trade when latest=true). fields: conditions: description: Trade condition codes type: array exchange: description: Exchange code type: string price: description: Trade price type: number size: description: Trade size (shares) type: number tape: description: Tape (A/B/C) type: string timestamp: description: Trade time (RFC-3339, UTC) type: string trade_id: description: Exchange trade ID type: number type: object - category: Market Data code_examples: curl: "curl -X POST https://api.prixe.io/api/sip/snapshot \\\n -H \"Authorization:\ \ Bearer YOUR_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d\ \ '{\"tickers\": [\"AAPL\", \"MSFT\"]}'" javascript: "fetch('https://api.prixe.io/api/sip/snapshot', {\n method: 'POST',\n\ \ headers: {\n 'Authorization': 'Bearer YOUR_API_KEY',\n 'Content-Type':\ \ 'application/json'\n },\n body: JSON.stringify({ tickers: ['AAPL', 'MSFT']\ \ })\n})\n.then(r => r.json())\n.then(data => console.log(data));" python: "import requests\n\nurl = \"https://api.prixe.io/api/sip/snapshot\"\n\ headers = {\n \"Authorization\": \"Bearer YOUR_API_KEY\",\n \"Content-Type\"\ : \"application/json\"\n}\npayload = {\"tickers\": [\"AAPL\", \"MSFT\"]}\n\n\ response = requests.post(url, headers=headers, json=payload)\nprint(response.json())" description: 'A consolidated snapshot per ticker: the latest trade, latest quote, the current minute bar, the current daily bar, and the previous daily bar. `/api/iex/*` = real-time IEX; `/api/sip/*` = full consolidated tape. **Pro+ Feature**: requires a Pro+ subscription.' errors: - description: ticker or tickers is required message: Missing parameter status: 400 - description: Invalid API key, or plan below Pro+ message: Authentication failed status: 401 - description: You have exceeded the allowed number of requests message: Rate limit exceeded status: 429 - description: The market-data provider could not be reached message: Upstream unavailable status: 502 example_request: tickers: - AAPL - MSFT example_response: snapshots: AAPL: daily_bar: close: 181.18 high: 182.76 low: 180.17 open: 181.99 timestamp: '2024-01-05T05:00:00Z' volume: 62303000 latest_quote: ask_price: 181.5 ask_size: 2 bid_price: 181.48 bid_size: 5 conditions: - R tape: C timestamp: '2024-01-05T20:59:59Z' latest_trade: conditions: - '@' exchange: V price: 181.18 size: 100 tape: C timestamp: '2024-01-05T20:59:59Z' trade_id: 12727 minute_bar: close: 181.5 high: 181.55 low: 181.48 open: 181.5 timestamp: '2024-01-05T20:59:00Z' volume: 12345 previous_daily_bar: close: 181.91 high: 183.0875 low: 180.88 open: 182.15 timestamp: '2024-01-04T05:00:00Z' volume: 71983600 method: POST name: Snapshot (IEX / SIP) path: /api/iex/snapshot, /api/sip/snapshot request_fields: ticker: description: Stock ticker symbol example: AAPL required: Required if 'tickers' not provided type: string tickers: description: Multiple ticker symbols example: - AAPL - MSFT required: Required if 'ticker' not provided type: array response_fields: snapshots: description: Map of ticker to its snapshot. fields: daily_bar: description: Current day OHLCV bar type: object latest_quote: description: Most recent quote (timestamp, ask_price/size/exchange, bid_price/size/exchange, conditions, tape) type: object latest_trade: description: Most recent trade (timestamp, price, size, exchange, conditions, trade_id, tape) type: object minute_bar: description: Current minute OHLCV bar type: object previous_daily_bar: description: Previous day OHLCV bar type: object type: object - category: Market Data code_examples: curl: "curl -G https://api.prixe.io/api/sip/movers \\\n -H \"Authorization: Bearer\ \ YOUR_API_KEY\" \\\n --data-urlencode \"top=5\"" javascript: "fetch('https://api.prixe.io/api/sip/movers?top=5', {\n headers:\ \ { 'Authorization': 'Bearer YOUR_API_KEY' }\n})\n.then(r => r.json())\n.then(data\ \ => console.log(data));" python: 'import requests url = "https://api.prixe.io/api/sip/movers" headers = {"Authorization": "Bearer YOUR_API_KEY"} response = requests.get(url, headers=headers, params={"top": 5}) print(response.json())' description: 'Top gaining and losing stocks for the current session, ranked by percent change (computed from the full consolidated tape). **Pro+ Feature**: requires a Pro+ subscription.' errors: - description: Invalid API key, or plan below Pro+ message: Authentication failed status: 401 - description: You have exceeded the allowed number of requests message: Rate limit exceeded status: 429 - description: The market-data provider could not be reached message: Upstream unavailable status: 502 example_request: top: 5 example_response: gainers: - change: 0.83 percent_change: 16.76 price: 8.88 ticker: AZUL last_updated: '2024-02-28T15:30:00Z' losers: - change: -1.0 percent_change: -5.0 price: 19.0 ticker: XYZ market_type: stocks method: GET name: Market Movers path: /api/sip/movers request_fields: top: default: 10 description: Number of gainers and losers to return, each (1-50). example: 10 required: false type: integer response_fields: gainers: description: Top gainers. fields: change: description: Absolute price change type: number percent_change: description: Percent change for the session type: number price: description: Latest price type: number ticker: description: Stock ticker type: string type: array last_updated: description: When the screen was last computed (RFC-3339, UTC) type: string losers: description: Top losers (same fields as gainers). type: array market_type: description: Always 'stocks' type: string - category: Market Data code_examples: curl: "curl -G https://api.prixe.io/api/sip/most_actives \\\n -H \"Authorization:\ \ Bearer YOUR_API_KEY\" \\\n --data-urlencode \"by=volume\" \\\n --data-urlencode\ \ \"top=5\"" javascript: "fetch('https://api.prixe.io/api/sip/most_actives?by=volume&top=5',\ \ {\n headers: { 'Authorization': 'Bearer YOUR_API_KEY' }\n})\n.then(r => r.json())\n\ .then(data => console.log(data));" python: 'import requests url = "https://api.prixe.io/api/sip/most_actives" headers = {"Authorization": "Bearer YOUR_API_KEY"} response = requests.get(url, headers=headers, params={"by": "volume", "top": 5}) print(response.json())' description: 'The most active stocks for the current session, ranked by volume or trade count (from the full consolidated tape). **Pro+ Feature**: requires a Pro+ subscription.' errors: - description: by must be volume or trades message: Invalid parameter status: 400 - description: Invalid API key, or plan below Pro+ message: Authentication failed status: 401 - description: You have exceeded the allowed number of requests message: Rate limit exceeded status: 429 - description: The market-data provider could not be reached message: Upstream unavailable status: 502 example_request: by: volume top: 5 example_response: last_updated: '2024-02-28T15:30:00Z' most_actives: - ticker: SOAR trade_count: 790750 volume: 638529492 method: GET name: Most Active Stocks path: /api/sip/most_actives request_fields: by: default: volume description: 'Ranking metric: volume or trades.' example: volume required: false type: string top: default: 10 description: Number of stocks to return (1-100). example: 10 required: false type: integer response_fields: last_updated: description: When the screen was last computed (RFC-3339, UTC) type: string most_actives: description: The most active stocks. fields: ticker: description: Stock ticker type: string trade_count: description: Number of trades type: number volume: description: Session volume type: number type: array - category: Market Data code_examples: curl: "curl -X POST https://api.prixe.io/api/corporate_actions \\\n -H \"Authorization:\ \ Bearer YOUR_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d\ \ '{\"ticker\": \"AAPL\", \"types\": [\"cash_dividend\"], \"start_date\": \"\ 2024-01-01\", \"end_date\": \"2024-06-01\"}'" javascript: "fetch('https://api.prixe.io/api/corporate_actions', {\n method:\ \ 'POST',\n headers: {\n 'Authorization': 'Bearer YOUR_API_KEY',\n 'Content-Type':\ \ 'application/json'\n },\n body: JSON.stringify({ ticker: 'AAPL', types:\ \ ['cash_dividend'], start_date: '2024-01-01', end_date: '2024-06-01' })\n})\n\ .then(r => r.json())\n.then(data => console.log(data));" python: "import requests\n\nurl = \"https://api.prixe.io/api/corporate_actions\"\ \nheaders = {\n \"Authorization\": \"Bearer YOUR_API_KEY\",\n \"Content-Type\"\ : \"application/json\"\n}\npayload = {\"ticker\": \"AAPL\", \"types\": [\"cash_dividend\"\ ], \"start_date\": \"2024-01-01\", \"end_date\": \"2024-06-01\"}\n\nresponse\ \ = requests.post(url, headers=headers, json=payload)\nprint(response.json())" description: 'Corporate action events for one or many tickers: cash dividends, forward and reverse splits, spin-offs, mergers, and more. Defaults to the trailing year when no date range is given. **Pro+ Feature**: requires a Pro+ subscription.' errors: - description: ticker/tickers missing, an unknown type, or an invalid date message: Missing or invalid parameter status: 400 - description: Invalid API key, or plan below Pro+ message: Authentication failed status: 401 - description: You have exceeded the allowed number of requests message: Rate limit exceeded status: 429 - description: The market-data provider could not be reached message: Upstream unavailable status: 502 example_request: end_date: '2024-06-01' start_date: '2024-01-01' ticker: AAPL types: - cash_dividend example_response: corporate_actions: cash_dividends: - cusip: 037833100 ex_date: '2024-02-09' foreign: false payable_date: '2024-02-15' process_date: '2024-02-15' rate: 0.24 record_date: '2024-02-12' special: false ticker: AAPL next_page_token: null method: POST name: Corporate Actions path: /api/corporate_actions request_fields: end_date: default: today description: Inclusive range end. YYYY-MM-DD or unix epoch seconds. example: '2024-06-01' required: false type: string limit: default: 100 description: Max events to return (1-1000). example: 100 required: false type: integer sort: default: desc description: asc or desc by date. required: false type: string start_date: default: 1 year ago description: Inclusive range start. YYYY-MM-DD or unix epoch seconds. example: '2024-01-01' required: false type: string ticker: description: Stock ticker symbol example: AAPL required: Required if 'tickers' not provided type: string tickers: description: Multiple ticker symbols example: - AAPL - NVDA required: Required if 'ticker' not provided type: array types: description: Filter to specific action types (e.g. cash_dividend, forward_split, reverse_split, spin_off, stock_merger, cash_merger, name_change). Omit for all types. example: - cash_dividend - forward_split required: false type: array response_fields: corporate_actions: description: Events grouped by action type (plural keys), e.g. cash_dividends, forward_splits, reverse_splits, spin_offs. fields: cash_dividends: description: 'Each: ticker, cusip, rate, special, foreign, ex_date, record_date, payable_date, process_date' type: array forward_splits: description: 'Each: ticker, cusip, new_rate, old_rate, ex_date, record_date, payable_date, process_date' type: array reverse_splits: description: 'Each: ticker, old_cusip, new_cusip, new_rate, old_rate, ex_date, record_date, payable_date, process_date' type: array spin_offs: description: 'Each: source_ticker, new_ticker, source_rate, new_rate, ex_date, process_date' type: array type: object next_page_token: description: Cursor for the next page, or null when complete. type: string - category: Market Data code_examples: curl: "curl -X POST https://api.prixe.io/api/options \\\n -H \"Authorization:\ \ Bearer YOUR_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d\ \ '{\"type\": \"chain\", \"ticker\": \"AAPL\", \"option_type\": \"call\", \"\ expiration_date\": \"2024-12-20\"}'" javascript: "fetch('https://api.prixe.io/api/options', {\n method: 'POST',\n\ \ headers: {\n 'Authorization': 'Bearer YOUR_API_KEY',\n 'Content-Type':\ \ 'application/json'\n },\n body: JSON.stringify({ type: 'chain', ticker:\ \ 'AAPL', option_type: 'call', expiration_date: '2024-12-20' })\n})\n.then(r\ \ => r.json())\n.then(data => console.log(data));" python: "import requests\n\nurl = \"https://api.prixe.io/api/options\"\nheaders\ \ = {\n \"Authorization\": \"Bearer YOUR_API_KEY\",\n \"Content-Type\"\ : \"application/json\"\n}\npayload = {\"type\": \"chain\", \"ticker\": \"AAPL\"\ , \"option_type\": \"call\", \"expiration_date\": \"2024-12-20\"}\n\nresponse\ \ = requests.post(url, headers=headers, json=payload)\nprint(response.json())" description: 'Options market data. The default `type: "chain"` returns the option chain for an underlying ticker (each contract''s latest trade & quote, greeks, and implied volatility). Use `type: "bars"`, `type: "trades"`, or `type: "quotes"` with `tickers` set to specific OCC contract symbols (e.g. AAPL241220C00300000). **Pro+ Feature**: requires a Pro+ subscription.' errors: - description: Missing ticker (chain) or tickers (bars/trades/quotes), or an invalid type/date message: Missing or invalid parameter status: 400 - description: Invalid API key, or plan below Pro+ message: Authentication failed status: 401 - description: You have exceeded the allowed number of requests message: Rate limit exceeded status: 429 - description: The market-data provider could not be reached message: Upstream unavailable status: 502 example_request: expiration_date: '2024-12-20' option_type: call ticker: AAPL type: chain example_response: next_page_token: null snapshots: AAPL241220C00300000: greeks: delta: 0.21 gamma: 0.01 rho: 0.04 theta: -0.03 vega: 0.12 implied_volatility: 0.28 latest_quote: ask_price: 1.3 ask_size: 50 bid_price: 1.2 bid_size: 40 timestamp: '2024-06-01T20:00:00Z' latest_trade: price: 1.25 size: 10 timestamp: '2024-06-01T20:00:00Z' method: POST name: Options path: /api/options request_fields: end_date: description: Range end for bars/trades. YYYY-MM-DD or unix epoch seconds. required: false type: string expiration_date: description: Chain filter (YYYY-MM-DD). Also accepts expiration_date_gte / expiration_date_lte. example: '2024-12-20' required: false type: string limit: default: 100 description: 'Max results (chain: 1-1000; bars/trades: 1-10000).' required: false type: integer option_type: description: 'Chain filter: call or put.' example: call required: false type: string start_date: description: Range start for bars/trades. YYYY-MM-DD or unix epoch seconds. required: false type: string strike_price_gte: description: 'Chain filter: minimum strike.' example: 150 required: false type: number strike_price_lte: description: 'Chain filter: maximum strike.' example: 300 required: false type: number ticker: description: Underlying ticker for the option chain. example: AAPL required: Required when type=chain type: string tickers: description: OCC option contract symbols. example: - AAPL241220C00300000 required: Required when type=bars/trades/quotes type: array timeframe: default: 1Day description: Bar size for type=bars (e.g. 1Day). required: false type: string type: default: chain description: chain (default), bars, trades, or quotes. example: chain required: false type: string response_fields: bars: description: (type=bars) Map of contract symbol to its list of OHLCV bars. type: object next_page_token: description: Cursor for the next page, or null when complete. type: string quotes: description: (type=quotes) Map of contract symbol to its latest quote. type: object snapshots: description: (type=chain) Map of contract symbol to its snapshot. fields: daily_bar: description: Current day OHLCV bar for the contract type: object greeks: description: delta, gamma, theta, vega, rho type: object implied_volatility: description: Implied volatility type: number latest_quote: description: Most recent bid/ask for the contract type: object latest_trade: description: Most recent trade for the contract type: object type: object trades: description: (type=trades) Map of contract symbol to its list of trades. type: object overview: authentication: traditional: Bearer token required in Authorization header for /api/* endpoints base_url: https://api.prixe.io description: Real-time and historical stock market data API with Bearer token authentication title: Stock Data API version: 1.0.0 websocket: Real-time data streaming available via WebSocket connections privacy_and_data_logging: data_retention: API logs are retained for 90 days for security and debugging purposes. description: Our API logs certain information for security, debugging, and analytics purposes logged_data: - description: We log the IP address of each API request for security and rate limiting purposes. We support proxy headers (X-Forwarded-For, X-Real-IP, CF-Connecting-IP, True-Client-IP) to capture the real client IP when behind proxies or load balancers. type: IP Addresses - description: We log the endpoint accessed, HTTP method, request body, response status code, and response time for each API call. type: Request/Response Details - description: We track which API key was used for each request to enforce rate limits and monitor usage patterns. type: API Key Usage - description: We record the exact time of each API request for audit trails and debugging. type: Timestamps privacy_notice: By using this API, you acknowledge that the above data will be collected and stored as described. rate_limiting: description: Rate limits are enforced both per-user and per-IP address to ensure fair usage include_limits: description: Pass include_limits=true on any /api/ endpoint to see your current usage and plan limits in the response. For POST requests, include it in the JSON body; for GET requests, use it as a query parameter. example_response: rate_limit: daily_limit: 10000 daily_usage: 312 hourly_limit: 1000 hourly_usage: 45 ip_limits: daily: Rate limited per subscription plan description: To prevent abuse through multiple accounts, we also enforce IP-based rate limits hourly: Rate limited per subscription plan monthly: Rate limited per subscription plan note: These IP limits apply regardless of how many accounts are using the same IP address user_limits: Each user's rate limits are determined by their subscription plan (Free, Pro, or Enterprise)