Contents
Documentation
ID Crosswalks
Last updated
A Transitland ID crosswalk maps a Onestop ID to the identifier the same operator or feed carries in another transit data system. Crosswalks let you join Transitland service data to external datasets, such as federal ridership statistics, state ingest pipelines, open knowledge bases, without needing to match on fuzzy properties like agency names or less stable identifiers.
Browse and download the crosswalks.
How crosswalks are stored
Crosswalks are generated from tags stored on operator and feed records in Transitland Atlas. Which record carries the tag depends on what the external identifier identifies: an agency-like record is tagged on the operator, a data file is tagged on the feed.
{
"onestop_id": "o-c23-metrotransit",
"name": "King County Metro",
"tags": { "us_ntd_id": "00001" }
}
The ODPT crosswalk carries a second identifier per row. A feed there is identified by the operator that publishes it (odpt_organization_id) together with the dataset it belongs to (odpt_dataset_id), because the dataset name repeats across operators. The dataset is a trailing odpt_dataset_id column in the CSV, appended after the five columns below.
Some records carry more than one identifier from the same system. For example, an operator covering several NTD reporters, or a feed covering several Cal-ITP realtime datasets. Those are written as a semicolon-separated list in a single tag, and split into one row each on export. A comma is accepted too, since older records use it.
Available crosswalks
| Crosswalk | Tag | Tagged on | Status |
|---|---|---|---|
| US National Transit Database | us_ntd_id | operator | active |
| Wikidata | wikidata_id | operator | active |
| Cal-ITP organization | calitp_organization_id | operator | active |
| Cal-ITP dataset | calitp_dataset_id | feed | active |
| MobilityData Mobility Database | mdb_source_id | feed | active |
| GTFS Data Exchange | gtfs_data_exchange | feed | archival |
| ODPT | odpt_organization_id | feed | active |
| GTFS Data Repository Japan | gtfs_data_jp_organization_id | operator | active |
| Spanish National Access Point | es_nap_fichero_id | feed | active |
| OpenMobilityData | omd_provider_id | operator | archival |
We are open to adding new crosswalk IDs in the future. Please open an issue on the Transitland Atlas repository to discuss.
Downloading as CSV
Every crosswalk is exported to a CSV in the Transitland Atlas repository, rebuilt by a scheduled job whenever the tags change, so the file sits in version control beside the records it came from and its history is the history of the tags.
https://raw.githubusercontent.com/transitland/transitland-atlas/main/crosswalks/<name>.csv
The directory is a Frictionless Data Package v2, so the columns, their constraints and the primary key are machine readable rather than only described here:
https://raw.githubusercontent.com/transitland/transitland-atlas/main/crosswalks/datapackage.json
Use the name from the table above. For example, us-ntd.csv. The download button on each crosswalk page opens the same file on GitHub, which previews it as a table.
Columns in the CSV download:
| Column | Meaning |
|---|---|
external_id | The identifier in the other system |
onestop_id | The Transitland operator or feed |
entity | operator or feed |
name | Operator name, for readability |
related | Onestop IDs on the other side, semicolon-separated: a tagged operator's feeds, or a tagged feed's operators |
There is one row per (external_id, onestop_id) pair, so the file joins directly against either column.
The Wikidata export carries one extra trailing column, wikipedia_url, resolved from the entity's English Wikipedia sitelink.
Querying crosswalks through the APIs
Tags are queryable, so you do not have to download a CSV file to use a crosswalk.
Find the operator holding a particular NTD ID over REST:
curl "https://transit.land/api/v2/rest/operators?tag_key=us_ntd_id&tag_value=40029&apikey=YOUR_API_KEY"
List every operator carrying a Wikidata ID over GraphQL. An empty tag value matches on the key being present, whatever its value:
{
operators(where: {tags: {wikidata_id: ""}}) {
onestop_id
name
tags
}
}
The same filter works on feeds for the feed-tagged crosswalks. Note that tag filtering matches an exact value or the presence of a key. It does not do partial or list matching, so an operator tagged "20008,20188" will not match a query for "20008". Fetch by key presence and split client-side when a crosswalk has multi-valued tags.
Licensing
Crosswalks come from Transitland Atlas, which is published under the Creative Commons Attribution 4.0 license. You may use them for commercial, educational or research purposes. To provide the required attribution, link to www.transit.land or the Transitland Atlas repository.
Contributing
Crosswalks are maintained in the open, and contributions are welcome. Open a pull request in the Transitland Atlas repository on Github to add or edit crosswalk IDs on operator or feed records. See how to add or update a feed for the pull request process.