feat: Add stock market endpoints (EOD, IEX, News)

Add OpenAPI specifications for stock market data:
- End-of-day prices with metadata
- IEX real-time prices, quotes, and historical data
- News articles with tags and sources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Cameron Yick
2025-12-13 23:30:11 -05:00
parent 2ab8cdb0b8
commit 5a42e329cb
6 changed files with 1125 additions and 0 deletions

View File

@@ -0,0 +1,191 @@
# End-of-Day Stock Price API Paths
# Reference: https://www.tiingo.com/documentation/end-of-day
daily-prices: &daily-prices
get:
summary: Get End-of-Day Stock Prices
description: |
Returns End-of-Day price data for a given stock ticker.
Tiingo's End-of-Day prices use a proprietary error checking framework to help clean data feeds
and catch missing corporate actions (splits, dividends, and exchange listing changes).
**Pricing Availability:**
- Most US Equity prices are available at 5:30 PM EST
- Exchanges may send corrections until 8 PM EST
- Mutual Fund NAVs available after 12 AM EST
**Price Adjustments:**
- Both raw and adjusted prices are available
- Adjustment methodology follows CRSP (Center for Research in Security Prices) standard
- Incorporates both split and dividend adjustments
operationId: getEndOfDayPrices
tags:
- End-of-Day
parameters:
- $ref: '../parameters/_index.yaml#/TickerPathParam'
- $ref: '../parameters/_index.yaml#/TokenParam'
- $ref: '../parameters/_index.yaml#/StartDateParam'
- $ref: '../parameters/_index.yaml#/EndDateParam'
- $ref: '../parameters/_index.yaml#/FormatParam'
- name: resampleFreq
in: query
required: false
schema:
type: string
enum:
- daily
- weekly
- monthly
- annually
- 1min
- 5min
- 15min
- 30min
- 1hour
- 4hour
description: Resample frequency for OHLC bars (e.g., daily, monthly, weekly, 5min, 1hour)
- name: sort
in: query
required: false
schema:
type: string
enum:
- asc
- desc
default: asc
description: Sort order for results (ascending or descending by date)
- name: columns
in: query
required: false
schema:
type: string
description: Comma-separated list of specific columns to return (e.g., "date,close,volume")
example: "date,close,volume"
responses:
'200':
description: Successful response with price data
content:
application/json:
schema:
$ref: '../schemas/eod-schemas.yaml#/PriceData'
examples:
singleDay:
summary: Single day price data
value:
- date: "2024-01-01"
open: 150.25
high: 152.50
low: 149.75
close: 151.80
volume: 50000000
adjOpen: 150.25
adjHigh: 152.50
adjLow: 149.75
adjClose: 151.80
adjVolume: 50000000
divCash: 0.0
splitFactor: 1.0
historicalData:
summary: Multiple days historical data
value:
- date: "2024-01-01"
open: 150.25
high: 152.50
low: 149.75
close: 151.80
volume: 50000000
adjOpen: 150.25
adjHigh: 152.50
adjLow: 149.75
adjClose: 151.80
adjVolume: 50000000
divCash: 0.0
splitFactor: 1.0
- date: "2024-01-02"
open: 151.90
high: 153.20
low: 151.50
close: 152.40
volume: 48000000
adjOpen: 151.90
adjHigh: 153.20
adjLow: 151.50
adjClose: 152.40
adjVolume: 48000000
divCash: 0.0
splitFactor: 1.0
text/csv:
schema:
type: string
format: binary
example: |
date,open,high,low,close,volume,adjOpen,adjHigh,adjLow,adjClose,adjVolume,divCash,splitFactor
2024-01-01,150.25,152.50,149.75,151.80,50000000,150.25,152.50,149.75,151.80,50000000,0.0,1.0
'400':
$ref: '../responses/_index.yaml#/BadRequest'
'401':
$ref: '../responses/_index.yaml#/Unauthorized'
'404':
$ref: '../responses/_index.yaml#/NotFound'
'429':
$ref: '../responses/_index.yaml#/TooManyRequests'
'500':
$ref: '../responses/_index.yaml#/InternalServerError'
daily-meta: &daily-meta
get:
summary: Get Stock Ticker Metadata
description: |
Returns metadata information about a specific stock ticker.
Meta information comes from a variety of sources and is used to help communicate
details about an asset in the Tiingo database to users.
**Response Fields:**
- Ticker symbol and full name
- Exchange where the asset is listed
- Description of the company/asset
- Date range for available price data
operationId: getTickerMetadata
tags:
- End-of-Day
parameters:
- $ref: '../parameters/_index.yaml#/TickerPathParam'
- $ref: '../parameters/_index.yaml#/TokenParam'
responses:
'200':
description: Successful response with ticker metadata
content:
application/json:
schema:
$ref: '../schemas/eod-schemas.yaml#/TickerMetadata'
examples:
appleMetadata:
summary: Apple Inc metadata
value:
ticker: "AAPL"
name: "Apple Inc"
exchangeCode: "NASDAQ"
description: "Apple Inc is an American multinational technology company that specializes in consumer electronics, software and online services."
startDate: "1990-01-01"
endDate: "2024-01-01"
noDataTicker:
summary: Ticker with no price data
value:
ticker: "NEWCO"
name: "New Company Inc"
exchangeCode: "NYSE"
description: "A newly listed company"
startDate: null
endDate: null
'400':
$ref: '../responses/_index.yaml#/BadRequest'
'401':
$ref: '../responses/_index.yaml#/Unauthorized'
'404':
$ref: '../responses/_index.yaml#/NotFound'
'429':
$ref: '../responses/_index.yaml#/TooManyRequests'
'500':
$ref: '../responses/_index.yaml#/InternalServerError'

