Skip to content

Models API Reference

OHLCVBar

stockfeed.models.ohlcv.OHLCVBar

Bases: BaseModel

Source code in src/stockfeed/models/ohlcv.py
class OHLCVBar(BaseModel):
    ticker: str
    timestamp: datetime  # Always UTC
    interval: Interval
    open: Decimal
    high: Decimal
    low: Decimal
    close_raw: Decimal  # Unadjusted close
    close_adj: Decimal | None  # Split/dividend adjusted — None if not provided
    volume: int
    vwap: Decimal | None  # If available
    trade_count: int | None  # If available
    provider: str

    @field_validator("ticker")
    @classmethod
    def ticker_must_not_be_empty(cls, v: str) -> str:
        if not v.strip():
            raise ValueError("ticker must not be empty")
        return v.upper()

Quote

stockfeed.models.quote.Quote

Bases: BaseModel

Source code in src/stockfeed/models/quote.py
class Quote(BaseModel):
    ticker: str
    timestamp: datetime
    bid: Decimal | None
    ask: Decimal | None
    bid_size: int | None
    ask_size: int | None
    last: Decimal
    last_size: int | None
    volume: int | None
    open: Decimal | None
    high: Decimal | None
    low: Decimal | None
    close: Decimal | None
    change: Decimal | None
    change_pct: Decimal | None
    provider: str

    @field_validator("ticker")
    @classmethod
    def ticker_must_not_be_empty(cls, v: str) -> str:
        if not v.strip():
            raise ValueError("ticker must not be empty")
        return v.upper()

TickerInfo

stockfeed.models.ticker.TickerInfo

Bases: BaseModel

Source code in src/stockfeed/models/ticker.py
class TickerInfo(BaseModel):
    ticker: str
    name: str
    exchange: str
    currency: str
    country: str | None
    sector: str | None
    industry: str | None
    market_cap: int | None
    provider: str

    @field_validator("ticker")
    @classmethod
    def ticker_must_not_be_empty(cls, v: str) -> str:
        if not v.strip():
            raise ValueError("ticker must not be empty")
        return v.upper()

HealthStatus

stockfeed.models.health.HealthStatus

Bases: BaseModel

Source code in src/stockfeed/models/health.py
class HealthStatus(BaseModel):
    provider: str
    healthy: bool
    latency_ms: float | None
    error: str | None
    checked_at: datetime
    rate_limit_remaining: int | None

Interval

stockfeed.models.interval.Interval

Bases: str, Enum

Source code in src/stockfeed/models/interval.py
class Interval(str, Enum):
    ONE_MINUTE = "1m"
    FIVE_MINUTES = "5m"
    FIFTEEN_MINUTES = "15m"
    THIRTY_MINUTES = "30m"
    ONE_HOUR = "1h"
    FOUR_HOURS = "4h"
    ONE_DAY = "1d"
    ONE_WEEK = "1w"
    ONE_MONTH = "1mo"

StockFeedResponse

stockfeed.models.response.StockFeedResponse

Bases: BaseModel, Generic[T]

Source code in src/stockfeed/models/response.py
class StockFeedResponse(BaseModel, Generic[T]):
    data: T
    provider_used: str
    cache_hit: bool
    latency_ms: float
    timestamp: datetime  # When response was assembled
    interval: Interval | None
    ticker: str | None

Options models

GreeksSource

stockfeed.models.options.GreeksSource

Bases: str, Enum

Source code in src/stockfeed/models/options.py
class GreeksSource(str, Enum):
    API = "api"
    CALCULATED = "calculated"

Greeks

stockfeed.models.options.Greeks

Bases: BaseModel

Source code in src/stockfeed/models/options.py
class Greeks(BaseModel):
    delta: Decimal | None
    gamma: Decimal | None
    theta: Decimal | None
    vega: Decimal | None
    rho: Decimal | None
    source: GreeksSource

OptionType

stockfeed.models.options.OptionType

Bases: str, Enum

Source code in src/stockfeed/models/options.py
class OptionType(str, Enum):
    CALL = "call"
    PUT = "put"

OptionContract

stockfeed.models.options.OptionContract

Bases: BaseModel

Source code in src/stockfeed/models/options.py
class OptionContract(BaseModel):
    # OCC symbol (e.g. AAPL240119C00150000) — differs from ticker; encodes expiry, type, strike
    symbol: str
    underlying: str
    expiration: date
    strike: Decimal
    option_type: OptionType
    bid: Decimal | None
    ask: Decimal | None
    last: Decimal | None
    volume: int | None
    open_interest: int | None
    implied_volatility: Decimal | None
    greeks: Greeks | None
    provider: str

    @field_validator("symbol")
    @classmethod
    def symbol_must_not_be_empty(cls, v: str) -> str:
        if not v.strip():
            raise ValueError("symbol must not be empty")
        return v.upper()

    @field_validator("underlying")
    @classmethod
    def underlying_uppercase(cls, v: str) -> str:
        if not v.strip():
            raise ValueError("underlying must not be empty")
        return v.strip().upper()

OptionChain

stockfeed.models.options.OptionChain

Bases: BaseModel

Source code in src/stockfeed/models/options.py
class OptionChain(BaseModel):
    underlying: str
    expiration: date
    contracts: list[OptionContract]
    provider: str

OptionQuote

stockfeed.models.options.OptionQuote

Bases: BaseModel

Source code in src/stockfeed/models/options.py
class OptionQuote(BaseModel):
    symbol: str
    underlying: str
    timestamp: datetime
    bid: Decimal | None
    ask: Decimal | None
    last: Decimal | None
    volume: int | None
    open_interest: int | None
    implied_volatility: Decimal | None
    greeks: Greeks | None
    provider: str

    @field_validator("symbol")
    @classmethod
    def symbol_must_not_be_empty(cls, v: str) -> str:
        if not v.strip():
            raise ValueError("symbol must not be empty")
        return v.upper()