Skip to main content

xbbg banner

CI Discord
Python PyPI version conda-forge version Python versions PyPI downloads per month PyPI downloads total
JavaScript npm version Node.js versions npm downloads per month
Rust crates.io version MSRV crates.io downloads

Links: Documentation · Quickstart · Configuration · Examples notebook · Contributing · Changelog


Latest release: xbbg==1.5.0 (release: notes)

This main branch is the Rust-powered v1 release. For the legacy pure-Python line, use release/0.x.

Important: xbbg is an independent open-source project. It is not affiliated with, endorsed by, sponsored by, or approved by Bloomberg Finance L.P. or its affiliates. Bloomberg, Bloomberg Terminal, B-PIPE, BQL, and related names are trademarks or service marks of their respective owners. xbbg does not grant access to Bloomberg services, data, software, licenses, credentials, or entitlements; users must obtain and use those separately under their own Bloomberg agreements and applicable policies.

Contents

What is xbbg?

xbbg is a Bloomberg client with Python as the primary surface and companion JavaScript/Node bindings, all backed by a shared Rust engine for request execution, response parsing, Arrow-shaped data movement, async workers, typed errors, and diagnostics.

Use xbbg when you already have Bloomberg access and want higher-level helpers for common request patterns, plus an escape hatch for lower-level Bloomberg service requests.

Core scope:

  • request helpers for BDP, BDS, BDH, intraday bars, ticks, BQL, BEQS, BSRCH, BQR, BTA, YAS, and related analytics
  • local Bloomberg Desktop API / DAPI by default
  • configuration for managed Bloomberg environments, including B-PIPE/SAPI, ZFP leased lines, TLS, failover hosts, SOCKS5, and SDK logging
  • sync and async Python APIs backed by the same engine
  • output as Narwhals, native xbbg Arrow carriers, PyArrow, pandas, Polars, DuckDB, and other optional Narwhals-backed libraries
  • JavaScript/Node bindings in js-xbbg

Why xbbg?

xbbg's project goal is direct: be the most complete, technically advanced, and performance-focused open-source Bloomberg client for Python workflows, while staying independent of Bloomberg and requiring users to bring their own authorized Bloomberg access.

The short version: if all you need is a tiny one-off bdp() wrapper, several packages can work. xbbg is built for the path where that notebook later grows into intraday data, BQL, streaming, B-PIPE/SAPI, ZFP, async services, typed errors, diagnostics, and non-pandas data pipelines.

Capability xbbg raw blpapi pdblp / blp bbg-fetch polars-bloomberg
BDP/BDS/BDH helpers yes manual SDK code yes yes partial
Intraday bars and ticks yes manual SDK code limited / no no partial
Streaming subscriptions yes manual SDK code no no no
BQL, BEQS, BSRCH, BQR, YAS, BTA broad helper coverage manual SDK code limited limited partial
DAPI, SAPI/B-PIPE, ZFP, TLS, failover, SOCKS5 configurable engine support manual SDK code limited limited limited
Async worker pools and isolated subscription sessions yes application-owned no no no
Rust request/parsing engine with Arrow-shaped output yes no no no no
Output backends beyond pandas Narwhals, native, PyArrow, pandas, Polars, DuckDB application-owned pandas-first pandas-first Polars-first
Typed errors, diagnostics, field cache, testing helpers yes application-owned limited limited limited
Usable install footprint (Windows x64, Python 3.14) xbbg 1.4.12 + narwhals 2.26.0, no blpapi = 18.245 MiB blpapi 3.26.8.1 = 14.702 MiB pdblp 0.1.8 + pandas 3.0.5 + numpy 2.5.3 + blpapi 3.26.8.1 = 130.816 MiB / blp 0.0.4 + pandas 3.0.5 + numpy 2.5.3 + blpapi 3.26.8.1 = 131.002 MiB bbg-fetch 3.2.0 + pandas 3.0.5 + numpy 2.5.3 + blpapi 3.26.8.1 = 130.863 MiB polars-bloomberg 0.6.0 + polars 1.44.2 + blpapi 3.26.8.1 = 191.118 MiB

Installation

pip install xbbg

Conda users can install the conda-forge build:

conda install -c conda-forge xbbg

blpapi is not required as a Python dependency. xbbg only needs Bloomberg's shared runtime library (blpapi3_64.dll on Windows, libblpapi3_64.so on macOS/Linux), which can come from Bloomberg Terminal/DAPI, a managed Bloomberg C++ SDK install, or Bloomberg's official blpapi wheel. Installing the wheel is just the easiest discovery path for many users:

pip install blpapi --index-url=https://blpapi.bloomberg.com/repository/releases/python/simple/

Supported Python versions: 3.10 through 3.14.

Requirements and notes:

  • You need an authorized Bloomberg environment: local Terminal/DAPI, SAPI/B-PIPE, or ZFP, depending on your setup.
  • If you build from source, stage the Bloomberg C++ SDK with bash ./scripts/sdktool.sh on macOS/Linux or .\\scripts\\sdktool.ps1 on Windows PowerShell.
  • If you manage the SDK yourself, set BLPAPI_ROOT or use xbbg.set_sdk_path(...).
  • On Windows Terminal installs, xbbg automatically probes DAPI runtime roots such as C:\blp\DAPI and C:\Program Files (x86)\Bloomberg\Blp\DAPI before requiring manual configuration.
  • Linux wheels are manylinux_2_28 (x86_64): any distro with glibc ≥ 2.28 works — RHEL/Alma/Rocky 8+, Debian 10+, Ubuntu 20.04+, Amazon Linux 2023.
  • Optional dataframe conversions are installed separately: xbbg[pyarrow], xbbg[pandas], xbbg[polars], or xbbg[duckdb].

Verify the install:

import xbbg

print(xbbg.__version__)
print(xbbg.get_sdk_info())

Quickstart

from xbbg import blp

# Reference data
prices = blp.bdp(["AAPL US Equity", "MSFT US Equity"], "PX_LAST")

# Historical data
hist = blp.bdh("SPX Index", "PX_LAST", "2024-01-01", "2024-12-31")

# Intraday bars
bars = blp.bdib("TSLA US Equity", dt="2024-01-15", interval=5)

Common request patterns:

from xbbg import blp, ovr

# Multiple fields
info = blp.bdp("NVDA US Equity", ["Security_Name", "GICS_Sector_Name", "PX_LAST"])

