Skip to main content

oxedi

A fast X12 EDI parser for Python, written in Rust. Today it reads the 835 (electronic remittance advice).

  • Lossless. Every byte of the file is kept, so write() returns the file exactly as it was read.
  • Ready-made tables. Payments, claims, service lines and adjustments come out as typed tables that open in Polars, pandas, pyarrow or DuckDB without copying the data.
  • Problems are reported, not raised. A file that is valid EDI but has questionable data still parses; each issue is returned as a diagnostic that names the rule, the position and the value.
  • Large files. stream yields one transaction at a time, so memory stays bounded.
  • Extensible. Add segments or table columns with a small JSON patch, without touching the code.

Install

pip install oxedi               # no Python dependencies
pip install "oxedi[polars]"     # with Polars
pip install "oxedi[pandas]"     # with pandas and pyarrow

Requires Python 3.11 or later. Wheels are available for Linux (x86_64 and aarch64, plus musl on x86_64), macOS (Intel and Apple silicon) and Windows (x86_64).

Quick start

import oxedi

result = oxedi.parse_file("remittance.835")

claims = result.tables["claims"].to_polars()      # or .to_pandas()
services = result.tables["services"].to_polars()

print(result.count_claims(), result.sum_payments())  # sum_payments() is a Decimal
print(result.payer["name"], result.payee["name"])

for diagnostic in result.diagnostics:
    print(diagnostic)

oxedi.parse(data) does the same from bytes. A file that is not an 835 at all (for example, one that does not start with an ISA segment) raises oxedi.ParseError.

Tables

Table One row per Linked by
payments payment (transaction) —
claims claim payment
services service line payment, claim
adjustments claim or service adjustment payment, claim, service
provider_adjustments provider-level adjustment payment

result.tables.keys() lists them and table.columns lists a table's columns. Amounts are decimals, dates are dates, and text fields are kept as the raw bytes from the file (Arrow binary), so nothing is lost to an encoding guess. Tables follow the Arrow PyCapsule interface, so any Arrow-aware library reads them directly:

import duckdb, polars as pl

claims = result.tables["claims"]
duckdb.sql("select claim_status, sum(payment_amount) from claims group by 1")
pl.DataFrame(result.tables["services"])

Large files

from pathlib import Path

for batch in oxedi.stream(Path("big.835").read_bytes()):
    services = batch.tables["services"].to_polars()

Each batch holds the tables and diagnostics of one transaction. Pass by="2100" (or any other loop id) to get one batch per claim instead. Parsing releases the GIL, so several files can be parsed in parallel from threads.

Writing the file back

data = Path("remittance.835").read_bytes()
assert oxedi.parse(data).document.write() == data

Extending the spec

The structure of the 835 and the columns of each table are defined by a JSON spec. A patch in JSON Merge Patch format (RFC 7386) adapts it to a payer's variations:

spec = oxedi.Spec.builtin().patch({
    "tables": {"claims": {"columns": {
        "contract_class": {"segment": "REF", "where": {"1": "CE"}, "element": 2}
    }}}
})
result = oxedi.parse(data, spec=spec)   # claims now has a contract_class column

Objects merge key by key, while arrays are replaced whole: to allow an extra segment in a loop, list the loop's full segments:

{"loops": {"1000A": {"segments": ["N3", "N4", "REF", "PER", "XX"]}}}

parse and stream both accept spec=.

Spec versions

parse, parse_file and stream read the version a file declares (ISA12 and GS08) and use the matching built-in spec: 5010 (005010X221A1) by default, 4010 (004010X091A1) for 4010 files. Pass spec= to override, or pick one yourself:

spec = oxedi.Spec.builtin(version="4010")

Validating with pyx12

pip install "oxedi[pyx12]" adds pyx12's implementation-guide validation. parse never calls it; validate does, on demand:

import oxedi
from oxedi.pyx12 import validate

result = oxedi.parse(data)
findings = result.diagnostics + validate(data)    # bytes, a path or a binary file object
for d in sorted(findings, key=lambda d: d.level):
    print(d.origin, d.code, d)                    # "oxedi" or "pyx12"; pyx12's own code
    if d.segment is not None:
        start, end = result.document[d.segment].span  # the segment's bytes in your file

validate returns oxedi.Diagnostic, the type parse returns, so the two lists mix, sort by level and filter by origin. A pyx12 finding has kind == "External", origin == "pyx12", code set to pyx12's error code and an empty path (pyx12 does not report the loop); interchange, group and transaction findings are level 1, segment and element findings level 2. A file pyx12 cannot read, or an exception inside pyx12, comes back as one level 1 finding with no code whose rule starts with could not finish validating, instead of a traceback.

Coming from another library

Coming from edi-835-parser? See the migration guide.

Versioning

The project follows semantic versioning. While the version is 0.x, a minor release may change the API. See the changelog.

License

MIT. See LICENSE and THIRD_PARTY_NOTICES.

Metadata

