OpenBB: An Open Data Platform That Takes Financial APIs Seriously

January 18, 2026

|repo-review

by Florian Narr

OpenBB: An Open Data Platform That Takes Financial APIs Seriously

What it does

OpenBB is an open-source data platform that normalizes financial data from 30+ providers (FMP, FRED, Yahoo Finance, Polygon, SEC, and more) behind a single Python SDK. You write obb.equity.price.historical("AAPL") and it handles provider selection, credential management, query transformation, and response normalization. It also ships a FastAPI server and — as of recently — an MCP server for AI agents.

Why I starred it

Most financial data access is a mess. Each provider has its own auth flow, its own response format, its own quirks. OpenBB's bet is that you should define what data you want (equity price history, options chains, economic indicators) and let the platform figure out which provider to hit and how to normalize the result. That abstraction is the interesting part.

The 65k+ stars are partly hype, partly real. What caught my eye was the architecture: a provider registry system that uses Python entry points and a generic Fetcher pattern to make adding new data sources genuinely modular.

How it works

The core lives in openbb_platform/core/openbb_core/. The architecture has three layers: extensions (route definitions), providers (data sources), and the core (orchestration).

The Fetcher pattern

Every data provider implements fetchers — subclasses of Fetcher[Q, R] in openbb_platform/core/openbb_core/provider/abstract/fetcher.py. The generic pattern is clean:

class Fetcher(Generic[Q, R]):
    require_credentials = True

    @staticmethod
    def transform_query(params: dict[str, Any]) -> Q:
        raise NotImplementedError

    @staticmethod
    async def aextract_data(query: Q, credentials: dict[str, str] | None) -> Any:
        ...

    @staticmethod
    def transform_data(query: Q, data: Any, **kwargs) -> R:
        raise NotImplementedError

    @classmethod
    async def fetch_data(cls, params, credentials=None, **kwargs):
        query = cls.transform_query(params=params)
        data = await maybe_coroutine(cls.extract_data, query=query, credentials=credentials, **kwargs)
        return cls.transform_data(query=query, data=data, **kwargs)

Three steps: transform the query into provider-specific params, extract raw data, transform it back into a standard model. The __init_subclass__ hook automatically picks aextract_data over extract_data if you implement the async version — a small detail, but it means providers can choose sync or async without ceremony.

Extension loading via entry points

The ExtensionLoader in extension_loader.py uses Python's importlib_metadata entry points to discover providers at install time. Three groups: openbb_core_extension for route modules, openbb_provider_extension for data providers, openbb_obbject_extension for output plugins. Each pip install openbb-provider-fmp registers itself via pyproject.toml entry points, and the loader picks it up automatically.

class OpenBBGroups(Enum):
    core = "openbb_core_extension"
    provider = "openbb_provider_extension"
    obbject = "openbb_obbject_extension"

The RegistryMap in registry_map.py then introspects every fetcher to build a map of standard vs. provider-specific fields. It walks the class hierarchy (__mro__), comparing __annotations__ between child and parent to figure out which fields each provider adds on top of the standard model. That MRO walk at lines 130-160 is doing real work — it distinguishes between inherited fields and provider-specific extras by checking whether the source file lives in the standard_models folder.

The query execution pipeline

When you call obb.equity.price.historical("AAPL"), the CommandRunner builds an ExecutionContext, the ParametersBuilder merges positional and keyword args, and QueryExecutor.execute() resolves the provider, finds the fetcher, filters credentials, and calls fetcher.fetch_data(). The result gets wrapped in an OBBject — their custom response container that supports .to_dataframe(), .to_dict(), and charting extensions.

MCP server

The openbb_mcp_server extension is a recent addition. It exposes every OpenBB endpoint as an MCP tool, so AI agents can query financial data directly. The MCPService singleton loads settings from ~/.openbb_platform/mcp_settings.json with a priority chain: CLI args > env vars > config file > defaults. It has its own test suite too — tests/app/test_tool_execution.py and friends.

Using it

pip install "openbb[all]"
from openbb import obb

# Equity price history
result = obb.equity.price.historical("AAPL", provider="fmp")
df = result.to_dataframe()

# Economic indicators from FRED
gdp = obb.economy.gdp.nominal(provider="fred")

# Options chains
chains = obb.derivatives.options.chains("TSLA", provider="cboe")

Start the API server:

openbb-api
# FastAPI running at http://127.0.0.1:6900

Every endpoint from the Python SDK is now available as a REST endpoint. The MCP server works the same way — install it and your AI agent gets 200+ financial data tools.

Rough edges

The dependency tree is heavy. pip install openbb[all] pulls in most of the Python data science stack plus FastAPI, aiohttp, and every provider's SDK. On a clean venv, expect a long install.

The provider quality varies. Some providers (FMP, FRED) are well-maintained with good test coverage. Others feel like they were contributed once and haven't been touched since. The finra provider just needed a fix for TooManyRedirects in April 2026 — basic session management that should've been there from the start.

Documentation for building custom providers exists but is scattered. You need to read the cookiecutter template and reverse-engineer from existing providers to understand all the conventions. The Fetcher pattern is elegant once you get it, but the onboarding path to get there is steeper than it needs to be.

The AGPL license is a real consideration if you're building anything commercial on top of this. Not a deal-breaker, but worth knowing upfront.

Bottom line

OpenBB is for quants, analysts, and anyone building financial data pipelines who's tired of maintaining separate integrations for every data provider. The Fetcher abstraction and entry-point-based plugin system are well-engineered. If you need normalized financial data in Python — or want to give your AI agent access to market data via MCP — this is the most complete open-source option available.

OpenBB-finance/OpenBB on GitHub
OpenBB-finance/OpenBB