# Bloomberg-style overrides
vwap = blp.bdp("AAPL US Equity", "Eqy_Weighted_Avg_Px", VWAP_Dt="20240115")
adj = blp.bdp("AAPL US Equity", "CRNCY_ADJ_PX_LAST", overrides=ovr(EQY_FUND_CRNCY="EUR"))
per_sec = blp.bdp(
    ["AAPL US Equity", "MSFT US Equity"],
    "CRNCY_ADJ_PX_LAST",
    overrides=ovr(
        {
            "EQY_FUND_CRNCY": "USD",
            "AAPL US Equity": ovr(EQY_FUND_CRNCY="EUR"),
            "MSFT US Equity": ovr(EQY_FUND_CRNCY="JPY"),
        }
    ),
)

# Bulk data
holders = blp.bds("AAPL US Equity", "DVD_Hist_All", DVD_Start_Dt="20240101")

# BQL
result = blp.bql("get(px_last) for('AAPL US Equity')")

# Field lookup
fields = blp.bflds(search_spec="vwap")

# Equity screening and constituents
screen = blp.beqs(screen="MyScreen", asof="2024-01-01")
members = blp.index_members("SPX Index", asof="2024-01-02")

# Workflow helpers
active = blp.active_futures("ESA Index", "2024-01-15")
surface = blp.vol_surface("SPX Index", start_date="2024-01-02", end_date="2024-01-05")
resolved = blp.resolve_isins(["US0378331005", "INVALIDISIN000"])

ETF NAV / iNAV workflows live in xbbg.ext and resolve Bloomberg's authoritative ETF_NAV_TICKER / ETF_INAV_TICKER relationships instead of guessing ticker suffixes:

from xbbg import ext

# Relationship discovery: QQQ US Equity -> QQQNV Index / QXV Index,
# AT1 LN Equity -> null daily NAV / AT1IN Index (independently nullable)
rel = ext.etf_nav_relationships(["QQQ US Equity", "AT1 LN Equity"])

# Daily NAV/iNAV history: mapped Index targets price with PX_LAST; AT1's
# missing daily NAV falls back to the fund's FUND_NET_ASSET_VAL — see the
# nav_source_ticker / nav_source_field columns on every row
hist = ext.etf_nav_history(
    ["QQQ US Equity", "AT1 LN Equity"],
    start_date="2026-06-01",
    end_date="2026-07-01",
)

# Real-time iNAV: validates every mapping first, then subscribes to the
# resolved iNAV topics (here QXV Index) with LAST_PRICE by default
sub = await ext.asubscribe_etf_inav("QQQ US Equity")
async for table in sub:
    print(table.to_pylist())
    break
await sub.unsubscribe()

For longer walkthroughs and example output shapes, use the examples notebook or xbbg.org.

Exchange auctions and imbalance

Bloomberg publishes auction imbalance data (buy/sell imbalance, paired shares, indicative and theoretical prices, auction state) and auction results only on the listing where the auction runs. Composite tickers such as SPY US Equity return none of it from reference data and only part of it in streams, and a pricing-source suffix on an equity ISIN (/isin/<ISIN>@UP) is silently ignored. xbbg.ext routes each input to its auction venue and checks Bloomberg's answer before returning data:

from xbbg import ext

# SPY US Equity -> SPY UP Equity, IBM US Equity -> IBM UN Equity,
# US0378331005 (Apple's ISIN) -> AAPL UW Equity
venues = ext.resolve_venues(["SPY US Equity", "IBM US Equity", "US0378331005"])

# Default auction fields for each venue in one validated reference-data request
snap = ext.auction_snapshot(["SPY US Equity", "IBM US Equity"])

# Live: resolves every input first, then subscribes the venues;
# rows and status keep the identifiers you passed
sub = await ext.asubscribe_auction(["SPY US Equity", "IBM US Equity"])
async for table in sub:
    print(table.to_pylist())
    break
await sub.unsubscribe()

# A board you poll instead of iterating: rows=False keeps only current values
board = await ext.asubscribe_auction(["SPY US Equity", "IBM US Equity"], rows=False)
print(board.latest())  # current value of every field, one row per security
await board.unsubscribe()
Input Auction venue Checked against
Equity or ETF composite ticker, or its ISIN {TICKER} {EQY_PRIM_EXCH_SHRT} Equity venue EXCH_CODE
Explicit exchange ticker (SPY UP Equity) unchanged venue EXCH_CODE
Preferred (Pfd) ISIN /isin/<ISIN>@<PCS>, from a packaged exchange table (NEW YORK → SNY2, Nasdaq → NASP, NYSE AMERICAN → AMEX) or pcs_overrides={...} venue PRICING_SOURCE

Rows that cannot be routed or validated come back as unresolved, unsupported, or mismatch and never carry data. subscribe_auction/stream_auction raise BlpValidationError before subscribing if any input fails or two inputs route to the same venue. Routing lookups are cached for 12 hours per input; the venue is still checked against Bloomberg on every call.

ext.AUCTION groups the fields: IMBALANCE, INDICATIVE, STATE, HALTS, RESULTS, COMPOSITE, QUOTES; DEFAULT is the first five. They use streaming names such as THEO_PRICE and BID, which reference data also accepts; live subscriptions reject static names such as PX_THEO and PX_BID.

Reading the data:

  • Values are raw and venue-specific. INDICATIVE_NEAR/INDICATIVE_FAR are NYSE's continuous-book and closing-only clearing prices but Nasdaq's near/far indicative prices; IMBALANCE_CROSS_TYPE_RT codes differ by venue.
  • IMBALANCE_BUY and IMBALANCE_SELL are prices, not quantities. ext.imbalance_side(code) maps BUY/MBUY/RBUY to "buy", SELL/MSEL/RSEL to "sell", and NOIM/NIMB to "none".
  • THEO_PRICE and VOLUME_THEO reset to 0 at the start of each auction call, and Bloomberg sends 0 for a price it does not have. Auction subscriptions therefore show 0 in THEO_PRICE, INDICATIVE_NEAR, INDICATIVE_FAR, IMBALANCE_BUY, IMBALANCE_SELL, and REFERENCE_PRICE_RT (ext.AUCTION.ZERO_PRICE_FIELDS) as missing in latest(); pass zero_as_null=() to keep the zeros. Rows always carry the raw values. Imbalance values can persist after an auction ends: use AUCTION_TYPE_REALTIME, IN_AUCTION_RT, and the live column of latest() to tell current values from leftovers.
  • Time-of-day fields such as IMBALANCE_TIMESTAMP_RT are times without a date, in the terminal's local time zone, in snapshots and streams alike. Date fields such as CLOSING_AUCTION_VOLUME_DATE_RT are dates.
  • Bloomberg keeps no imbalance history; record the stream to keep it (see Recording a stream). Auction results do have history on the venue listing, for example blp.bdh("IBM UN Equity", "OFFICIAL_CLOSE_AUCTION_VOLUME", ...); the composite returns none.
  • Reference data has no delayed/real-time flag; live subscriptions warn when a stream is delayed (see Subscriptions).