Release files for oxedi 0.3.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 oxedi 0.3.0
File Size Uploaded
oxedi-0.3.0.tar.gz 231.3 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for oxedi 0.3.0
File
oxedi-0.3.0-cp311-abi3-win_amd64.whl CPython 3.11 abi3 Windows x86-64 Details
oxedi-0.3.0-cp311-abi3-musllinux_1_2_x86_64.whl CPython 3.11 abi3 Linux musl 1.2+ x86-64 Details
oxedi-0.3.0-cp311-abi3-manylinux_2_28_x86_64.whl CPython 3.11 abi3 Linux glibc 2.28+ x86-64 Details
oxedi-0.3.0-cp311-abi3-manylinux_2_28_aarch64.whl CPython 3.11 abi3 Linux glibc 2.28+ ARM64 Details
oxedi-0.3.0-cp311-abi3-macosx_11_0_arm64.whl CPython 3.11 abi3 macOS 11.0+ ARM64 Details
oxedi-0.3.0-cp311-abi3-macosx_10_12_x86_64.whl CPython 3.11 abi3 macOS 10.12+ x86-64 Details

Total release size: 6.1 MB

Release files / oxedi-0.3.0.tar.gz

Download URL oxedi-0.3.0.tar.gz
Size 231.3 kB
Tags Source
SHA-256 checksum
How to use checksums
ccd8a1cc58f3956bbe65d8885c3888a25c3f4d6ce0b3e3f93d25a1cf92cf6f68
BLAKE2b-256 checksum
How to use checksums
083b7387932a09fd477ef9a449f5fc0d760b5f8b1e989e4066735a6bbc6850c5
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 6, 2026.

Transparency log

Release files / oxedi-0.3.0-cp311-abi3-win_amd64.whl

Download URL oxedi-0.3.0-cp311-abi3-win_amd64.whl
Size 787.3 kB
Tags CPython 3.11 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
d4e4997ad84d1570abc5497963295d6fe299f5b47a0fcd588f3f955e0ed56ef8
BLAKE2b-256 checksum
How to use checksums
90cd557361b0a0a455ae945ee1360c2c220d58107270195605931eae7d3d3490
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 6, 2026.

Transparency log

Release files / oxedi-0.3.0-cp311-abi3-musllinux_1_2_x86_64.whl

Download URL oxedi-0.3.0-cp311-abi3-musllinux_1_2_x86_64.whl
Size 1.2 MB
Tags CPython 3.11 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
e5b29e87b5eb75056148ae77b1557ac0f9ea76aa2503282e209776e81d7d455e
BLAKE2b-256 checksum
How to use checksums
7c1ef8961d2a6e74ee24d659d43b2cf7baa954ea40ff179c73227a7c9016c687
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 6, 2026.

Transparency log

Release files / oxedi-0.3.0-cp311-abi3-manylinux_2_28_x86_64.whl

Download URL oxedi-0.3.0-cp311-abi3-manylinux_2_28_x86_64.whl
Size 1.1 MB
Tags CPython 3.11 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
0e92576855ae0c6d51c035aec570ba5a9689d19c9a6f5fdf9a5604a7a6a2743d
BLAKE2b-256 checksum
How to use checksums
68d92f8355e56e0a218510038299b364bbb029aaef6a5e82c0c161532300652d
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 6, 2026.

Transparency log

Release files / oxedi-0.3.0-cp311-abi3-manylinux_2_28_aarch64.whl

Download URL oxedi-0.3.0-cp311-abi3-manylinux_2_28_aarch64.whl
Size 1.0 MB
Tags CPython 3.11 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
49b35da3f980ff3cf0411e6afc4395c55e5ef4440d6f7221455795967e8e0ce3
BLAKE2b-256 checksum
How to use checksums
672161db13c0ce0f3c796987fbf195f8cda73ab214c4d78b1c708c6a014d90e3
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 6, 2026.

Transparency log

Release files / oxedi-0.3.0-cp311-abi3-macosx_11_0_arm64.whl

Download URL oxedi-0.3.0-cp311-abi3-macosx_11_0_arm64.whl
Size 886.1 kB
Tags CPython 3.11 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
85bf9b52d1e67a5274443b08aeb4a19b109b6b85f71e6b72629b718f2dab4389
BLAKE2b-256 checksum
How to use checksums
aff5267c0ed1a73bef5c7aed101071617e5aa9b31e50368279a47db527f74d02
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 6, 2026.

Transparency log

Release files / oxedi-0.3.0-cp311-abi3-macosx_10_12_x86_64.whl

Download URL oxedi-0.3.0-cp311-abi3-macosx_10_12_x86_64.whl
Size 920.4 kB
Tags CPython 3.11 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
7fca7174a748cea82ac40e374c8a0fbe23ed378b325c5abfb47d160f227eee84
BLAKE2b-256 checksum
How to use checksums
fedcbeb7817367331543d10499d98d2eabf98be0f1ad1e8d4ec17e6963a26a0a
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 6, 2026.

Transparency log

Release history Release notifications | RSS feed

0.5.0

7 release files

0.4.0

7 release files

This release

0.3.0 This release

7 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