PBIXRay
Read Power BI semantic models without Power BI.
No Power BI Desktop. No Analysis Services instance. No XMLA endpoint, no Premium capacity, no workspace, no restore. Just a file path.
from pbixray import PBIXRay
model = PBIXRay("sales.pbix")
model.dax_measures # every measure, as a DataFrame
model.relationships # the full model graph
model.power_query # all M code
model.get_table("Sales") # actual decoded rows
PBIXRay is a Python reader for the VertiPaq engine's on-disk format. It parses .pbix files, .abf Analysis Services backups and .xlsx PowerPivot workbooks, which are three containers around the same storage engine, and returns pandas DataFrames. Read-only, offline, cross-platform, with no Microsoft runtime involved at any stage.
Every other way to inspect a model needs something running. Desktop open, a server connected, a backup restored, a capacity licensed. PBIXRay needs a file.
Install
pip install pbixray
Python 3.8 through 3.13, on macOS, Linux and Windows. Prebuilt wheels, so there is nothing to compile.
What you can pull out
| Model logic | measures, calculated columns, calculated tables, calculation groups |
| Transformations | Power Query / M, M parameters, DataMashup queries (DirectQuery and native SQL) |
| Structure | tables, columns, schema, relationships, hierarchies, perspectives, aggregations |
| Security | row-level security, object-level security, roles and role memberships |
| Storage | per-column cardinality, dictionary / hash-index / data sizes, total model size |
| Data | decoded table contents, whole or streamed in chunks |
| Everything else | all 40 $System.TMSCHEMA_* DMVs |
Full reference and examples at pbixray.com/docs.
Three formats, one API
File type is detected from the contents, so the same code works across all three.
| Input | What it is |
|---|---|
.pbix |
Power BI Desktop file |
.abf |
Analysis Services backup, readable without provisioning a server or restoring |
.xlsx |
Excel workbook with an embedded PowerPivot model |
PBIXRay("report.pbix")
PBIXRay("nightly-backup.abf")
PBIXRay("legacy-powerpivot.xlsx")
ABF support turns a backup archive into something queryable without a restore. That covers retention audits, migration inventories, and answering "what was in this model in 2019" without standing anything up.
The 40 DMVs, from a file
Analysis Services exposes model metadata through $System.TMSCHEMA_* DMVs, normally reachable only over a live connection. PBIXRay reads all forty straight from the embedded metadata database.
model.tmschema_refresh_policies # incremental refresh configuration
model.tmschema_role_memberships # who is in which security role
model.tmschema_column_permissions # object-level permissions
model.tmschema_partitions # partition definitions and sources
All 40 endpoints
tmschema_model · tmschema_tables · tmschema_columns · tmschema_partitions · tmschema_hierarchies · tmschema_levels · tmschema_datasources · tmschema_perspectives · tmschema_perspective_tables · tmschema_perspective_columns · tmschema_perspective_hierarchies · tmschema_perspective_measures · tmschema_kpis · tmschema_annotations · tmschema_extended_properties · tmschema_cultures · tmschema_translations · tmschema_linguistic_metadata · tmschema_query_groups · tmschema_calculation_groups · tmschema_calculation_items · tmschema_calculation_expressions · tmschema_variations · tmschema_attribute_hierarchies · tmschema_sets · tmschema_refresh_policies · tmschema_detail_rows_definitions · tmschema_format_string_definitions · tmschema_functions · tmschema_calendars · tmschema_calendar_column_groups · tmschema_calendar_column_refs · tmschema_alternate_of · tmschema_related_column_details · tmschema_group_by_columns · tmschema_binding_info · tmschema_analytics_ai_metadata · tmschema_data_coverage_definitions · tmschema_role_memberships · tmschema_column_permissions
This makes governance tooling possible in places a live connection is not available. A pull request, a Lambda function, an air-gapped audit, a laptop with no license.
Models bigger than your RAM
Decompressed models are memory-mapped from disk rather than loaded whole, and tables stream by VertiPaq segment. Column projection and categorical strings cut memory further.
with PBIXRay("20gb-model.pbix", on_disk=True) as model:
for chunk in model.iter_table("FactSales", chunk_size=1_000_000):
process(chunk)
Dictionary decoding runs on a native Huffman kernel (xmhuffman) and fans out across cores.
Built on PBIXRay
🖥️ PBIXRay for macOS
A native model inspector for Mac. Open a .pbix and browse tables, measures, relationships and storage statistics, with no Windows VM, no Parallels and no Power BI Desktop. It streams one table at a time, so models too large for memory open fine. Spotlight integration finds measures by name.
Built for the Mac-based BI consultants Microsoft has never shipped a tool for.
🌐 pbix.info
Drop a model into the browser and explore it straight away. Metadata only, with no data or statistics extracted, focused on data origin and Power Query lineage. Nothing to install.
🦆 DuckDB extension
Query PBIX files directly in SQL.
Scope
PBIXRay is a read-only extractor for the data model. It does not:
- write, modify or repack files
- evaluate DAX, so expressions come back as source text
- run a query engine
- connect to Power BI Service, Analysis Services, gateways or workspaces
- refresh anything
- parse the report layer, meaning visuals, pages, bookmarks and themes
- support
.pbit,.pbidsor.pbip
Read-only is a deliberate choice. A library that cannot write to a model also cannot corrupt one, which is what makes it safe to point at production artifacts and client files.
Contributing
The PBIX format is undocumented and reverse-engineered, so the test corpus is the specification. The most valuable contribution is a model that parses incorrectly.
If you find one, open an issue with the failure output and the structural details, such as encoding type, column metadata and offsets. Please never send file contents you do not own. A minimal reproduction is more useful than a real model and safer for everyone.
Built on
Decompression uses Microsoft's own MIT-licensed Xpress reference implementations, wrapped for Python as xpress8 and xpress9. Huffman dictionary decoding lives in xmhuffman. All three are kept in separate repositories so the Cython build and wheel distribution stay out of the main library.
Links
Documentation · Interactive demo · PyPI · Support
MIT licensed. Built in London by Alphaverse Limited.
Not affiliated with or endorsed by Microsoft. Power BI, Excel and Analysis Services are trademarks of Microsoft Corporation.
Metadata
Release files for pbixray 0.15.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| pbixray-0.15.5.tar.gz | 116.4 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pbixray-0.15.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 203.8 kB
Release files / pbixray-0.15.5.tar.gz
| Download URL | pbixray-0.15.5.tar.gz |
|---|---|
| Size | 116.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
cc4c99e1dafb4e460149b5f236d77cecf20ddd51080ad1db0b2d51e0450cd860
|
|
BLAKE2b-256 checksum How to use checksums |
1e53d0fb2d832064b371d3ca23ecb0eb6348a95d71666c10c1561068138efd5f
|
| 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 Aug 27, 2026.
Transparency logRelease files / pbixray-0.15.5-py3-none-any.whl
| Download URL | pbixray-0.15.5-py3-none-any.whl |
|---|---|
| Size | 87.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e0e9695eb2eee1e8109586239324403fe363f1b2a0d380c270f074ec7cec7913
|
|
BLAKE2b-256 checksum How to use checksums |
1d397f3a976eb8a7963f03b28216b7c3bed2719611322462861809877ff4caba
|
| 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 Aug 27, 2026.
Transparency logSecurity for pbixray 0.15.5
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 2 files in this release have been uploaded with provenance metadata.
Attestation for pbixray-0.15.5.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 Aug 27, 2026.
Transparency logA 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.