Node exposes engine.resolveVenues(), engine.auctionSnapshot(), engine.subscribeAuction(), engine.streamAuction(), AuctionFields, and imbalanceSide(). The LangGraph adapters add xbbg_resolve_venues and xbbg_auction_snapshot, and the MCP server adds resolve_venues and auction_snapshot.

Python LangChain and LangGraph

py-xbbg-langgraph provides the separate xbbg-langgraph distribution, imported as xbbg_langgraph. It exposes the same 34 tool names as the JavaScript adapter: 23 Bloomberg request/recipe/snapshot tools and 11 extension helpers, including inline Vega-Lite chart specifications. Python arguments and factory names use snake_case.

Install from this checkout (the new distribution has not yet been published):

pip install ./py-xbbg-langgraph
# For the agent example below:
pip install langchain langchain-openai
# For custom graphs without the LangChain agent package:
pip install "langgraph>=1.2,<2"

Requires Python 3.10–3.14, xbbg 1.4.12+, and langchain-core 1.4+. Graph workflows target LangGraph 1.2+. The adapter installs langchain-core and Pydantic; ordinary xbbg installs remain unchanged. Live requests still require authorized Bloomberg connectivity and SDK runtime libraries. Tool creation and schema inspection do not import the native extension or start a session.

from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
from xbbg_langgraph import BLOOMBERG_TOOL_INSTRUCTIONS, create_all_bloomberg_tools

tools = create_all_bloomberg_tools(
    max_securities=10,
    max_fields=25,
    max_rows=500,          # Application artifact
    max_content_rows=50,  # Model-facing preview
    disabled_tools={"xbbg_bql", "xbbg_bsrch"},
)

# Configure OPENAI_API_KEY and Bloomberg access before invoking.
agent = create_agent(
    model=ChatOpenAI(model="gpt-4.1"),
    tools=tools,
    system_prompt=BLOOMBERG_TOOL_INSTRUCTIONS,
)
result = agent.invoke({
    "messages": [{"role": "user", "content": "Get PX_LAST for IBM US Equity."}],
})

For custom LangGraph workflows, pass these tools to langgraph.prebuilt.ToolNode and bind the same list to your model. create_bloomberg_tools() returns only the 23 core tools; create_bloomberg_ext_tools() returns the 11 helpers. Individual factories such as create_bdp_tool() are also exported. Factories accept either keyword options or one BloombergToolsOptions instance, not both.

All tools support .invoke() and .ainvoke(). Use .ainvoke() inside a running event loop. A full LangChain tool call produces a ToolMessage with independently bounded content and artifact:

from xbbg_langgraph import create_bdp_tool

tool = create_bdp_tool(max_securities=1, max_fields=1)
message = tool.invoke({
    "type": "tool_call",
    "id": "reference-price",
    "name": "xbbg_bdp",
    "args": {"securities": ["IBM US Equity"], "fields": ["PX_LAST"]},
})
print(message.content)
print(message.artifact)

Calling with bare arguments instead returns the content string, following LangChain's normal contract. Envelopes retain the JavaScript keys tool, data, rowCount, truncated, and optional truncation/hasErrors. Defaults cap artifacts at 1 MiB and content at 64 KiB, with additional node, depth, and string limits. Native Arrow rows are sliced before conversion; snapshot tables share one materialization allowance. Errors and entitlement metadata take priority over ordinary data. Binary values, including sparse-update presence bitmaps, use tagged base64 rather than losing null-versus-absent information.

Snapshots require max_updates; timeout_ms cannot exceed max_stream_wait_ms (15 seconds by default). They close subscriptions on completion, timeout, error, or cancellation. Successful collection with a cleanup failure retains the updates and reports unsubscribeError. Depth snapshots without explicit fields request all available scalar fields; all_fields=False requires a nonempty field list.

Pass engine=your_xbbg_engine to route tools through an application-owned xbbg.blp.Engine; otherwise they use xbbg's existing global/scoped engine. The adapter never reconfigures or shuts down that engine. request_timeout is a coroutine deadline in seconds (default 60), not a way to preempt synchronous SDK startup or subscription cleanup. Configure the engine's connection/request timeouts for those boundaries.

Output caps do not limit Bloomberg's upstream response size. Native metadata getters and an individual native cell can allocate before projection. Request bounded universes and date ranges even when the returned preview is small.

Python-specific boundaries:

  • Recipe tickers must be fully qualified; builders never guess a US Equity suffix. Recipe fields accept identifiers and argument-free BQL field access, not arbitrary query fragments. Use xbbg_bql for parameterized expressions.
  • active_only is not exposed because the current native corporate-bond builder does not implement that filter. Unsupported BQL/BFLDS keyword options are also rejected rather than ignored.
  • CDX recovery_rate uses Python's percentage convention: 40 means 40%, not 0.40.
  • Chart tools do not fetch data or render it. Render only when data.spec is present and data.renderable is not false. Explicit max_points truncation preserves a valid inline spec; structural result clipping disables rendering.

Adapter checks: pip install "./py-xbbg-langgraph[test]", then pytest py-xbbg-langgraph/tests. The existing CI Python matrix and dependency-floor job run this suite.

JavaScript and Node

xbbg also ships supported Node bindings in @xbbg/core. The JS layer uses the same Rust engine through a native N-API addon, so Node can use the same Bloomberg connection modes and request surfaces as Python.

npm install @xbbg/core
# or
bun add @xbbg/core

The packages target Node.js 24+ server runtimes. Packaged native addons are provided for macOS arm64, Linux x64 (glibc 2.28+), and Windows x64. You still need Bloomberg access plus Bloomberg SDK runtime libraries on the target system.

import * as xbbg from '@xbbg/core';

xbbg.configure({ host: 'localhost', port: 8194 });

const hist = await xbbg.blp.abdh(['AAPL US Equity'], ['PX_LAST'], '2024-01-01', '2024-12-31');
const ref = await xbbg.blp.abdp(['AAPL US Equity'], ['PX_LAST', 'SECURITY_NAME']);

See js-xbbg/README.md for platform packaging, runtime prerequisites, and the supported JavaScript API surface.

For LangChain and LangGraph agents, use the supported @xbbg/langgraph adapter. It exposes reusable server-side Bloomberg tools backed by @xbbg/core without making MCP, a chat app, or a browser integration the core path:

