gtfs-analyzer
GTFS Schedule validation and feed-quality analysis for Python, powered by the
Rust engine of GTFS Analyzer. The
package runs the same pipeline as the web app, the CLI, the Rust crates, and the
gtfs-sdk npm package, so a feed gets the same findings and scores everywhere.
Validation happens in-process; the feed is never uploaded.
- 616 rules across GTFS Schedule, GTFS-Flex, Fares v2, and GTFS-JP
- Spec / Interop / Quality / Analytics classification, per-feed scores, and a publishability verdict
- One abi3 wheel per platform for CPython 3.9+ (Linux x86_64, macOS arm64, Windows x86_64); other platforms build from the source distribution, which needs a Rust toolchain
Installation
pip install gtfs-analyzer
Usage
from gtfs_analyzer import validate_gtfs
result = validate_gtfs("feed.zip")
print(result["validation_status"]) # "COMPLETE" or "PARTIAL"
print(result["reports"]["r1"]["publishable"]) # publishability verdict
print(result["metrics"]["overall_score"])
for notice in result["notices"]:
print(notice["rule_id"], notice["severity"], notice["file"], notice["line"])
validate_gtfs(feed, *, today=None, config=None, include_name_index=False, lang="en")
| Argument | Meaning |
|---|---|
feed |
Path to a GTFS ZIP (str or pathlib.Path) or the ZIP as bytes |
today |
Reference date for calendar checks: YYYYMMDD int or "YYYY-MM-DD" / "YYYYMMDD" string. Defaults to the local date. Pin it for reproducible results. |
config |
Optional mapping of engine settings, e.g. {"disabled_rule_ids": ["TRP_020"]}. Unknown keys are rejected. |
include_name_index |
Include the stop/route name lookup table (large; omitted by default) |
lang |
Language of title, message, and remediation: "en" (default), "fr", "ja", or "tr", as the CLI's --lang. Missing entries fall back to English. |
The returned dict is the engine's result object:
| Key | Content |
|---|---|
validation_status |
COMPLETE, or PARTIAL when a limit stopped part of the analysis (see partial) |
notices |
Findings with rule_id, severity, rule_class, file, line, field, observed_value, expected_value, message, remediation |
reports |
Report views r1–r9; r1 holds the publishability verdict |
metrics |
Scores and feed statistics (service window, trip counts, notice counts per class) |
capped_totals |
True counts for rules whose notices were capped |
agency_breakdown |
Per-rule finding counts by agency (agencies, rules) |
feed_summary |
Agency contacts from agency.txt (up to 100, plus agency_count) and the publisher fields of feed_info.txt |
partial |
Present only for PARTIAL results: what was skipped and why |
Texts follow lang; use rule_id, not the message text, for program logic.
The rule reference
describes every rule.
Errors
gtfs_analyzer.ValidationError: the feed could not be validated at all, for example an unreadable ZIP. The message starts with the error code (ZipUnreadable: ...) and followslang.ValueError: invalidtoday,config, orlang.TypeError:feed,today,config, orlanghas the wrong type.
A feed with errors is not an exception: its findings are in notices.
Versioning
The package version is the engine version. gtfs_analyzer.__version__, the
CLI, and the Rust crates of the same version produce the same results.
Links
- Web app: https://ttezer.github.io/gtfs-analyzer/
- Source and issues: https://github.com/ttezer/gtfs-analyzer
- Rule reference: https://github.com/ttezer/gtfs-analyzer/blob/main/RULES.en.md
- Changelog: https://github.com/ttezer/gtfs-analyzer/blob/main/CHANGELOG.md
MIT licensed.
Metadata
Release files for gtfs-analyzer 0.16.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 | |
|---|---|---|---|
| gtfs_analyzer-0.16.0.tar.gz | 977.2 kB | Details |
Built distributions (wheels)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| gtfs_analyzer-0.16.0-cp39-abi3-win_amd64.whl | CPython 3.9 | abi3 | Windows x86-64 | Details |
| gtfs_analyzer-0.16.0-cp39-abi3-manylinux_2_34_x86_64.whl | CPython 3.9 | abi3 | Linux glibc 2.34+ x86-64 | Details |
| gtfs_analyzer-0.16.0-cp39-abi3-macosx_11_0_arm64.whl | CPython 3.9 | abi3 | macOS 11.0+ ARM64 | Details |
Total release size: 7.9 MB
Release files / gtfs_analyzer-0.16.0.tar.gz
| Download URL | gtfs_analyzer-0.16.0.tar.gz |
|---|---|
| Size | 977.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
50f05d5ab998c82d3feab515e887964deaa303e5a349367d9441d50d383e1b19
|
|
BLAKE2b-256 checksum How to use checksums |
e33cac30696c9fa06f51f9f70f1d486ecaa217e2b89136f6e69088b5855c5563
|
| 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 11, 2026.
Transparency logRelease files / gtfs_analyzer-0.16.0-cp39-abi3-win_amd64.whl
| Download URL | gtfs_analyzer-0.16.0-cp39-abi3-win_amd64.whl |
|---|---|
| Size | 2.4 MB |
| Tags | CPython 3.9 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
af7f18da411bdfc615b83f42e2898000eb497e22f5475e5d3a91c761209e6d0d
|
|
BLAKE2b-256 checksum How to use checksums |
53cd7255a2fb1ac3260ce25b8194d52db1919c1b9f276e4ad0657d7117342261
|
| 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 11, 2026.
Transparency logRelease files / gtfs_analyzer-0.16.0-cp39-abi3-manylinux_2_34_x86_64.whl
| Download URL | gtfs_analyzer-0.16.0-cp39-abi3-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 2.4 MB |
| Tags | CPython 3.9 Linux glibc 2.34+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
c5a7ada6b3999d26b2592101e88d8c532ec113c25926cc0b1b6fdde90dfb4505
|
|
BLAKE2b-256 checksum How to use checksums |
50b6648b0dc5bf792be1022f39294fe2cba8da4318072cb1dd1e33600cf4e7a5
|
| 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 11, 2026.
Transparency logRelease files / gtfs_analyzer-0.16.0-cp39-abi3-macosx_11_0_arm64.whl
| Download URL | gtfs_analyzer-0.16.0-cp39-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.1 MB |
| Tags | CPython 3.9 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
30680da069a603290054f9cb879c071b1e919eb75a6f5de45bd16720c5ce56fb
|
|
BLAKE2b-256 checksum How to use checksums |
36d83df8887555c0e479553c9a0eced18c9ba8b20883f6dc483f9b672e9af63e
|
| 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 11, 2026.
Transparency log