OpenBB-finance/OpenBB · error · ValueError

Expected dict, got empty list

Error message

Expected dict, got empty list

What it means

Raised by openbb_fmp get_data_one when the FMP response is a list with zero elements but the caller needs a single dict. The helper is used for endpoints expected to return one object (profile, quote, etc.), so an empty list means the symbol simply has no record.

Source

Thrown at openbb_platform/providers/fmp/openbb_fmp/utils/helpers.py:133

    """
    data = await get_data(url, **kwargs)

    if sub_dict and isinstance(data, dict):
        data = data.get(sub_dict, [])
    if isinstance(data, dict):
        raise ValueError("Expected list of dicts, got dict")
    if len(data) == 0:
        raise EmptyDataError()

    return data


async def get_data_one(url: str, **kwargs: Any) -> dict:
    """Get data from FMP endpoint and convert to schema."""
    data = await get_data(url, **kwargs)
    if isinstance(data, list):
        if len(data) == 0:
            raise ValueError("Expected dict, got empty list")

        try:
            data = {i: data[i] for i in range(len(data))} if len(data) > 1 else data[0]
        except TypeError as e:
            raise ValueError("Expected dict, got list of dicts") from e

    return data


def most_recent_quarter(base: date | None = None) -> date:
    """Get the most recent quarter date."""
    if base is None:
        base = date.today()
    base = min(base, date.today())  # This prevents dates from being in the future
    exacts = [(3, 31), (6, 30), (9, 30), (12, 31)]
    for exact in exacts:
        if base.month == exact[0] and base.day == exact[1]:
            return base

View on GitHub (pinned to 3e071fcc2c)

Solutions

  1. Validate the symbol with FMP's search endpoint (/api/v3/search?query=...) and use the returned symbol exactly
  2. Check for delisting or exchange-specific formatting (FMP uses hyphens for share classes, e.g. BRK-B)
  3. Confirm the endpoint covers that asset class
  4. Handle the ValueError in caller code to skip unknown symbols in batch loops

Example fix

# before
profile = await get_data_one(f"{base}profile?symbol={symbol}&apikey={key}")

# after
try:
    profile = await get_data_one(f"{base}profile?symbol={symbol}&apikey={key}")
except ValueError:
    continue  # skip symbols FMP does not cover
Defensive patterns

Strategy: try-catch

Validate before calling

import requests
r = requests.get(f"https://financialmodelingprep.com/stable/search-ticker?query={symbol}&apikey={key}")
matches = r.json() if r.status_code == 200 else []
assert matches, f'{symbol} unknown to FMP'

Type guard

def symbol_exists_on_fmp(symbol: str, search_results: list[dict]) -> bool:
    return any(item.get("symbol") == symbol for item in search_results)

Try / catch

try:
    profile = await get_data_one(url)
except ValueError as e:
    if 'empty list' in str(e):
        continue  # symbol not covered - skip in batch loops
    raise

Prevention

When it happens

Trigger: Calling a single-object FMP endpoint (e.g. /profile/) with a symbol FMP does not cover: invalid ticker, wrong exchange suffix, delisted company, or an asset class (crypto/forex) the endpoint does not serve.

Common situations: Typos in tickers (APPL vs AAPL), tickers with dots or suffixes FMP does not use (BRK.B vs BRK-B), recently delisted companies, or free-tier keys restricted from certain symbols.

Related errors


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