npm install @xbbg/langgraph @xbbg/core @langchain/core
import { createAllBloombergTools, BLOOMBERG_TOOL_INSTRUCTIONS } from '@xbbg/langgraph';

const tools = createAllBloombergTools({ maxSecurities: 10, maxFields: 10 });

Use the existing apps/xbbg-mcp package only when you specifically need MCP.

Configuration and engines

By default, xbbg starts a Rust-backed engine and connects to local Bloomberg Desktop API / DAPI on localhost:8194. Configure the engine before the first request when you need a different transport, authentication mode, worker count, timeout policy, field cache, or logging behavior.

from xbbg import blp, configure

# Equivalent to the default local Terminal / DAPI path
configure(host="localhost", port=8194)

print(blp.bdp("AAPL US Equity", "PX_LAST"))

Common environments:

Environment Use when Configuration shape
Desktop API / DAPI Local Bloomberg Terminal session no config, or configure(host="localhost", port=8194)
Direct server / SAPI Firm-managed Bloomberg server configure(host="bpipe-host", port=8194, auth_method="app", app_name="...")
B-PIPE Enterprise Bloomberg feed infrastructure direct host/failover config plus the auth/TLS settings your Bloomberg setup requires
ZFP leased line Bloomberg zero-footprint leased-line path configure(zfp_remote="8194", tls_client_credentials="...", tls_trust_material="...")

Example B-PIPE/SAPI-style configuration:

from xbbg import configure

configure(
    host="bpipe-host",
    port=8194,
    auth_method="app",
    app_name="my-app",
    request_pool_size=4,
    # Opt-in sharding for wide multi-security BDP/BDH requests:
    # shard_requests=True,
    # shard_threshold=20,
    # shard_chunk_size=16,
    # shard_max_concurrent=4,
    subscription_pool_size=2,
    num_start_attempts=5,
)

Example ZFP leased-line configuration:

from xbbg import configure

configure(
    zfp_remote="8194",
    tls_client_credentials="/path/to/client.p12",
    tls_client_credentials_password="<load from your secret store>",
    tls_trust_material="/path/to/trust.pem",
)

The engine uses separate worker pools for request/response calls and subscriptions:

  • request workers hold independent Bloomberg sessions and dispatch BDP/BDH/BDS/BQL-style calls across the pool
  • subscription sessions are isolated from request workers, so live streams do not share a single blocking session with batch requests
  • field validation, field-type caching, SDK logging, retry policy, keep-alive, slow-consumer thresholds, TLS, SOCKS5, and failover servers are configuration options rather than per-call ad hoc code

runtime_worker_threads defaults to 2 (minimum 1) and controls the engine's shared Tokio runtime, not the total process thread count. subscription_pool_size is the pre-warm count (default 1, minimum 0); max_subscription_sessions caps concurrent subscription sessions (default 32, minimum 1, and at least subscription_pool_size). Native subscription admission waits for capacity instead of allocating unbounded sessions. Sessions host shared market-data feeds (see Subscriptions): a subscription that only joins existing feeds uses no session, and a session returns to the pool once it hosts no feeds. Node uses the corresponding runtimeWorkerThreads, subscriptionPoolSize, and maxSubscriptionSessions fields.

Use Engine(...) when an application needs a scoped engine with its own connection settings instead of mutating global configuration.

Engine shutdown closes subscription admission and signals both idle and checked-out sessions, waking pending operations so termination and errors can reach callers. Close subscriptions explicitly before releasing their engine; do not rely on interpreter teardown for application cleanup.

Field-cache snapshots are published atomically. On Windows this uses FileRenameInfoEx with POSIX rename semantics, requiring Windows 10 1607+ and a supporting filesystem. Existing readers can finish with the old snapshot while new opens see the complete replacement. Unsupported filesystems report persistence errors and retain the prior snapshot; there is no unsafe replacement fallback.

Common API surface

Area Functions
Reference and bulk data bdp, bds, bflds, fieldInfo, fieldSearch, blkp, bport
Historical data bdh, dividend, earnings, turnover, dividend_yield
Intraday data bdib, bdtick
Query and screening bql, beqs, bsrch, bqr, bcurves, bgovts, etf_holdings, index_members
Analytics and utilities yas, bta, ta_studies, ta_study_params, convert_ccy, fut_ticker, active_futures, futures_curve, vol_surface, resolve_isins, issuer_isins, cdx_ticker, active_cdx
Exchange auctions (xbbg.ext) resolve_venues, auction_snapshot, subscribe_auction, stream_auction, AUCTION, imbalance_side
Real-time data subscribe, stream, vwap, mktbar, depth, chains, subscription_feeds
Generic requests request, Service, Operation, RequestParams, OutputMode
Schema and diagnostics bops, bschema, get_sdk_info, enable_sdk_logging, print_backend_status
Testing helpers xbbg.testing.create_mock_response, xbbg.testing.mock_engine

Most sync helpers have async counterparts with an a prefix: bdp → abdp, bdh → abdh, bdib → abdib, request → arequest.

Entitlement IDs

Bloomberg can return entitlement IDs only for these four request operations. Opt in with return_eids=True:

Bloomberg operation Python routes
ReferenceDataRequest blp.bdp, blp.bds (BDS uses the reference-data operation)
HistoricalDataRequest blp.bdh
IntradayBarRequest blp.bdib
IntradayTickRequest blp.bdtick

For example, request EIDs with intraday ticks and check them against the default //blp/refdata service:

from xbbg import blp

ticks = blp.bdtick(
    "AAPL US Equity",
    "2024-01-15T09:30:00",
    "2024-01-15T10:00:00",
    return_eids=True,
    backend="native",
)

eid_data = ticks.eid_data or {}
eids = sorted({eid for security_eids in eid_data.values() for eid in security_eids})
if eids:
    print(blp.check_entitlements(eids))

EID metadata remains available through the native ArrowTable.eid_data property, pandas attrs["xbbg_eid_data"], or PyArrow schema metadata under xbbg.eid_data. Polars and DuckDB do not provide a stable entitlement-metadata side channel; use the native, PyArrow, or pandas backend when EIDs are required.

This opt-in request metadata is separate from a subscription message's top-level EID field.

Output backends

xbbg defaults to a Narwhals DataFrame. When PyArrow is installed, the Narwhals frame is backed by a real pyarrow.Table; otherwise xbbg falls back through available dataframe libraries and finally to its native Arrow carrier.

from xbbg import Backend, blp

