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.6.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.5.1 + narwhals 2.26.0, no blpapi = 18.650 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.11 through 3.15.

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 omits clientContext.appName unless an engine default or per-call value is set.
result = blp.bql("get(px_last) for('AAPL US Equity')")

# Override the engine BQL application context for this request.
# The application name below is synthetic; replace it with one authorized for your environment.
authorized_result = blp.bql(
    "get(px_last) for('AAPL US Equity')",
    app_name="example-authorized-bql-app",
)

# 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.
  • Delayed data does not need a subscription: blp.delay_status(...) reports per security whether this session's data is delayed, and bdp/bdh/bdib/bdtick accept on_delayed= (see Delayed data). Live subscriptions also 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 35 tool names as the JavaScript adapter: 24 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.11–3.14, xbbg 1.5.0+, 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

@xbbg/core targets Node.js 24+ and Bun 1.4+ server runtimes; @xbbg/langgraph targets Node.js 24+. 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 installation and a quickstart, and js-xbbg/REFERENCE.md for the full JavaScript API notes.

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"))

Set an optional engine-wide BQL request application context before the first request:

from xbbg import configure

configure(bql_app_name="example-bql-app")

bql_app_name supplies BQL sendQuery's clientContext.appName; it is not a session-authentication setting. The authentication-only app_name still requires the corresponding auth_method. A per-call blp.bql(..., app_name="...") or blp.abql(..., app_name="...") value overrides the engine BQL default. With bql_app_name=None and no per-call value, xbbg omits the request element and preserves the service default.

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(bql_app_name="example-bql-app") gives that scope its own BQL request default without configuring authentication.

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
Entitlements and delayed data delay_status, check_entitlements, seat_type, identity_is_authorized
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.

Bloomberg returns EIDs only for exchanges the requester is entitled to, so a security whose data is delayed comes back with none; delay_status reports its feed EIDs.

Delayed data

Bloomberg serves delayed data to sessions without a real-time entitlement for an exchange, and requests neither fail nor flag it: bdp returns delayed snapshot values, bdh returns a delayed row for today, and bdib/bdtick stop the delay period before now. Check each security with delay_status:

from xbbg import blp

status = blp.delay_status(["AAPL US Equity", "VOD LN Equity", "CL1 Comdty"])

