This release has been yanked by its maintainers, and will be ignored by installers, except when explicitly specified.
Reason given by maintainers: Renamed to oxedi: pip install oxedi
oxedi835
A fast EDI 835 (electronic remittance advice) parser for Python, written in Rust.
- 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.
streamyields 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 oxedi835 # no Python dependencies
pip install "oxedi835[polars]" # with Polars
pip install "oxedi835[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 oxedi835
result = oxedi835.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)
oxedi835.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 oxedi835.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 oxedi835.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 oxedi835.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 = oxedi835.Spec.builtin().patch({
"tables": {"claims": {"columns": {
"contract_class": {"segment": "REF", "where": {"1": "CE"}, "element": 2}
}}}
})
result = oxedi835.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 = oxedi835.Spec.builtin(version="4010")
Validating with pyx12
pip install "oxedi835[pyx12]" adds pyx12's
implementation-guide validation. parse never calls it; validate does, on demand:
import oxedi835
from oxedi835.pyx12 import validate
result = oxedi835.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) # "oxedi835" 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 oxedi835.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 oxedi835 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| oxedi835-0.2.0.tar.gz | 214.7 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| oxedi835-0.2.0-cp311-abi3-win_amd64.whl | CPython 3.11 | abi3 | Windows x86-64 | Details |
| oxedi835-0.2.0-cp311-abi3-musllinux_1_2_x86_64.whl | CPython 3.11 | abi3 | Linux musl 1.2+ x86-64 | Details |
| oxedi835-0.2.0-cp311-abi3-manylinux_2_28_x86_64.whl | CPython 3.11 | abi3 | Linux glibc 2.28+ x86-64 | Details |
| oxedi835-0.2.0-cp311-abi3-manylinux_2_28_aarch64.whl | CPython 3.11 | abi3 | Linux glibc 2.28+ ARM64 | Details |
| oxedi835-0.2.0-cp311-abi3-macosx_11_0_arm64.whl | CPython 3.11 | abi3 | macOS 11.0+ ARM64 | Details |
| oxedi835-0.2.0-cp311-abi3-macosx_10_12_x86_64.whl | CPython 3.11 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 5.8 MB
Release files / oxedi835-0.2.0.tar.gz
| Download URL | oxedi835-0.2.0.tar.gz |
|---|---|
| Size | 214.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7a0c2a6cb21e3db90e37511e0da9d8605bd0c1475cbebdf01492879a295ee42c
|
|
BLAKE2b-256 checksum How to use checksums |
ab2767e79c95a61224f15841ac34d8580d4fe313171fa141bf868dc1e60c9195
|
| 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 5, 2026.
Transparency logRelease files / oxedi835-0.2.0-cp311-abi3-win_amd64.whl
| Download URL | oxedi835-0.2.0-cp311-abi3-win_amd64.whl |
|---|---|
| Size | 743.0 kB |
| Tags | CPython 3.11 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
f1124eb36a9e42601e2ae5e0d559def7cd6a647cca8026a0e63a994fbb64ba73
|
|
BLAKE2b-256 checksum How to use checksums |
0e07cf35dad1218e172b9524cd02fbd1bde8360520a01317ec101ac220477240
|
| 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 5, 2026.
Transparency logRelease files / oxedi835-0.2.0-cp311-abi3-musllinux_1_2_x86_64.whl
| Download URL | oxedi835-0.2.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 |
df21855ad8779d7a58dd19e7ad1a2c743e782455ff2b63bcc0c42b620ef67d02
|
|
BLAKE2b-256 checksum How to use checksums |
a2dfde40803e0fcdbdf298158a39eac3e15e126af2d26c3702ce4d37d7a72d4b
|
| 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 5, 2026.
Transparency logRelease files / oxedi835-0.2.0-cp311-abi3-manylinux_2_28_x86_64.whl
| Download URL | oxedi835-0.2.0-cp311-abi3-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 986.7 kB |
| Tags | CPython 3.11 Linux glibc 2.28+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
4eaad57b35b8b86cf7f84ffde84fbf18b6dd8b215906324329ed1a61f5ee2068
|
|
BLAKE2b-256 checksum How to use checksums |
3b6549f6daf13e2d80bd40f92e0c8f69f26821af0519315cd36aeec2815fd3f0
|
| 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 5, 2026.
Transparency logRelease files / oxedi835-0.2.0-cp311-abi3-manylinux_2_28_aarch64.whl
| Download URL | oxedi835-0.2.0-cp311-abi3-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 950.7 kB |
| Tags | CPython 3.11 Linux glibc 2.28+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
7008a51bf9fb1673bd24c50a98705d5aa5e9aac192e0720bbd73bc3cd53e6af7
|
|
BLAKE2b-256 checksum How to use checksums |
a52f71332d8de15afdf21ec35ccbe359da8c99030ac005b8b1b81c120d8538fb
|
| 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 5, 2026.
Transparency logRelease files / oxedi835-0.2.0-cp311-abi3-macosx_11_0_arm64.whl
| Download URL | oxedi835-0.2.0-cp311-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 834.6 kB |
| Tags | CPython 3.11 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
90522080045e7a087ee4fa70a5a7b4caf410483599573ead98f0618a73057166
|
|
BLAKE2b-256 checksum How to use checksums |
2aa457983541b028a8c9033a326ab64b0218316d0a670110d67dbcf88fc4f011
|
| 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 5, 2026.
Transparency logRelease files / oxedi835-0.2.0-cp311-abi3-macosx_10_12_x86_64.whl
| Download URL | oxedi835-0.2.0-cp311-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 870.1 kB |
| Tags | CPython 3.11 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
a4c1fc63ba1273afb4979828e4a5c8cc5d7a73357c5e2d1cf963e327f285e67b
|
|
BLAKE2b-256 checksum How to use checksums |
5d394a64097ad620d74e5ed62cb76ca820057370e6bd1bd46b8064b21d73736d
|
| 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 5, 2026.
Transparency log