# Default Narwhals output
frame = blp.bdh("SPX Index", "PX_LAST", "2024-01-01", "2024-12-31")

# Explicit native xbbg Arrow carrier
table = blp.bdp("AAPL US Equity", "PX_LAST", backend="native")

# Optional conversions
as_pyarrow = blp.bdp("IBM US Equity", "PX_LAST", backend=Backend.PYARROW)
as_pandas = blp.bdp("MSFT US Equity", "PX_LAST", backend=Backend.PANDAS)
as_polars = blp.bdp("AAPL US Equity", "PX_LAST", backend=Backend.POLARS)
as_duckdb = blp.bdh("SPX Index", "PX_LAST", "2024-01-01", "2024-12-31", backend=Backend.DUCKDB)

Output shape is controlled with format=, including long, long_typed, long_metadata, and semi_long.

  • Native ArrowTable, ArrowRecordBatch, and ArrowColumn slices can retain their source allocations. Use .compact() when retaining a small result should release that backing storage: it returns an independent copy of the logical values with right-sized buffers, preserving schema, nulls, and physical batch/chunk boundaries. Native zero-column tables retain their row count.
  • Polars conversion preserves Arrow chunks rather than implicitly rechunking. The supported floor is Polars >=0.20.4; older supported versions use PyArrow when available or schema-aware per-batch materialization, while capsule-capable versions consume the native Arrow stream. Install xbbg[polars] to include the timezone data required on Windows.
  • backend="polars_lazy" returns a Polars LazyFrame; backend="narwhals_lazy" returns a genuine Narwhals lazy frame backed by Polars and requires Polars. Bloomberg retrieval and Arrow-to-Polars conversion have already happened: only subsequent local dataframe operations are deferred, with no Bloomberg query pushdown.
  • DuckDB results use isolated per-relation connections to one shared process-local in-memory database, not a new database per conversion. A retained relation keeps its connection and registered Arrow input alive; releasing one relation does not invalidate another. The shared database anchor is closed at process exit. If this backend was initialized before a fork, xbbg refuses inherited backend use or explicit close in the child; use multiprocessing spawn or fork before initializing the DuckDB backend.

Async usage

Use async helpers directly in async applications:

import asyncio
from xbbg import blp

async def main():
    aapl, msft = await asyncio.gather(
        blp.abdp("AAPL US Equity", "PX_LAST"),
        blp.abdp("MSFT US Equity", "PX_LAST"),
    )
    return aapl, msft

result = asyncio.run(main())

In Jupyter, VS Code Interactive, and marimo, every sync call, including blp.bdp(...), blp.bql(...), and blp.subscribe(...), uses a notebook-only bridge when the notebook event loop is already running. Generic async applications such as FastAPI or ASGI services should still use the async APIs directly.

Subscriptions: raw, tick mode, and all fields

Use asubscribe() when you need dynamic add/remove, explicit unsubscribe, raw Arrow batches, or subscription health diagnostics. Use astream() for the simple async iterator, or stream() for synchronous iteration.

from xbbg import asubscribe

sub = await asubscribe(
    ["AAPL US Equity"],
    ["LAST_PRICE", "BID", "ASK"],
    tick_mode=True,
    all_fields=True,
    conflate=True,
)

async for tick in sub:
    print(tick)       # dict ticks in tick_mode
    print(sub.stats)  # messages_received, dropped_batches, data_loss_events, ...
    break

await sub.unsubscribe()
raw_sub = await asubscribe(["AAPL US Equity"], ["LAST_PRICE"], raw=True)

async for batch in raw_sub:
    print(batch.to_table())  # raw xbbg ArrowRecordBatch -> ArrowTable
    break

await raw_sub.unsubscribe()

Key behaviors:

  • output accepts exactly record_batch, backend, dict, or tick (case-insensitive); an explicit selector overrides both raw and tick_mode
  • raw=True or output="record_batch" yields raw xbbg ArrowRecordBatch values for max-performance consumers
  • tick_mode=True, output="dict", or output="tick" returns native dict ticks and implies raw subscription mode
  • output="backend" returns the configured backend output, the same as default iteration without raw=True
  • all_fields=True exposes all top-level scalar Bloomberg subscription fields; unrequested arrays/complex fields are omitted, while explicitly requested unsupported shapes fail rather than being truncated
  • filtered mode keeps requested fields plus MKTDATA_EVENT_TYPE and MKTDATA_EVENT_SUBTYPE; market-data rows that contain none of the requested fields are skipped, except the one-row initial image described under shared feeds
  • conflate=True requests Bloomberg-conflated quote updates on //blp/mktdata; trades are still delivered as received
  • sub.add(...), sub.remove(...), sub.add_fields(...), sub.latest(), sub.status, sub.events, sub.failed_tickers, sub.field_errors, and sub.stats expose runtime control and diagnostics
  • use async with on an acquired subscription or try/finally with await sub.unsubscribe() for deterministic cleanup; unsubscribe(drain=True) returns a list in the same dict/raw/backend representation as iteration (an empty drain is []). An unread stream failure is raised after cleanup, never hidden by a successful partial drain.

Subscription rows are deltas, not complete images. In dict ticks, a missing key means unchanged; a present None means an explicit Bloomberg clear. Arrow batches retain nullable data columns and append non-null binary __xbbg_present: bit i (least-significant bit first) marks whether schema column i + 2 is present, after timestamp and topic. A set bit plus a null cell is a clear; an unset bit is unchanged. Use each batch's current schema because all-fields layouts can grow or promote types. Schema metadata key xbbg.subscription_presence documents the encoding and mapping.

Native queues fail closed on any continuity gap: Bloomberg DATALOSS, a full drop_newest buffer, or overflow/timeout of the bounded block forwarder. Already committed queue data is followed by one BlpSubscriptionDataLossError, then EOF; no post-gap deltas are delivered. Its topic and detail identify the gap (topic="*" denotes unattributed/session-wide loss). Resubscribe for a fresh image before applying further deltas. Terminal session errors also wake pending reads, including handles whose topics were all removed. Ordinary connection-down notifications remain nonterminal, and a single rejected topic does not terminate healthy siblings.