It makes one reference-data request and works on any Desktop, Server API, or B-PIPE session. Each row has delayed (this session receives delayed data), delay_minutes (minutes behind real time; null when real time), exchange_delay (Bloomberg's EXCHANGE_DELAY text, which also names the delay a real-time security would have), exch_code, the feed entitlement IDs realtime_eid1 to realtime_eid4 and delayed_eid, and error for securities Bloomberg rejects.

check_identity=True also checks the feed EIDs against the engine's authorized identity on //blp/mktdata and fills realtime_entitled (every real-time EID is entitled) and delayed_entitled. It needs SAPI/B-PIPE authorization through configure(auth_method=...) or a Desktop user enrolled in EMRS; otherwise the call raises Bloomberg's identity error.

bdp, bdh, bdib, and bdtick accept on_delayed:

Value Behavior
None (default) No check.
"warn" One BlpDelayedDataWarning per delayed security.
"raise" BlpRequestError naming the delayed securities.
"ignore" Status recorded in the result metadata only.

bdp reads the status from the same request. bdh, bdib, and bdtick make one extra reference-data request alongside the data, and only when the requested window ends within the last 24 hours; older windows are complete whatever the entitlement, so they are not checked. The status is in the result metadata under xbbg.delayed as {ticker: {"delayed": bool, "delay_minutes": int | None}}, available through the native ArrowTable.delayed property, pandas attrs["xbbg_delayed"], or PyArrow schema metadata. Warnings are raised before backend conversion, so Polars and DuckDB results still warn.

Node exposes engine.delayStatus(tickers, { checkIdentity }) and onDelayed on bdp, bdh, bdib, and bdtick; the MCP server adds the delay_status tool and on_delayed on bdp, bdh, bdib, and request; the LangGraph adapters add xbbg_delay_status.

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. Requests take the same on_delayed values, unchecked by default (see Delayed data). 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 (rerun `pixi run install`
# after pulling; xbbg warns when the extension was built from another commit)
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.6.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.6.0
File Size Uploaded Provenance Actions
xbbg-1.6.0.tar.gz 996.9 kB With provenance Details for xbbg-1.6.0.tar.gz

Built distributions (wheels)

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

Total release size: 70.0 MB

Release files / xbbg-1.6.0.tar.gz

Download URL xbbg-1.6.0.tar.gz
Size 996.9 kB
Tags Source
SHA-256 checksum
How to use checksums
faa24ee208b73ddfbafbe67ec5ec82a9b8fd2435ad3f00fcbd7c013b13aec5ae
BLAKE2b-256 checksum
How to use checksums
5e896f0129c0f001238e2bda86cea064638a93670d089dd96fd317638cbbfb45
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 23, 2026.

Transparency log

Release files / xbbg-1.6.0-cp315-cp315-win_amd64.whl

Download URL xbbg-1.6.0-cp315-cp315-win_amd64.whl
Size 4.7 MB
Tags CPython 3.15 Windows x86-64
SHA-256 checksum
How to use checksums
49eb63ba8c3367050f073a4d95fea75fd0ff096c65c5df4ca4e65c05da3bc380
BLAKE2b-256 checksum
How to use checksums
589107bfa3f47ebeddd82a2b6112cd12bc7a9c9a9cd890de0e6cc76425e53025
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 23, 2026.

Transparency log

Release files / xbbg-1.6.0-cp315-cp315-manylinux_2_28_x86_64.whl

Download URL xbbg-1.6.0-cp315-cp315-manylinux_2_28_x86_64.whl
Size 5.0 MB
Tags CPython 3.15 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
72572e5fc4336e96fcf31ce31c51e507ef7cb91b2239002c066b374ea334bddb
BLAKE2b-256 checksum
How to use checksums
6fe45082d8d0d93579f05010c926dd60f89b6f5caa28bcb70e11b37a18f5eff9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 23, 2026.

Transparency log

Release files / xbbg-1.6.0-cp315-cp315-macosx_11_0_universal2.whl

Download URL xbbg-1.6.0-cp315-cp315-macosx_11_0_universal2.whl
Size 4.2 MB
Tags CPython 3.15 macOS 11.0+ universal2 (ARM64, x86-64)
SHA-256 checksum
How to use checksums
34c63b459bb01d9a7b1a5f015e26aea8a0d648ae351d97628d742ea3e314bea5
BLAKE2b-256 checksum
How to use checksums
3a484e0bb77ef77fd3e4fdbe03c2cce60c81d16430d05f0c25c2824ffa89b258
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 23, 2026.

Transparency log

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

Download URL xbbg-1.6.0-cp314-cp314-win_amd64.whl
Size 4.7 MB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
cbaee6d603e736fde2518b0d5c9a80dbf4b8024b78b43125711e3a11ce85db62
BLAKE2b-256 checksum
How to use checksums
1bd03735bd36a624b3ef3a23f0afbc2efdda4175ddb240bb179bbff2180d51fa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 23, 2026.

Transparency log

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

Download URL xbbg-1.6.0-cp314-cp314-manylinux_2_28_x86_64.whl
Size 5.0 MB
Tags CPython 3.14 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
79cf11b85f6cafe940cdf192904697f1de5c06b138852903568dc45bde9819d5
BLAKE2b-256 checksum
How to use checksums
2b99f120b132a7810679d01c5d64390221bf9dee1ec54560cd3a9f5f6e33d12e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 23, 2026.

Transparency log

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

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

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 23, 2026.

Transparency log

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

Download URL xbbg-1.6.0-cp313-cp313-win_amd64.whl
Size 4.6 MB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
0e91cb7cbfad6afd5cf9c984f88297697b8c7d42febea024e7cb888ab03a4b95
BLAKE2b-256 checksum
How to use checksums
7efdacd3d1da1d0c9e884d2563a4edc76811e818c286679c597a2cd8b6db7bf7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 23, 2026.

Transparency log

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

Download URL xbbg-1.6.0-cp313-cp313-manylinux_2_28_x86_64.whl
Size 5.0 MB
Tags CPython 3.13 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
c8eaf79652f1efcc5387d9cbe88d75289167e933a9fb6fa78e326329775fe151
BLAKE2b-256 checksum
How to use checksums
ddf2aeb4ed8a8707d28ffb52e6c9515db0182b65c09d4fd4c4cf2e90925233e6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 23, 2026.

Transparency log

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

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

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 23, 2026.

Transparency log

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

Download URL xbbg-1.6.0-cp312-cp312-win_amd64.whl
Size 4.6 MB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
5fff75597c32bdef44e9c69400ba3ca3c57f6d9162fb2330616da0fba74a4fe7
BLAKE2b-256 checksum
How to use checksums
af520cdcb02254b2ab46fcc5b8b04df86540ba970965e8b39538945387ec3eea
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 23, 2026.

Transparency log

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

Download URL xbbg-1.6.0-cp312-cp312-manylinux_2_28_x86_64.whl
Size 5.0 MB
Tags CPython 3.12 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
9776d5ad06d89d93fe9e2b305818f5ae1817c1b3bca2da2d39bad93c1ce6c215
BLAKE2b-256 checksum
How to use checksums
3b9e5ea86f591861d84bedaa30ecf136a64e16a6230465798035f14ba958a416
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 23, 2026.

Transparency log

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

Download URL xbbg-1.6.0-cp312-cp312-macosx_11_0_universal2.whl
Size 4.2 MB
Tags CPython 3.12 macOS 11.0+ universal2 (ARM64, x86-64)
SHA-256 checksum
How to use checksums
5cc6b2f420a387ca11673d43154455c166ebfbfaf5b0ecdec6ea589debf39db0
BLAKE2b-256 checksum
How to use checksums
131639af913842c7451c4d590fceb9ec46f98f510c2311bc15f4052978a81050
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 23, 2026.

Transparency log

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

Download URL xbbg-1.6.0-cp311-cp311-win_amd64.whl
Size 4.6 MB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
abad5bac3e280550674c6f91b1557bd62cdf1bfe93dc2f4be70846fe09b8d7d2
BLAKE2b-256 checksum
How to use checksums
f0b4cec3bc7cd5191968bb84db238a34184289216d85f79f6855ad1eab5c8a49
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 23, 2026.

Transparency log

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

Download URL xbbg-1.6.0-cp311-cp311-manylinux_2_28_x86_64.whl
Size 5.0 MB
Tags CPython 3.11 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
1342bb041b89f398003e4c22cdfaa6aba94c015cb5d28d02b146f955c3e9d015
BLAKE2b-256 checksum
How to use checksums
633ac4f32ca86b09ad094d737bdd42ad89a699a6c8cd4fdf597df79865a0fefa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 23, 2026.

Transparency log

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

Download URL xbbg-1.6.0-cp311-cp311-macosx_11_0_universal2.whl
Size 4.2 MB
Tags CPython 3.11 macOS 11.0+ universal2 (ARM64, x86-64)
SHA-256 checksum
How to use checksums
b5ec885b53d3cd406e0472a94e2ec5ea1560d10eac6b64b5e25879d9cd120df7
BLAKE2b-256 checksum
How to use checksums
3d7758fc5c6cd590ea40777e570d4056da9d1d73957a21be27e950bcab618c11
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 23, 2026.

Transparency log

Security for xbbg 1.6.0

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.

Full provenance

All 16 files in this release have been uploaded with provenance metadata.

Select from 16 files

Attestation for xbbg-1.6.0.tar.gz

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 23, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

1.6.0 This release

16 release files Full provenance

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