OpenBB-finance/OpenBB · error · OpenBBError

Error: No validated data was found.

Error message

Error: No validated data was found.

What it means

Raised by OptionsChainsData.dataframe when the DataFrame constructed from the validated model dump is empty after the underlying_price handling. It means the provider result object passed validation but contained zero usable rows (or everything was excluded by exclude_unset/exclude_none during the dump), so there is nothing to enrich.

Source

Thrown at openbb_platform/core/openbb_core/provider/utils/options_chains_properties.py:73

            self.model_dump(
                exclude_unset=True,
                exclude_none=True,
            )
        )

        if "underlying_price" not in chains_data.columns and not self.last_price:
            raise OpenBBError(
                "'underlying_price' was not returned in the provider data."
                + "\n\n Please set the 'last_price' property and try again."
                + "\n\n Note: This error does not impact the standard OBBject `to_df()` method."
            )

        # Add the underlying price to the DataFrame, or override the existing price.
        if self.last_price:
            chains_data["underlying_price"] = self.last_price

        if chains_data.empty:
            raise OpenBBError("Error: No validated data was found.")

        if "dte" not in chains_data.columns and "eod_date" in chains_data.columns:
            _date = to_datetime(chains_data.eod_date)
            temp = DatetimeIndex(chains_data.expiration)
            temp_ = temp - _date  # type: ignore
            chains_data["dte"] = [Timedelta(_temp_).days for _temp_ in temp_]

        if "dte" in chains_data.columns:
            chains_data = DataFrame(chains_data[chains_data.dte >= 0])

        if "dte" not in chains_data.columns and "eod_date" not in chains_data.columns:
            today = datetime.today().date()
            chains_data["dte"] = chains_data.expiration - today

        # Add the breakeven price for each option, and the DEX and GEX for each option, if available.
        try:
            _calls = DataFrame(chains_data[chains_data.option_type == "call"])
            _puts = DataFrame(chains_data[chains_data.option_type == "put"])

View on GitHub (pinned to 3e071fcc2c)

Solutions

  1. Check the raw result first: if res.results is empty or res.to_df().empty, skip the enriched access
  2. Confirm the symbol actually has listed options on the provider (try another provider to compare)
  3. Retry during market hours if the provider only populates chains intraday

Example fix

# before
df = res.dataframe  # OpenBBError: No validated data was found.

# after
if not res.results:
    raise ValueError(f"no options data returned for {symbol}")
df = res.dataframe
Defensive patterns

Strategy: validation

Validate before calling

if not res.results:
    raise ValueError(f"provider returned no options rows for {symbol}; skip enrichment")
# only now access res.dataframe

Try / catch

from openbb_core.app.model.abstract.error import OpenBBError

try:
    df = res.dataframe
except OpenBBError as e:
    if "No validated data was found" in str(e):
        df = res.to_df()  # inspect the raw payload to diagnose
        if df.empty:
            return None  # or retry with another provider
    raise

Prevention

When it happens

Trigger: Calling .dataframe on an OptionsChainsData built from an empty list of contracts; a provider returning an empty chains payload for a symbol with no listed options (some ETFs/OTM-only tickers); constructing OptionsChainsData(results=[]) manually in tests.

Common situations: Querying options for tickers without an options chain, pre-market/weekend when a provider returns an empty payload, or upstream API changes silently returning empty results that still pass validation.

Related errors


AI-assisted analysis of OpenBB-finance/OpenBB@3e071fcc2c (2026-08-14). Data as JSON: /api/errors/d80b69731dafb535. Report an issue: GitHub.