Shared feeds. Within one engine, //blp/mktdata subscriptions to the same security with the same options share one Bloomberg subscription that requests the union of their fields, so a second subscription to a security does not open a second feed. A subscription that joins an existing feed immediately receives one SUMMARY/INITPAINT row built from the feed's current values (with no data columns present if none of its fields have a value yet). Asking for fields the feed lacks (a new subscription, add(...), or add_fields(...)) re-subscribes the feed once. The requesting subscription receives Bloomberg's full repaint shortly after the call returns; subscriptions that already had the image receive one SUMMARY/INITPAINT row only if the repaint changes one of their fields, containing just the changed values and clears. Because filtered subscriptions skip rows without their fields, their output does not depend on who else shares the feed; all_fields=True subscriptions see every scalar field the feed receives, including fields other subscriptions requested. Pass isolated=True to keep a subscription on its own feeds and session. vwap, mktbar, depth, chains, and other non-//blp/mktdata services are never shared. When a session terminates, only the securities on that session fail; a stream ends with the session error once none of its securities remain. xbbg.subscription_feeds() returns one dict per feed with its service, topic, options, field union, consumer count, delayed flag, state, and field errors.

Current values and labels. sub.latest() returns one row per security with the current value of each field plus last_update, live (a non-initial update has arrived), and delayed. Column types start from Bloomberg's field metadata when you subscribe, so latest() and stream columns are typed before any value arrives; if the first value Bloomberg sends has a different type, that type wins. zero_as_null=[...] shows 0 as missing in latest() for the listed fields (rows keep the raw value). Once a subscription has ended, latest() raises instead of returning an empty table. aliases={"SPY UP Equity": "SPY US Equity"} makes rows, status, and remove(...) use your label instead of the Bloomberg topic.

Boards without rows. asubscribe(..., rows=False) keeps only current values for latest(): nothing is queued, so a subscription you only poll cannot overflow, and iterating it raises RuntimeError. If Bloomberg reports DATALOSS, xbbg re-subscribes the feed for a fresh image instead of ending the subscription: live turns false and a DataLoss event is recorded, then the image is rebuilt from Bloomberg's new paint and a FeedRecovered event follows. Subscriptions that read rows still fail closed on data loss, because they must see the gap.

Delayed data and rejected fields. Bloomberg marks delayed streams with IS_DELAYED_STREAM; xbbg reads it for every subscription, records sub.topic_states[topic]["delayed"], and by default warns once per security with BlpDelayedDataWarning (Node: process.emitWarning with type BlpDelayedDataWarning). on_delayed="raise" fails that security instead while its siblings keep streaming; on_delayed="ignore" only records the flag. Fields Bloomberg rejects when the subscription starts (for example static-only PX_BID, which live subscriptions call BAD_FLD) are listed in sub.field_errors and reported once with BlpFieldWarning, instead of silently staying empty. on_field_error="raise" fails the securities that requested a rejected field while their siblings keep streaming; on_field_error="ignore" records the error without a warning.

Python stream() producers share one managed background event-loop thread, not a thread per stream. Each sync bridge has a bounded queue (stream_capacity, default 256, minimum 1) and asynchronously waits for consumer space; native overflow policy remains separate. A sync stream that only joins existing shared feeds needs no subscription session; one that needs a session waits up to 5 seconds for capacity when all max_subscription_sessions are in use and then raises RuntimeError instead of blocking forever. Callbacks run on the consuming thread. Close the generator explicitly when stopping early: close cancels and waits for producer cleanup, and a cleanup timeout is reported. In async applications use astream() directly and close it explicitly when retaining the generator after an early exit.

In Node, pass { allFields: true } to stream() / subscribe() helpers for the same top-level field expansion. Default iteration yields scalar Tick objects; sub.arrow() constructs Arrow JS tables without IPC for supported schemas. Exposed mutable buffers are JS-owned snapshots: exclusive bounded allocations can be transferred, while shared/sliced/oversized storage is copied or canonicalized first. This is not a universal zero-copy Rust/JS boundary. Choose scalar or Arrow reads once per subscription; see the Node lifecycle and benchmark contracts.

Recording a stream

Bloomberg keeps no history for imbalance and other auction-call fields, so record the stream if you need it later. Raw batches convert to PyArrow record batches that can be appended to Parquet. Keep __xbbg_present so a reader can tell unchanged fields from explicit clears, and start a new file when the schema changes:

import pyarrow.parquet as pq
from xbbg import ext

sub = await ext.asubscribe_auction(["IBM US Equity"], raw=True)
writer, part = None, 0
try:
    async for batch in sub:
        batch = batch.to_pyarrow()
        if writer is None or batch.schema != writer.schema:
            if writer is not None:
                writer.close()
            part += 1
            writer = pq.ParquetWriter(f"ibm-auction-{part}.parquet", batch.schema)
        writer.write_batch(batch)
finally:
    await sub.unsubscribe()
    if writer is not None:
        writer.close()

MCP server

The repository also includes a local MCP server for coding-agent workflows. It wraps selected xbbg request/response operations and returns bounded JSON results with schema metadata.

See apps/xbbg-mcp/README.md for installation, supported environment variables, raw GitHub Release tar/zip assets, and the xbbg-mcp-v<VERSION>.mcpb local connector artifact. Official MCP Registry publication uses the generated server.json metadata after the matching GitHub Release contains the .mcpb; no MCP release asset includes Bloomberg SDK files or runtime components.

Troubleshooting

Empty results usually mean one of the inputs or entitlements is wrong rather than that the Python call failed:

from xbbg import blp

# Check security lookup and field discovery
print(blp.blkp("Apple", yellowkey="eqty"))
print(blp.fieldSearch("vwap"))

Connection failures:

  • confirm Bloomberg Terminal is running and logged in for local DAPI usage
  • confirm the host, port, auth method, TLS files, and entitlements for SAPI/B-PIPE/ZFP environments
  • run print(xbbg.get_sdk_info()) to see how the SDK/runtime was detected
  • enable SDK logging before the first session when debugging low-level connection problems

Timeouts and large responses:

  • increase per-request timeout where appropriate
  • split large historical/tick requests into smaller date ranges
  • enable opt-in sharding for wide multi-security bdp/bdh requests with shard_requests=True
  • tune request_pool_size, subscription_pool_size, queue sizes, and keep-alive settings for managed infrastructure

When reporting issues, include:

  1. xbbg version: import xbbg; print(xbbg.__version__)
  2. Python version and operating system
  3. Bloomberg connection mode: DAPI, SAPI/B-PIPE, ZFP, or other
  4. minimal code to reproduce
  5. full traceback or error message

Development

Set up the development environment with pixi:

# Stage an authorized Bloomberg SDK locally under vendor/blpapi-sdk/
bash ./scripts/sdktool.sh               # macOS/Linux
# .\scripts\sdktool.ps1                # Windows PowerShell

# Install the environment and compile the Rust extension
pixi install
pixi run install

Common checks:

pixi run test
pixi run lint
pixi run ci

For non-live tests, use xbbg.testing:

from xbbg import blp
from xbbg.testing import create_mock_response, mock_engine

response = create_mock_response(
    service="//blp/refdata",
    operation="ReferenceDataRequest",
    data={"AAPL US Equity": {"PX_LAST": 101.23}},
)

with mock_engine([response]):
    df = blp.bdp("AAPL US Equity", "PX_LAST")

Publishing is handled through GitHub Actions and PyPI Trusted Publishing.

Citation

If you use xbbg in research or published work, please cite:

@software{xbbg,
  author = {{xbbg contributors}},
  title = {{xbbg}: Independent client for Bloomberg-connected data workflows},
  year = {2026},
  publisher = {GitHub},
  url = {https://github.com/underloam/xbbg},
  version = {1.3.0}
}

Metadata

Release files for xbbg 1.5.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for xbbg 1.5.0
File Size Uploaded
xbbg-1.5.0.tar.gz 927.5 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for xbbg 1.5.0
File
xbbg-1.5.0-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details
xbbg-1.5.0-cp314-cp314-manylinux_2_28_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.28+ x86-64 Details
xbbg-1.5.0-cp314-cp314-macosx_11_0_universal2.whl CPython 3.14 CPython 3.14 macOS 11.0+ universal2 (ARM64, x86-64) Details
xbbg-1.5.0-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
xbbg-1.5.0-cp313-cp313-manylinux_2_28_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.28+ x86-64 Details
xbbg-1.5.0-cp313-cp313-macosx_11_0_universal2.whl CPython 3.13 CPython 3.13 macOS 11.0+ universal2 (ARM64, x86-64) Details
xbbg-1.5.0-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
xbbg-1.5.0-cp312-cp312-manylinux_2_28_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.28+ x86-64 Details
xbbg-1.5.0-cp312-cp312-macosx_11_0_universal2.whl CPython 3.12 CPython 3.12 macOS 11.0+ universal2 (ARM64, x86-64) Details
xbbg-1.5.0-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
xbbg-1.5.0-cp311-cp311-manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ x86-64 Details
xbbg-1.5.0-cp311-cp311-macosx_11_0_universal2.whl CPython 3.11 CPython 3.11 macOS 11.0+ universal2 (ARM64, x86-64) Details
xbbg-1.5.0-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
xbbg-1.5.0-cp310-cp310-manylinux_2_28_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.28+ x86-64 Details
xbbg-1.5.0-cp310-cp310-macosx_11_0_universal2.whl CPython 3.10 CPython 3.10 macOS 11.0+ universal2 (ARM64, x86-64) Details

Total release size: 67.0 MB

Release files / xbbg-1.5.0.tar.gz

Download URL xbbg-1.5.0.tar.gz
Size 927.5 kB
Tags Source
SHA-256 checksum
How to use checksums
d2d89f32116cc2f1d092365281ccb6e0d94290b0b65cec108d156858ce25d1fc
BLAKE2b-256 checksum
How to use checksums
02f67319e2645892b004e368c8364b4362cf2cf7e4fd23b09b3407c35a4c3727
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.

Transparency log

Release files / xbbg-1.5.0-cp314-cp314-win_amd64.whl

Download URL xbbg-1.5.0-cp314-cp314-win_amd64.whl
Size 4.5 MB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
9e047065adb654defd179cc39bffaf57963fc36958abd24267891874a2f42205
BLAKE2b-256 checksum
How to use checksums
65767d60966537a85c97aebfa34c178a56141751cadfa13d3cbeaf435bd7fce5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.

Transparency log

Release files / xbbg-1.5.0-cp314-cp314-manylinux_2_28_x86_64.whl

Download URL xbbg-1.5.0-cp314-cp314-manylinux_2_28_x86_64.whl
Size 4.8 MB
Tags CPython 3.14 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
5c8e53ed4183eb3a94ca4983c71b2c4fd780b5c82745cfd4f0cce3dbe01b8c03
BLAKE2b-256 checksum
How to use checksums
ef42ec673db82e7dfe774f6b5d747d45878ac037e367c1e0d371e305512acb2c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.

Transparency log

Release files / xbbg-1.5.0-cp314-cp314-macosx_11_0_universal2.whl

Download URL xbbg-1.5.0-cp314-cp314-macosx_11_0_universal2.whl
Size 4.0 MB
Tags CPython 3.14 macOS 11.0+ universal2 (ARM64, x86-64)
SHA-256 checksum
How to use checksums
de2533c3b65bc81c9f12fe1892ff523e451bfb14187c774d0d6bb675d14faf5d
BLAKE2b-256 checksum
How to use checksums
0f015b073b3dc229d87a0698c081f2cea01c57e26e39caef3636abe44a47f69d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.

Transparency log

Release files / xbbg-1.5.0-cp313-cp313-win_amd64.whl

Download URL xbbg-1.5.0-cp313-cp313-win_amd64.whl
Size 4.4 MB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
dc1ababeca6bad38e78e8496212cd12ebb749b85e348c7575f321a3e53823a17
BLAKE2b-256 checksum
How to use checksums
d0a40c58c7ba15cbe6ee6d2e0b560d4438f81bc91604326752385ae3aa23a0ec
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.

Transparency log

Release files / xbbg-1.5.0-cp313-cp313-manylinux_2_28_x86_64.whl

Download URL xbbg-1.5.0-cp313-cp313-manylinux_2_28_x86_64.whl
Size 4.8 MB
Tags CPython 3.13 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
0981444c8708cd35ff8493bc0c7d1c27cf1b1d51e30278f52cb4b80d49d72c09
BLAKE2b-256 checksum
How to use checksums
a8277f9dc18c3cd029ab7bbbdd25c8866d93c0e70e07f372b850e21853768dbf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.

Transparency log

Release files / xbbg-1.5.0-cp313-cp313-macosx_11_0_universal2.whl

Download URL xbbg-1.5.0-cp313-cp313-macosx_11_0_universal2.whl
Size 4.0 MB
Tags CPython 3.13 macOS 11.0+ universal2 (ARM64, x86-64)
SHA-256 checksum
How to use checksums
d0c7496069fa8017835f9af6b11045cdfaa8393e2a943b2a4f0774a422aa8b80
BLAKE2b-256 checksum
How to use checksums
d2bb285e3d31828720b41f9ae54d0da9b68a295ebe7c2c5fc72291b2a1ff7708
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.

Transparency log

Release files / xbbg-1.5.0-cp312-cp312-win_amd64.whl

Download URL xbbg-1.5.0-cp312-cp312-win_amd64.whl
Size 4.4 MB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
4f02a89e15bad6cd7cb70609b61245513943a81c0fb1e065ae028e7714df6610
BLAKE2b-256 checksum
How to use checksums
626cbe21abe832bee0c57b4071bbb404f334e3e01f7ae638cf01f5608dd26739
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.

Transparency log

Release files / xbbg-1.5.0-cp312-cp312-manylinux_2_28_x86_64.whl

Download URL xbbg-1.5.0-cp312-cp312-manylinux_2_28_x86_64.whl
Size 4.8 MB
Tags CPython 3.12 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
8d3f0cde6a126141246e250806bf435397a57b96231b64261e4a0633cdde7874
BLAKE2b-256 checksum
How to use checksums
c2e70f8af826b831682c24b4ab80d235322f84bdfb8ef5b25ae1b83b2a1f5481
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.

Transparency log

Release files / xbbg-1.5.0-cp312-cp312-macosx_11_0_universal2.whl

Download URL xbbg-1.5.0-cp312-cp312-macosx_11_0_universal2.whl
Size 4.0 MB
Tags CPython 3.12 macOS 11.0+ universal2 (ARM64, x86-64)
SHA-256 checksum
How to use checksums
0bfffe7aa555c43ac03546ebb167e24b74d8e1e7c68d23f81f587a32fc6c26f7
BLAKE2b-256 checksum
How to use checksums
dd0da256b50abc1787b812e1d5157f2ad95c0608d0716edb4b00ebf7cd82827d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.

Transparency log

Release files / xbbg-1.5.0-cp311-cp311-win_amd64.whl

Download URL xbbg-1.5.0-cp311-cp311-win_amd64.whl
Size 4.4 MB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
387361c17a8271203616f10b48c9bfc6bb66f19fd8b2fc6e434f89e61af6d375
BLAKE2b-256 checksum
How to use checksums
829620e84aecc6929c44aeb2869e5b50e922076738505f53e9131900a3bfad0e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.

Transparency log

Release files / xbbg-1.5.0-cp311-cp311-manylinux_2_28_x86_64.whl

Download URL xbbg-1.5.0-cp311-cp311-manylinux_2_28_x86_64.whl
Size 4.8 MB
Tags CPython 3.11 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
a4814c225e114c8657f945ab68f451c0bd42e18e88c6bdf92f02933428c8b042
BLAKE2b-256 checksum
How to use checksums
776ff3a917986e5e5969649e0a9628324825c8f9818b7c630650c6ad8e53ea7e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.

Transparency log

Release files / xbbg-1.5.0-cp311-cp311-macosx_11_0_universal2.whl

Download URL xbbg-1.5.0-cp311-cp311-macosx_11_0_universal2.whl
Size 4.0 MB
Tags CPython 3.11 macOS 11.0+ universal2 (ARM64, x86-64)
SHA-256 checksum
How to use checksums
ddbaf91d791b0555269d068c6abf926fedd889c881fb4728e2af624a9b9ef744
BLAKE2b-256 checksum
How to use checksums
84c89c075e1ca0745a51882d1bf2d6627b360bbfef3ed6dc8bdbe2d2a7424a4f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.

Transparency log

Release files / xbbg-1.5.0-cp310-cp310-win_amd64.whl

Download URL xbbg-1.5.0-cp310-cp310-win_amd64.whl
Size 4.4 MB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
bf098e984fd018d8648b384b71dcea3a10b056b65f224ce941d29fcf9f4df70c
BLAKE2b-256 checksum
How to use checksums
eae7e8eae2728afe7f97f8895100db395cf6cabaed01c2ef9d8bc4e747bad0eb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.

Transparency log

Release files / xbbg-1.5.0-cp310-cp310-manylinux_2_28_x86_64.whl

Download URL xbbg-1.5.0-cp310-cp310-manylinux_2_28_x86_64.whl
Size 4.8 MB
Tags CPython 3.10 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
f0a8ec11ede6a3f29fb3e74d4e46910eb356d03d31980f8d872b36c3ee4a7afd
BLAKE2b-256 checksum
How to use checksums
296764e39037b9be252b4fde000d2df94f2ffcf28c45b78d45607c9f1bb4fe98
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.

Transparency log

Release files / xbbg-1.5.0-cp310-cp310-macosx_11_0_universal2.whl

Download URL xbbg-1.5.0-cp310-cp310-macosx_11_0_universal2.whl
Size 4.0 MB
Tags CPython 3.10 macOS 11.0+ universal2 (ARM64, x86-64)
SHA-256 checksum
How to use checksums
0119a42f83a1aa82c47dd90885e997c10d35c9bce0c48a2a60699d45ce806c1f
BLAKE2b-256 checksum
How to use checksums
33d17dc08068013310e84d280584800101465ca6929d67172e83b73f388329fa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.5.0 This release

16 release files

1.4.5

16 release files

1.4.4

16 release files

1.4.1

16 release files

1.4.0

16 release files

1.3.1

16 release files

1.3.0

16 release files

1.2.5

16 release files

1.2.4

16 release files

1.2.3

16 release files

1.2.1

16 release files

1.2.0

16 release files

1.1.2

16 release files

1.1.1

16 release files

1.1.0

16 release files

1.0.0

16 release files

0.12.3

2 release files

0.12.2

2 release files

0.12.1

2 release files

0.12.0

2 release files

0.11.4

2 release files

0.11.2

2 release files

0.10.3

2 release files

0.10.2

2 release files

0.10.1

2 release files

0.10.0

2 release files

0.9.1

2 release files

0.9.0

2 release files

0.8.2

2 release files

0.8.1

2 release files

0.7.11

2 release files

0.7.7

2 release files

0.7.6

2 release files

0.7.5

2 release files

0.7.4

2 release files

0.7.3

2 release files

0.7.2

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.9

2 release files

0.6.8

2 release files

0.6.7

2 release files

0.6.6

2 release files

0.6.5

2 release files

0.6.0

2 release files

0.5.9

2 release files

0.5.8

2 release files

0.5.7

2 release files

0.5.6

2 release files

0.5.5

2 release files

0.5.4

2 release files

0.5.3

2 release files

0.5.2

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.9

2 release files

0.2.8

2 release files

0.2.7

2 release files

0.2.6

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.27

2 release files

0.1.18

2 release files

0.1.17

2 release files

0.1.16

2 release files

0.1.15

2 release files

0.1.14

2 release files

0.1.10

2 release files

0.1.8

3 release files

0.1.7

2 release files

0.1.6

3 release files

0.1.5

2 release files

0.1.4

3 release files

0.1.2

2 release files

0.1.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page