Skip to main content

sdmxlib

Note: This library has been written extensively with AI assistance (Claude Code). Users who are not comfortable with AI-generated code should take that into account before adopting it.

SDMX structural metadata library for Python. Fetch and navigate Data Structure Definitions, Codelists, Dataflows, and related artefacts from any SDMX REST endpoint — with plain attribute access, no XML or URN chasing required.

Quick start

import sdmxlib as sl

with sl.RestRegistry(sl.Provider.BIS) as reg:
    urn = sl.DataStructure.urn_for(agency="BIS", id="WS_CBPOL")
    dsd = reg.get(urn, resolve=True)

    for dim in dsd.dimensions:
        if dim.is_enumerated:
            print(f"{dim.id}: {dim.codelist.id} ({len(dim.code_ids())} codes)")
FREQ: CL_FREQ (7 codes)
REF_AREA: CL_BIS_IF_REF_AREA (44 codes)
INSTR_ASSET: CL_INSTR_ASSET (12 codes)
BORROWER_CTY: CL_BIS_IF_REF_AREA (44 codes)

Installation

uv add sdmxlib
# or: pip install sdmxlib

sdmxlib needs Python 3.14 or later.

What it does

  • Connects to any SDMX 2.1 or 3.0 REST endpoint; built-in shortcuts for ECB, BIS, ESTAT, IMF, OECD, and the SDMX Global Registry via sl.Provider
  • One read, with resolution depth as a parameter: get(urn) for a skeleton, get(urn, resolve=True) for the full reference graph, resolve=[sl.Codelist] for named types only, and partial=False for untrimmed schemes
  • Returns fully resolved domain objects with plain attribute access — no XML, no URN chasing
  • Filter collections with lambdas or the item() expression API
  • Build SDMX artefacts locally — frozen, checked as they are built — and serialise to SDMX-ML 2.1, 3.0 and 3.1 or SDMX-JSON 2.0
  • LocalRegistry — a DuckDB-backed persistent store with lazy codelists and hierarchies and direct SQL code maps; pass it as a RestRegistry's store= and everything fetched is kept for offline use
  • A path query language over both planes, on a LocalRegistry or straight against REST: reg.query(sl.q.dataflow) for structures, reg.obs(flow) for rows, reg.sql(...) as the escape hatch
  • Uniform SKOS-aligned tree API (roots/leaves/narrower/broader/ *_transitive/depth_of plus bulk projections depths/broader_map/ ancestors_map/inherit_along_broader) on Codelist, Hierarchy, CategoryScheme, MetadataStructure — and their lazy SQL variants LazyCodelist/LazyHierarchy. A codelist is keyed by code id; the other trees by path (h["CA.ON"]), since a node id may repeat across branches
  • Reference metadata via MetadataStructure (MSD), Metadataflow, and MetadataSet — attach typed footnotes, methodology notes, or quality reports to any identifiable artefact. Definitions ride in StructureMessage; populated payloads ride in MetadataMessage (<mes:GenericMetadata> in SDMX-ML 3.0; metadata-schema envelope in SDMX-JSON 2.0). Both message kinds round-trip through LocalRegistry, JSON, and XML.
  • Integrates with Polars for schema generation and data validation
  • Fully typed — IDE completion and static analysis work throughout

For AI assistants

Two condensed reference files at the repo root are written for LLM tools (Claude Code, Cursor, Copilot, etc.):

  • llms.txt — the whole library in one pass: registries and get, navigation, building artefacts, the local store, trees, observation data, reading and writing SDMX, reference metadata, and the type table
  • llms-dsl.txt — the path query language in depth: sl.q, Query / Select, projection and aggregation, edges, windows, observation queries (ObsQuery), and reg.sql()

Every Python block in both is executed by the test suite, so they track the library's actual surface. Point your assistant at them.

Upgrading

sdmxlib is pre-stability and breaks cleanly rather than carrying two spellings of the same idea. Upgrading lists every breaking change since 0.48, with the old and new spelling of each — sl.Registry is now sl.LocalRegistry, get() takes a URN and a resolution depth, the four query DSLs are one path language, and every model class is frozen.

Documentation

See the docs for the full cookbook, including:

  • Connecting to registries and choosing a resolution depth
  • Persisting artefacts in a local DuckDB store with LocalRegistry
  • Querying structures and observations with the sl.q path language
  • Fetching observation data and pivoting to wide format
  • Inspecting DSDs and building code maps for ETL pipelines
  • Generating Polars schemas from SDMX Data Structure Definitions
  • Browsing data catalogs and filtering dataflows
  • Working with constraints, hierarchies, and serialisation

Development

just check           # lint + typecheck
just test            # unit tests
just test-integration  # end-to-end tests, replayed from recorded cassettes
just ci              # the full gate: lint, typecheck, unit, docs, integration

Issues are tracked on GitHub. The project started on GitLab, so a bare #492 in code, comments or docs means an issue in the GitLab tracker, which stays readable as an archive. GitHub issues are written GH-12.

Metadata

Release files for sdmxlib 0.70.1

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

Source distribution (sdist)

Source distribution for sdmxlib 0.70.1
File Size Uploaded Provenance
sdmxlib-0.70.1.tar.gz 872.4 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for sdmxlib 0.70.1
File Interpreter ABI Platform
sdmxlib-0.70.1-py3-none-any.whl Python 3 none any Details

Total release size: 1.8 MB

Release files / sdmxlib-0.70.1.tar.gz

Download URL sdmxlib-0.70.1.tar.gz
Size 872.4 kB
Tags Source
SHA-256 checksum
How to use checksums
b7d0bf01b672bc4abbdcdcd9335eb34e35723e7348da08cb78396adf51a11f70
BLAKE2b-256 checksum
How to use checksums
c1c589a789a98ebfeab19acfd71d6971ffcb52c724c17caba2a2f8486f2ea446
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / sdmxlib-0.70.1-py3-none-any.whl

Download URL sdmxlib-0.70.1-py3-none-any.whl
Size 955.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ffcec7b77fcead310fa4440a4a0ec378006dbffd9a45302c0524bfa3bab8ddfd
BLAKE2b-256 checksum
How to use checksums
f2a5997488cc99cb518e29e68c32c65e5472dc4d22fc1c3ab723e28ac4b46a2a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Security for sdmxlib 0.70.1

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.

No provenance found

None of the files in this release were uploaded with provenance metadata.

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.

Release history Release notifications | RSS feed

This release

0.70.1 This release

2 release files No 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