269
openapi/paths/iex.yaml Normal file
View File

@@ -0,0 +1,269 @@
# IEX Exchange API Endpoints
# Reference: https://api.tiingo.com/documentation/iex
iex-all: &iex-all
get:
summary: Get current top-of-book and last price for all or multiple tickers
description: |
Retrieve current top-of-book (bid/ask) and last price data for all available tickers or a specified list of tickers.
Returns real-time reference prices or full TOPS feed data (requires IEX Exchange registration).
This endpoint provides:
- Top-of-Book (Bid/Ask) data
- Last Sale (trade) data
- Tiingo-enriched convenience fields (tngoLast, mid, open, high, low)
- Volume data (IEX only during trading, all exchanges after close)
operationId: getAllIEXQuotes
tags:
- IEX
parameters:
- name: tickers
in: query
required: false
schema:
type: string
pattern: '^[A-Z0-9]+(,[A-Z0-9]+)*$'
description: |
Comma-separated list of ticker symbols. If omitted, returns data for all available tickers.
example: 'AAPL,SPY,QQQ'
- $ref: '../parameters/_index.yaml#/FormatParam'
- $ref: '../parameters/_index.yaml#/TokenParam'
responses:
'200':
description: Successful response with top-of-book and last price data
content:
application/json:
schema:
type: array
items:
$ref: '../schemas/iex-schemas.yaml#/IEXTopOfBook'
examples:
multiple-tickers:
summary: Multiple tickers response
value:
- ticker: 'AAPL'
timestamp: '2019-01-30T10:33:38.186520297-05:00'
quoteTimestamp: '2019-01-30T10:33:38.186520297-05:00'
lastSaleTimeStamp: '2019-01-30T10:33:34.176037579-05:00'
last: 162.37
lastSize: 100
tngoLast: 162.33
prevClose: 154.68
open: 161.83
high: 163.25
low: 160.38
mid: 162.67
volume: 0
bidSize: 100
bidPrice: 162.34
askSize: 100
askPrice: 163.0
- ticker: 'SPY'
timestamp: '2019-01-30T11:12:29.505261845-05:00'
quoteTimestamp: '2019-01-30T11:12:29.505261845-05:00'
lastSaleTimeStamp: '2019-01-30T11:12:16.643833612-05:00'
last: 265.41
lastSize: 617
tngoLast: 265.405
prevClose: 263.41
open: 264.62
high: 265.445
low: 264.225
mid: 265.405
volume: 0
bidSize: 500
bidPrice: 265.39
askSize: 100
askPrice: 265.42
text/csv:
schema:
type: string
'400':
$ref: '../responses/_index.yaml#/BadRequest'
'401':
$ref: '../responses/_index.yaml#/Unauthorized'
'404':
$ref: '../responses/_index.yaml#/NotFound'
'429':
$ref: '../responses/_index.yaml#/TooManyRequests'
'500':
$ref: '../responses/_index.yaml#/InternalServerError'
iex-single: &iex-single
get:
summary: Get current top-of-book and last price for a specific ticker
description: |
Retrieve current top-of-book (bid/ask) and last price data for a specific ticker symbol.
Returns real-time reference prices or full TOPS feed data (requires IEX Exchange registration).
This endpoint provides:
- Top-of-Book (Bid/Ask) data
- Last Sale (trade) data
- Tiingo-enriched convenience fields (tngoLast, mid, open, high, low)
- Volume data (IEX only during trading, all exchanges after close)
- Quotes updated to nanosecond precision
operationId: getIEXQuote
tags:
- IEX
parameters:
- $ref: '../parameters/_index.yaml#/TickerPathParam'
- $ref: '../parameters/_index.yaml#/FormatParam'
- $ref: '../parameters/_index.yaml#/TokenParam'
responses:
'200':
description: Successful response with top-of-book and last price data
content:
application/json:
schema:
type: array
items:
$ref: '../schemas/iex-schemas.yaml#/IEXTopOfBook'
minItems: 1
maxItems: 1
examples:
single-ticker:
summary: Single ticker response
value:
- ticker: 'AAPL'
timestamp: '2019-01-30T10:33:38.186520297-05:00'
quoteTimestamp: '2019-01-30T10:33:38.186520297-05:00'
lastSaleTimeStamp: '2019-01-30T10:33:34.176037579-05:00'
last: 162.37
lastSize: 100
tngoLast: 162.33
prevClose: 154.68
open: 161.83
high: 163.25
low: 160.38
mid: 162.67
volume: 0
bidSize: 100
bidPrice: 162.34
askSize: 100
askPrice: 163.0
text/csv:
schema:
type: string
'400':
$ref: '../responses/_index.yaml#/BadRequest'
'401':
$ref: '../responses/_index.yaml#/Unauthorized'
'404':
$ref: '../responses/_index.yaml#/NotFound'
'429':
$ref: '../responses/_index.yaml#/TooManyRequests'
'500':
$ref: '../responses/_index.yaml#/InternalServerError'
iex-prices: &iex-prices
get:
summary: Get historical intraday prices
description: |
Retrieve historical intraday prices for a stock in OHLC format. Supports various resampling frequencies
from 1-minute to daily bars.
Features:
- OHLC (Open, High, Low, Close) data
- Configurable time intervals (1min to daily)
- Optional after-hours data inclusion
- Force-fill option for gaps in data
- IEX-only volume data (available with explicit columns parameter)
Example use cases:
- Current day OHLC: `resampleFreq=1day`
- 5-minute bars: `startDate=2019-01-02&resampleFreq=5min`
- Hourly bars with gaps filled: `startDate=2025-12-01&resampleFreq=1hour&forceFill=true`
operationId: getIEXHistoricalPrices
tags:
- IEX
parameters:
- $ref: '../parameters/_index.yaml#/TickerPathParam'
- $ref: '../parameters/_index.yaml#/StartDateParam'
- $ref: '../parameters/_index.yaml#/EndDateParam'
- name: resampleFreq
in: query
required: false
schema:
type: string
pattern: '^\d+(min|hour|day)$'
default: '5min'
description: |
Frequency for resampling OHLC data. Format: number + unit (min/hour/day).
Minimum value is 1min.
Examples: '1min', '5min', '15min', '1hour', '4hour', '1day'
example: '5min'
- name: afterHours
in: query
required: false
schema:
type: boolean
default: false
description: If true, includes pre-market and post-market data if available
- name: forceFill
in: query
required: false
schema:
type: boolean
default: false
description: |
If true, fills gaps in data by using the previous OHLC values when no trade/quote update
occurred for a given time period
- name: columns
in: query
required: false
schema:
type: string
pattern: '^[a-z]+(,[a-z]+)*$'
description: |
Comma-separated list of columns to include in response.
Available columns: open, high, low, close, volume.
Note: Volume data is only exposed if explicitly requested.
example: 'open,high,low,close,volume'
- $ref: '../parameters/_index.yaml#/FormatParam'
- $ref: '../parameters/_index.yaml#/TokenParam'
responses:
'200':
description: Successful response with historical intraday price data
content:
application/json:
schema:
type: array
items:
$ref: '../schemas/iex-schemas.yaml#/IEXPrice'
examples:
five-minute-bars:
summary: 5-minute OHLC bars
value:
- date: '2019-01-02T14:30:00.000Z'
open: 154.74
high: 155.52
low: 154.58
close: 154.76
volume: 16102
- date: '2019-01-02T14:35:00.000Z'
open: 154.8
high: 155.0
low: 154.31
close: 154.645
volume: 19127
daily-bar:
summary: Daily OHLC bar
value:
- date: '2019-01-02T00:00:00.000Z'
open: 154.89
high: 158.85
low: 154.23
close: 157.92
text/csv:
schema:
type: string
'400':
$ref: '../responses/_index.yaml#/BadRequest'
'401':
$ref: '../responses/_index.yaml#/Unauthorized'
'404':
$ref: '../responses/_index.yaml#/NotFound'
'429':
$ref: '../responses/_index.yaml#/TooManyRequests'
'500':
$ref: '../responses/_index.yaml#/InternalServerError'

