.. meta:: :description: A neutral, dated comparison of bbg-fetch, Bloomberg blpapi, xbbg, and blp for Python data workflows. Choosing a Bloomberg Python client ================================== Audit date: 2026-08-16. This page compares the `bbg-fetch 3.0.0 release `_ audited on this date with `Bloomberg blpapi 3.26.7.1 `_, `xbbg 1.4.6 `_, and `blp 0.0.4 `_. Versions, interfaces, and maintenance status can change after this date; follow the linked primary sources before a new adoption decision. No universal recommendation --------------------------- These projects sit at different layers. Direct ``blpapi`` maximizes SDK control. ``xbbg`` offers the broadest high-level surface among the compared wrappers. ``blp`` keeps session, parsing, aggregation, and streaming concepts visible in Python. ``bbg-fetch`` stays deliberately narrow around pandas request/response data and selected quantitative-research shapes. The right choice follows the required Bloomberg services, transport, output contract, and amount of infrastructure the application should own. All four choices still require an appropriately licensed and authorized Bloomberg environment. A Python package does not provide Bloomberg data, credentials, or entitlements; compare the `Bloomberg SDK documentation `_, the `xbbg access statement `_, the `blp project scope `_, and :doc:`bbg-fetch connection prerequisites `. Side-by-side scope ------------------ .. list-table:: :header-rows: 1 :widths: 14 21 21 22 22 * - Dimension - ``bbg-fetch 3.0.0`` - direct ``blpapi 3.26.7.1`` - ``xbbg 1.4.6`` - ``blp 0.0.4`` * - Intended layer - Compact pandas request/response client plus opinionated option, volatility, futures, fixed-income, dividend, and constituent helpers (:doc:`task workflows `; `source `_). - Bloomberg's SDK primitives: the application constructs sessions, services, requests, correlation IDs, and event handling (`Session documentation `_; `Request documentation `_). - Broad client backed by a Rust execution/parsing engine, with high-level helpers and a generic request escape hatch (`current project scope `_). - Pythonic wrapper designed around explicit separation of session management, event parsing, and aggregation (`project README `_). * - Reference/history/bulk - Public ``bdp``, ``bdh``, and ``bds`` functions return documented pandas shapes (:doc:`request contracts `). - Available by creating the appropriate Bloomberg service requests and consuming partial/final response events; there are no Excel-named DataFrame convenience functions in the SDK (`Request and Session documentation `_). - ``bdp``, ``bdh``, and ``bds`` are part of its common request surface (`1.4.6 API overview `_). - ``BlpQuery`` exposes ``bdp``, ``bdh``, and ``bds`` returning pandas DataFrames (`API reference `_). * - Beyond BDP/BDH/BDS - Selected research shaping over the reference-data service; no intraday bars/ticks, BQL, screening, or generic-service API (:doc:`API ` and :doc:`research scope `). - The SDK exposes service, schema, request, provider, authorization, and subscription primitives; the application supplies service-specific request and output logic (`class inventory `_). - Documents intraday bars/ticks, BQL, screening/search, analytics, metadata, and generic requests (`common API surface `_). - Documents intraday bars/ticks, BEQS, BQL, and lower-level query creation alongside BDP/BDH/BDS (`quickstart `_; `current BlpQuery source `_). * - Streaming - Not implemented; the project scope is request/response only (:doc:`project boundary `). - Native synchronous or asynchronous ``Session`` subscriptions; the application owns event dispatch and correlation lifetimes (`Session documentation `_). - Provides subscription/stream helpers and isolated subscription sessions (`real-time surface `_; `engine model `_). - ``BlpStream`` wraps an asynchronous Bloomberg session and yields parsed event dictionaries (`current source `_). * - Output objects - pandas DataFrames/Series with workflow-specific index and column contracts (:doc:`request contracts `). - ``Event``, ``Message``, and ``Element`` SDK objects; conversion and domain shaping belong to the application (`SDK class inventory `_). - Defaults to a Narwhals DataFrame and documents native Arrow, PyArrow, pandas, Polars, and DuckDB paths (`output backends `_). - Query helpers return pandas DataFrames; streaming events are converted to dictionaries (`API reference `_; `stream conversion source `_). * - Dependency model - Runtime dependencies are NumPy and pandas; Bloomberg ``blpapi`` is a separate installation and is imported directly (`project metadata `_; :doc:`installation`). - Bloomberg's Python package plus the compatible Bloomberg SDK/runtime; it adds no third-party DataFrame abstraction (`official Python source installation `_). - Native Rust package; the Python ``blpapi`` wheel is not required as a dependency, but Bloomberg's shared runtime is still required. Frame conversions are optional extras (`1.4.6 installation `_). - Imports and wraps both ``blpapi`` and pandas (`current implementation `_). * - Session/transport assumptions - One lazy, process-local shared session fixed to ``localhost:8194`` and ``//blp/refdata``; ``disconnect`` resets it (`request source `_). - The application configures ``SessionOptions`` and chooses synchronous or asynchronous operation, DAPI/SAPI mode, addresses, authentication, TLS, and other supported SDK options (`SessionOptions documentation `_). - Defaults to local DAPI but documents configurable DAPI, SAPI/B-PIPE, ZFP, TLS, failover, SOCKS5, and worker pools (`configuration and engines `_). - ``BlpQuery`` and ``BlpStream`` accept host/port and forward session options; users explicitly start/stop or use context managers (`current session source `_). When each choice is a better fit -------------------------------- Choose ``bbg-fetch`` when ~~~~~~~~~~~~~~~~~~~~~~~~~ You need pandas-native BDP/BDH/BDS output plus the package's existing option-chain/parity, volatility-surface, futures-chain/carry, bond/issuer, dividend, or constituent shaping, and a local Windows Desktop API session is the intended boundary. Its advantage is the maintained workflow contract, not general Bloomberg API breadth. Confirm the exact functions in :doc:`api` and their limits in :doc:`task_research_workflows`. Choose direct Bloomberg ``blpapi`` when ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Your application needs SDK-level control over an unusual Bloomberg service, authorization identity, provider/publisher behavior, correlation/event lifecycle, or transport configuration and you are prepared to own parsing and output schemas. The official `SDK class inventory `_ and `Session documentation `_ show that lower-level surface. Choose ``xbbg`` when ~~~~~~~~~~~~~~~~~~~~ You need high-level intraday, streaming, async, BQL/search/analytics, enterprise connection modes, or non-pandas output backends in one client. Those are explicit parts of the `1.4.6 scope `_. The tradeoff is adopting a much broader engine and configuration surface than a small request/response pandas wrapper. Choose ``blp`` when ~~~~~~~~~~~~~~~~~~~ You want a pandas-first Python wrapper with BDP/BDH/BDS, intraday, BQL/BEQS, and streaming, while keeping session, parser, collector, and event concepts available for Python-level extension. Its `project design `_, `quickstart `_, and `stream source `_ support that fit. The documentation site still labels itself 0.0.3 while PyPI serves 0.0.4, so release-specific documentation parity is unknown and should be checked against the installed source. Why ``pdblp`` is not a current comparison target ------------------------------------------------ The roadmap named ``pdblp`` as a candidate subject to source verification. Its own `repository notice `_ says it is no longer under active development and has been superseded by ``blp``. Accordingly this dated guide compares the maintained successor rather than presenting ``pdblp`` as a current peer. Decision checklist ------------------ Before adopting any client, write down: * required Bloomberg services: reference/history/bulk only, or also intraday, subscriptions, BQL/search, authorization, or provider operations; * required transport: local Desktop API or firm-managed SAPI/B-PIPE/ZFP; * required output: fixed pandas shapes, another frame backend, or raw SDK messages; * ownership boundary: whether the library or the application should manage sessions, retries, event loops, parsing, and schema normalization; * local entitlement and data-handling constraints, which no wrapper removes; * version compatibility verified in the actual Bloomberg environment. This comparison intentionally makes no speed, scale, or reliability ranking: no equivalent live benchmark across the four choices was performed for U5.