212
openapi/paths/news.yaml Normal file
View File

@@ -0,0 +1,212 @@
# News API Path Definitions
# Reference these using: $ref: '../paths/news.yaml#/PathName'
news: &news
get:
summary: Get latest news articles
description: |
Retrieves the latest news articles from Tiingo's comprehensive news feeds.
Tiingo incorporates financial news sites as well as financial blogs and tags them using proprietary algorithms.
On a typical day, Tiingo adds over 8,000-12,000 articles.
This endpoint supports filtering by tickers, tags, source domains, and date ranges.
Results can be sorted by either publishedDate or crawlDate in descending order.
operationId: getNews
tags:
- News
parameters:
- $ref: '../parameters/_index.yaml#/TokenParam'
- name: tickers
in: query
required: false
schema:
type: array
items:
type: string
pattern: '^[A-Z0-9]+$'
style: form
explode: false
description: Comma-separated list of ticker symbols to filter news articles
example: ["AAPL", "GOOGL"]
- name: tags
in: query
required: false
schema:
type: array
items:
type: string
style: form
explode: false
description: Comma-separated list of tags/countries/topics to filter news articles
example: ["election", "argentina"]
- name: source
in: query
required: false
schema:
type: array
items:
type: string
format: hostname
style: form
explode: false
description: Comma-separated list of source domains to filter news articles
example: ["bloomberg.com", "reuters.com"]
- $ref: '../parameters/_index.yaml#/StartDateParam'
- $ref: '../parameters/_index.yaml#/EndDateParam'
- name: limit
in: query
required: false
schema:
type: integer
format: int32
minimum: 1
maximum: 1000
default: 100
description: Maximum number of news objects to return. Default is 100, max is 1000. Contact support@tiingo.com for adjustments.
- name: offset
in: query
required: false
schema:
type: integer
format: int32
minimum: 0
default: 0
description: Pagination variable used alongside limit. Returns results shifted by offset. Example - limit=100, offset=2 returns results 2-102 instead of 0-99.
- name: sortBy
in: query
required: false
schema:
type: string
enum:
- publishedDate
- crawlDate
default: publishedDate
description: The date field to sort results by in descending order. Defaults to publishedDate.
responses:
'200':
description: Successful response with news articles
content:
application/json:
schema:
type: array
items:
$ref: '../schemas/news-schemas.yaml#/NewsArticle'
examples:
singleArticle:
summary: Example news article
value:
- source: "cnbc.com"
crawlDate: "2019-01-29T22:20:01.696871Z"
description: "Apple CEO Tim Cook told CNBC that trade tensions between the U.S. and China have improved since late December."
url: "https://www.cnbc.com/2019/01/29/apples-ceo-sees-optimism-as-trade-tension-between-us-and-china-lessens.html"
publishedDate: "2019-01-29T22:17:00Z"
tags: ["China", "Economic Measures", "Economics", "Markets", "Stock", "Technology"]
tickers: ["AAPL"]
title: "Apple's CEO sees optimism as trade tension between U.S. and China lessens"
id: 28515261
'400':
$ref: '../responses/_index.yaml#/BadRequest'
'401':
$ref: '../responses/_index.yaml#/Unauthorized'
'404':
$ref: '../responses/_index.yaml#/NotFound'
'429':
$ref: '../responses/_index.yaml#/TooManyRequests'
'500':
$ref: '../responses/_index.yaml#/InternalServerError'
bulk-list: &bulk-list
get:
summary: List available bulk download files
description: |
Returns a list of all available bulk download files for the entire news database.
An "incremental" batchType file is added every evening. At 12am EST, a batch process
runs saving all news articles for the past 24 hours.
**Note:** Bulk Download is only available to institutional clients.
operationId: listBulkDownloadFiles
tags:
- News
parameters:
- $ref: '../parameters/_index.yaml#/TokenParam'
responses:
'200':
description: Successful response with list of bulk download files
content:
application/json:
schema:
type: array
items:
$ref: '../schemas/news-schemas.yaml#/BulkDownloadFile'
examples:
bulkFileList:
summary: Example list of bulk download files
value:
- id: 755
filename: "bulkfile_2019-01-28_2019-01-29.tar.gz"
batchType: "incremental"
startDate: "2019-01-28T05:00:00Z"
endDate: "2019-01-29T05:00:00Z"
url: "https://api.tiingo.com/tiingo/news/bulk_download/755?token=YOUR_API_TOKEN"
fileSizeUncompressed: 10385878
fileSizeCompressed: 3018550
- id: 754
filename: "bulkfile_2019-01-27_2019-01-28.tar.gz"
batchType: "incremental"
startDate: "2019-01-27T05:00:00Z"
endDate: "2019-01-28T05:00:00Z"
url: "https://api.tiingo.com/tiingo/news/bulk_download/754?token=YOUR_API_TOKEN"
fileSizeUncompressed: 9854321
fileSizeCompressed: 2945678
'400':
$ref: '../responses/_index.yaml#/BadRequest'
'401':
$ref: '../responses/_index.yaml#/Unauthorized'
'404':
$ref: '../responses/_index.yaml#/NotFound'
'429':
$ref: '../responses/_index.yaml#/TooManyRequests'
'500':
$ref: '../responses/_index.yaml#/InternalServerError'
bulk-download: &bulk-download
get:
summary: Download a specific bulk news file
description: |
Downloads a specific batch file by ID. The file contains news articles in compressed format (gzip).
Use the bulk-list endpoint to get the list of available files and their IDs.
The downloaded file is in tar.gz format and contains news articles for the specified date range.
**Note:** Bulk Download is only available to institutional clients.
operationId: downloadBulkFile
tags:
- News
parameters:
- name: id
in: path
required: true
schema:
type: integer
format: int32
description: The unique ID that corresponds to the batch file you would like to download
example: 755
- $ref: '../parameters/_index.yaml#/TokenParam'
responses:
'200':
description: Successful response with bulk download file (binary tar.gz)
content:
application/gzip:
schema:
type: string
format: binary
'400':
$ref: '../responses/_index.yaml#/BadRequest'
'401':
$ref: '../responses/_index.yaml#/Unauthorized'
'404':
$ref: '../responses/_index.yaml#/NotFound'
'429':
$ref: '../responses/_index.yaml#/TooManyRequests'
'500':
$ref: '../responses/_index.yaml#/InternalServerError'