{
  "profile": "tabular-data-package",
  "name": "orlero-operator-coverage",
  "id": "https://orlero.com/en-gb/data/operator-coverage",
  "title": "Operator coverage: which intercity carriers serve which place pairs",
  "description": "Which intercity carriers serve which pairs of places, as a directed graph of 293,523 legs over 11,241 places and 2,093 operators in 211 countries. 56 per cent of the legs are derived from operator service areas and mapped routes rather than observed in a register, and every row carries which of the two it is. This is a coverage graph, not a timetable: it holds no departure times, no fares and no vehicles.",
  "version": "1.0.0",
  "created": "2026-09-14T06:57:52Z",
  "homepage": "https://orlero.com/en-gb/data/operator-coverage",
  "licenses": [
    {
      "name": "CC-BY-4.0",
      "title": "Creative Commons Attribution 4.0 International",
      "path": "https://creativecommons.org/licenses/by/4.0/"
    }
  ],
  "contributors": [
    {
      "title": "Orlero",
      "path": "https://orlero.com",
      "role": "author"
    }
  ],
  "keywords": [
    "transport",
    "intercity",
    "rail",
    "coach",
    "ferry",
    "aviation",
    "network",
    "coverage",
    "operators",
    "open data"
  ],
  "languages": [
    "en"
  ],
  "sources": [
    {
      "title": "GeoNames",
      "path": "https://www.geonames.org/",
      "licence": "CC BY 4.0",
      "vintage": "daily",
      "covers": "places: coordinates, population, timezone, country"
    },
    {
      "title": "Virtual Radar Server standing data",
      "path": "https://github.com/vradarserver/standing-data",
      "licence": "CC0 1.0",
      "vintage": "daily",
      "covers": "the primary air source: carriers and the corridors a callsign was seen flying, rebuilt daily. Gated on two distinct flight numbers per pair and on both ends taking scheduled service, so a positioning or charter leg does not become a route. 39,152 of the 44,046 air legs rest on it"
    },
    {
      "title": "OpenFlights routes and airlines",
      "path": "https://openflights.org/data.html",
      "licence": "ODbL 1.0",
      "vintage": "2014-08-06",
      "covers": "air carriers on pairs the standing data has never carried, which is 4,762 of the 44,046 air legs. A static archive: last data refresh August 2014, last touched upstream February 2017. It supports the claim that a corridor was flown"
    },
    {
      "title": "OurAirports",
      "path": "https://davidmegginson.github.io/ourairports-data/",
      "licence": "Public domain",
      "vintage": "daily",
      "covers": "the airports the air legs resolve to, their IATA and ICAO codes and whether they still take scheduled service"
    },
    {
      "title": "Mobility Database",
      "path": "https://mobilitydatabase.org/",
      "licence": "CC0 1.0 for the catalogue; each feed carries its own licence",
      "vintage": "continuous",
      "covers": "surface operators and the service areas the derived legs are inferred from"
    },
    {
      "title": "ANTT, Brazil: interstate coach authorisations",
      "path": "https://dados.antt.gov.br/",
      "licence": "CC BY 4.0",
      "vintage": "continuous",
      "covers": "observed coach legs in Brazil"
    },
    {
      "title": "MTOP, Uruguay: interdepartmental coach timetables",
      "path": "https://catalogodatos.gub.uy/",
      "licence": "CC BY 4.0",
      "vintage": "continuous",
      "covers": "observed coach legs in Uruguay and its cross-border sections"
    },
    {
      "title": "Ferryhopper port connection graph",
      "path": "https://www.ferryhopper.com/",
      "licence": "No published open licence",
      "vintage": "2026-09-12",
      "covers": "observed ferry legs, where a sailing was seen on the snapshot date. Used to confirm which crossings exist; no Ferryhopper record is redistributed here"
    },
    {
      "title": "OpenStreetMap route relations, via Overpass",
      "path": "https://www.openstreetmap.org/copyright",
      "licence": "ODbL 1.0",
      "vintage": "continuous",
      "covers": "mapped rail and coach lines, from which derived legs are inferred"
    }
  ],
  "resources": [
    {
      "name": "legs",
      "path": "data/legs.csv",
      "profile": "tabular-data-resource",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "dialect": {
        "csvddfVersion": 1.2,
        "delimiter": ",",
        "lineTerminator": "\n",
        "quoteChar": "\"",
        "header": true
      },
      "bytes": 48236940,
      "hash": "sha256:5f87c30c16f0866df914303a217f776f12126a0965c44e4cffaeb4b6f020265c",
      "rowCount": 293523,
      "description": "One row per directed leg: a place pair, a mode, and the carriers evidenced on it.",
      "schema": {
        "fields": [
          {
            "name": "from_place_id",
            "type": "string",
            "description": "Origin place. Joins to places.csv place_id.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "to_place_id",
            "type": "string",
            "description": "Destination place. Joins to places.csv place_id.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "from_country",
            "type": "string",
            "description": "ISO 3166-1 alpha-2 of the origin place.",
            "constraints": {
              "required": true,
              "minLength": 2,
              "maxLength": 2
            }
          },
          {
            "name": "to_country",
            "type": "string",
            "description": "ISO 3166-1 alpha-2 of the destination place.",
            "constraints": {
              "required": true,
              "minLength": 2,
              "maxLength": 2
            }
          },
          {
            "name": "mode",
            "type": "string",
            "description": "Mode of the carriers on this leg. No leg in the source mixes two modes; the build fails if one ever does.",
            "constraints": {
              "required": true,
              "enum": [
                "rail",
                "coach",
                "air",
                "ferry"
              ]
            }
          },
          {
            "name": "cross_border",
            "type": "boolean",
            "description": "True where the two endpoints sit in different countries.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "operator_count",
            "type": "integer",
            "description": "Number of carriers on the leg. Derived: it is the length of operator_ids. Zero where the corridor is evidenced but no carrier could be identified; see operator_ids.",
            "constraints": {
              "required": true,
              "minimum": 0
            }
          },
          {
            "name": "operator_ids",
            "type": "string",
            "description": "Space separated operator_id values, joining to operators.csv. Empty where the corridor is evidenced but the carrier named upstream was contradicted by the attribution check and withheld rather than printed: the corridor stands, the name does not.",
            "constraints": {
              "required": false
            }
          },
          {
            "name": "frequency",
            "type": "integer",
            "description": "An integer weight, not a departure count. It rises with the amount of evidence standing behind the leg: one per authorisation row for an observed coach leg, a route weight for an air leg. The product reads it as a rough services-per-day signal and it should not be cited as one.",
            "constraints": {
              "required": true,
              "minimum": 0
            }
          },
          {
            "name": "detour_factor",
            "type": "number",
            "description": "A per-mode constant applied to the great-circle distance when a journey time is worked out, not a measured path ratio for this corridor. Values present: rail 1.15, coach 1.15, air 1, ferry 1.05 or 1.1.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "source",
            "type": "string",
            "description": "Always \"Orlero network build\". The build that produced the row. Upstream feeds are listed once, per resource, under \"sources\": one leg can carry operators contributed by more than one register, so a single upstream name per row would be wrong about the others.",
            "constraints": {
              "required": true,
              "enum": [
                "Orlero network build"
              ]
            }
          },
          {
            "name": "source_url",
            "type": "string",
            "format": "uri",
            "description": "The landing page documenting how this row was produced.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "fetched_at",
            "type": "datetime",
            "description": "ISO 8601 with an explicit offset. The commit date of the source file, which is 2026-09-14T05:48:28Z. Not a wall clock: a rebuild of the same commit produces the same value.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "evidence",
            "type": "string",
            "description": "Carried through from the source unchanged. \"derived\": an operator service area, a mapped route relation or an archival route file covers both places, which is evidence the carrier serves the corridor. \"observed\": a register names the carrier and both endpoints.",
            "constraints": {
              "required": true,
              "enum": [
                "derived",
                "observed"
              ]
            }
          }
        ],
        "primaryKey": [
          "from_place_id",
          "to_place_id",
          "mode"
        ],
        "foreignKeys": [
          {
            "fields": "from_place_id",
            "reference": {
              "resource": "places",
              "fields": "place_id"
            }
          },
          {
            "fields": "to_place_id",
            "reference": {
              "resource": "places",
              "fields": "place_id"
            }
          }
        ],
        "missingValues": [
          ""
        ]
      },
      "sources": [
        {
          "title": "GeoNames",
          "path": "https://www.geonames.org/"
        },
        {
          "title": "Virtual Radar Server standing data",
          "path": "https://github.com/vradarserver/standing-data"
        },
        {
          "title": "OpenFlights routes and airlines",
          "path": "https://openflights.org/data.html"
        },
        {
          "title": "OurAirports",
          "path": "https://davidmegginson.github.io/ourairports-data/"
        },
        {
          "title": "Mobility Database",
          "path": "https://mobilitydatabase.org/"
        },
        {
          "title": "ANTT, Brazil: interstate coach authorisations",
          "path": "https://dados.antt.gov.br/"
        },
        {
          "title": "MTOP, Uruguay: interdepartmental coach timetables",
          "path": "https://catalogodatos.gub.uy/"
        },
        {
          "title": "Ferryhopper port connection graph",
          "path": "https://www.ferryhopper.com/"
        },
        {
          "title": "OpenStreetMap route relations, via Overpass",
          "path": "https://www.openstreetmap.org/copyright"
        }
      ]
    },
    {
      "name": "operators",
      "path": "data/operators.csv",
      "profile": "tabular-data-resource",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "dialect": {
        "csvddfVersion": 1.2,
        "delimiter": ",",
        "lineTerminator": "\n",
        "quoteChar": "\"",
        "header": true
      },
      "bytes": 360112,
      "hash": "sha256:3798e2faf5754ace69a43504b24354ce1692a25c5044bbbd95a9b94532941ccf",
      "rowCount": 2093,
      "description": "One row per carrier, with how much of the graph it carries.",
      "schema": {
        "fields": [
          {
            "name": "operator_id",
            "type": "string",
            "description": "Stable identifier used by legs.csv.",
            "constraints": {
              "required": true,
              "unique": true
            }
          },
          {
            "name": "slug",
            "type": "string",
            "description": "URL segment of the carrier page at /operator/<slug>.",
            "constraints": {
              "required": true,
              "unique": true
            }
          },
          {
            "name": "name",
            "type": "string",
            "description": "The carrier name as the registry files it, tidied for display.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "mode",
            "type": "string",
            "description": "rail, coach, air or ferry.",
            "constraints": {
              "required": true,
              "enum": [
                "rail",
                "coach",
                "air",
                "ferry"
              ]
            }
          },
          {
            "name": "country",
            "type": "string",
            "description": "ISO 3166-1 alpha-2 of the country the carrier is registered in. One value, CS, is a withdrawn code the upstream registry still files under; see coverage_by_country.csv iso_3166_1_current.",
            "constraints": {
              "required": true,
              "minLength": 2,
              "maxLength": 2
            }
          },
          {
            "name": "legs",
            "type": "integer",
            "description": "Derived: legs in legs.csv carrying this operator_id.",
            "constraints": {
              "required": true,
              "minimum": 0
            }
          },
          {
            "name": "legs_derived",
            "type": "integer",
            "description": "Derived: of this carrier's legs, those whose evidence is \"derived\".",
            "constraints": {
              "required": true,
              "minimum": 0
            }
          },
          {
            "name": "legs_observed",
            "type": "integer",
            "description": "Derived: of this carrier's legs, those whose evidence is \"observed\".",
            "constraints": {
              "required": true,
              "minimum": 0
            }
          },
          {
            "name": "places_served",
            "type": "integer",
            "description": "Derived: distinct places appearing at either end of one of this carrier's legs.",
            "constraints": {
              "required": true,
              "minimum": 0
            }
          },
          {
            "name": "countries_served",
            "type": "integer",
            "description": "Derived: distinct countries those places sit in.",
            "constraints": {
              "required": true,
              "minimum": 0
            }
          },
          {
            "name": "source",
            "type": "string",
            "description": "Always \"Orlero operator registry\". The build that produced the row. Upstream feeds are listed once, per resource, under \"sources\": one leg can carry operators contributed by more than one register, so a single upstream name per row would be wrong about the others.",
            "constraints": {
              "required": true,
              "enum": [
                "Orlero operator registry"
              ]
            }
          },
          {
            "name": "source_url",
            "type": "string",
            "format": "uri",
            "description": "The landing page documenting how this row was produced.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "fetched_at",
            "type": "datetime",
            "description": "ISO 8601 with an explicit offset. The commit date of the source file, which is 2026-09-14T06:57:52Z. Not a wall clock: a rebuild of the same commit produces the same value.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "evidence",
            "type": "string",
            "description": "Applies to the carrier record itself, which is a registry entry rather than an observation. The four count columns above are derived, and say so in their own descriptions.",
            "constraints": {
              "required": true,
              "enum": [
                "filed"
              ]
            }
          }
        ],
        "primaryKey": [
          "operator_id"
        ],
        "missingValues": [
          ""
        ]
      },
      "sources": [
        {
          "title": "GeoNames",
          "path": "https://www.geonames.org/"
        },
        {
          "title": "Virtual Radar Server standing data",
          "path": "https://github.com/vradarserver/standing-data"
        },
        {
          "title": "OpenFlights routes and airlines",
          "path": "https://openflights.org/data.html"
        },
        {
          "title": "OurAirports",
          "path": "https://davidmegginson.github.io/ourairports-data/"
        },
        {
          "title": "Mobility Database",
          "path": "https://mobilitydatabase.org/"
        },
        {
          "title": "ANTT, Brazil: interstate coach authorisations",
          "path": "https://dados.antt.gov.br/"
        },
        {
          "title": "MTOP, Uruguay: interdepartmental coach timetables",
          "path": "https://catalogodatos.gub.uy/"
        },
        {
          "title": "Ferryhopper port connection graph",
          "path": "https://www.ferryhopper.com/"
        },
        {
          "title": "OpenStreetMap route relations, via Overpass",
          "path": "https://www.openstreetmap.org/copyright"
        }
      ]
    },
    {
      "name": "places",
      "path": "data/places.csv",
      "profile": "tabular-data-resource",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "dialect": {
        "csvddfVersion": 1.2,
        "delimiter": ",",
        "lineTerminator": "\n",
        "quoteChar": "\"",
        "header": true
      },
      "bytes": 1604281,
      "hash": "sha256:16bcff0bafc6cc73de2c71226890f13ba9f28425909d5f823f44d0b00dffdbe3",
      "rowCount": 11241,
      "description": "The gazetteer the leg endpoints resolve to.",
      "schema": {
        "fields": [
          {
            "name": "place_id",
            "type": "string",
            "description": "Stable identifier used by legs.csv.",
            "constraints": {
              "required": true,
              "unique": true
            }
          },
          {
            "name": "slug",
            "type": "string",
            "description": "URL segment of the city page.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "name",
            "type": "string",
            "description": "Endonym or the most common English form, as GeoNames holds it.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "country",
            "type": "string",
            "description": "ISO 3166-1 alpha-2.",
            "constraints": {
              "required": true,
              "minLength": 2,
              "maxLength": 2
            }
          },
          {
            "name": "continent",
            "type": "string",
            "description": "Two letter continent code: AF, AS, EU, NA, OC, SA.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "latitude",
            "type": "number",
            "description": "WGS84 decimal degrees, five decimal places.",
            "constraints": {
              "required": true,
              "minimum": -90,
              "maximum": 90
            }
          },
          {
            "name": "longitude",
            "type": "number",
            "description": "WGS84 decimal degrees, five decimal places.",
            "constraints": {
              "required": true,
              "minimum": -180,
              "maximum": 180
            }
          },
          {
            "name": "population",
            "type": "integer",
            "description": "GeoNames population. Empty where GeoNames holds none, never zero.",
            "constraints": {
              "minimum": 1
            }
          },
          {
            "name": "timezone",
            "type": "string",
            "description": "IANA time zone identifier.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "legs",
            "type": "integer",
            "description": "Derived: legs in legs.csv with this place at either end.",
            "constraints": {
              "required": true,
              "minimum": 0
            }
          },
          {
            "name": "operators_serving",
            "type": "integer",
            "description": "Derived: distinct carriers on those legs.",
            "constraints": {
              "required": true,
              "minimum": 0
            }
          },
          {
            "name": "source",
            "type": "string",
            "description": "Always \"GeoNames\". The build that produced the row. Upstream feeds are listed once, per resource, under \"sources\": one leg can carry operators contributed by more than one register, so a single upstream name per row would be wrong about the others.",
            "constraints": {
              "required": true,
              "enum": [
                "GeoNames"
              ]
            }
          },
          {
            "name": "source_url",
            "type": "string",
            "format": "uri",
            "description": "The landing page documenting how this row was produced.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "fetched_at",
            "type": "datetime",
            "description": "ISO 8601 with an explicit offset. The commit date of the source file, which is 2026-09-14T05:02:12Z. Not a wall clock: a rebuild of the same commit produces the same value.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "evidence",
            "type": "string",
            "description": "Applies to the gazetteer record: coordinates, population, timezone and country are filed by GeoNames rather than observed by us. The two count columns above are derived.",
            "constraints": {
              "required": true,
              "enum": [
                "filed"
              ]
            }
          }
        ],
        "primaryKey": [
          "place_id"
        ],
        "missingValues": [
          ""
        ]
      },
      "sources": [
        {
          "title": "GeoNames",
          "path": "https://www.geonames.org/"
        },
        {
          "title": "Virtual Radar Server standing data",
          "path": "https://github.com/vradarserver/standing-data"
        },
        {
          "title": "OpenFlights routes and airlines",
          "path": "https://openflights.org/data.html"
        },
        {
          "title": "OurAirports",
          "path": "https://davidmegginson.github.io/ourairports-data/"
        },
        {
          "title": "Mobility Database",
          "path": "https://mobilitydatabase.org/"
        },
        {
          "title": "ANTT, Brazil: interstate coach authorisations",
          "path": "https://dados.antt.gov.br/"
        },
        {
          "title": "MTOP, Uruguay: interdepartmental coach timetables",
          "path": "https://catalogodatos.gub.uy/"
        },
        {
          "title": "Ferryhopper port connection graph",
          "path": "https://www.ferryhopper.com/"
        },
        {
          "title": "OpenStreetMap route relations, via Overpass",
          "path": "https://www.openstreetmap.org/copyright"
        }
      ]
    },
    {
      "name": "coverage_by_country",
      "path": "data/coverage_by_country.csv",
      "profile": "tabular-data-resource",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "dialect": {
        "csvddfVersion": 1.2,
        "delimiter": ",",
        "lineTerminator": "\n",
        "quoteChar": "\"",
        "header": true
      },
      "bytes": 33334,
      "hash": "sha256:657a4ff21a871f63c3edd40441389eed97a2f46f280b9b005b40a90934b345d5",
      "rowCount": 215,
      "description": "Coverage rolled up to the country, including the countries the graph barely reaches.",
      "schema": {
        "fields": [
          {
            "name": "country",
            "type": "string",
            "description": "ISO 3166-1 alpha-2, as the upstream registries file it.",
            "constraints": {
              "required": true,
              "unique": true,
              "minLength": 2,
              "maxLength": 2
            }
          },
          {
            "name": "country_name",
            "type": "string",
            "description": "English name, from CLDR. Empty where the code has no current name."
          },
          {
            "name": "places",
            "type": "integer",
            "description": "Places in places.csv sitting in this country.",
            "constraints": {
              "required": true,
              "minimum": 0
            }
          },
          {
            "name": "operators_registered",
            "type": "integer",
            "description": "Carriers in operators.csv whose registered country is this one.",
            "constraints": {
              "required": true,
              "minimum": 0
            }
          },
          {
            "name": "operators_serving",
            "type": "integer",
            "description": "Distinct carriers on a leg with at least one endpoint in this country. Higher than operators_registered wherever foreign carriers call.",
            "constraints": {
              "required": true,
              "minimum": 0
            }
          },
          {
            "name": "legs",
            "type": "integer",
            "description": "Legs with at least one endpoint here. A cross-border leg is counted once in each of its two countries, so this column sums to more than the row count of legs.csv.",
            "constraints": {
              "required": true,
              "minimum": 0
            }
          },
          {
            "name": "legs_domestic",
            "type": "integer",
            "description": "Legs with both endpoints in this country.",
            "constraints": {
              "required": true,
              "minimum": 0
            }
          },
          {
            "name": "legs_cross_border",
            "type": "integer",
            "description": "Legs with exactly one endpoint in this country.",
            "constraints": {
              "required": true,
              "minimum": 0
            }
          },
          {
            "name": "legs_derived",
            "type": "integer",
            "description": "Of the legs touching this country, those whose evidence is \"derived\".",
            "constraints": {
              "required": true,
              "minimum": 0
            }
          },
          {
            "name": "legs_observed",
            "type": "integer",
            "description": "Of the legs touching this country, those whose evidence is \"observed\".",
            "constraints": {
              "required": true,
              "minimum": 0
            }
          },
          {
            "name": "modes_served",
            "type": "string",
            "description": "Space separated modes present on a leg touching this country, in the order rail, coach, air, ferry. Empty where no leg touches it."
          },
          {
            "name": "mode_count",
            "type": "integer",
            "description": "How many of the four modes are present. A country at 1 is served in this graph by one mode only.",
            "constraints": {
              "required": true,
              "minimum": 0,
              "maximum": 4
            }
          },
          {
            "name": "iso_3166_1_current",
            "type": "boolean",
            "description": "False for a code that is no longer current ISO 3166-1 alpha-2. Kept rather than dropped, so that a defect in the upstream registry is visible instead of hidden.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "source",
            "type": "string",
            "description": "Always \"Orlero network build\". The build that produced the row. Upstream feeds are listed once, per resource, under \"sources\": one leg can carry operators contributed by more than one register, so a single upstream name per row would be wrong about the others.",
            "constraints": {
              "required": true,
              "enum": [
                "Orlero network build"
              ]
            }
          },
          {
            "name": "source_url",
            "type": "string",
            "format": "uri",
            "description": "The landing page documenting how this row was produced.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "fetched_at",
            "type": "datetime",
            "description": "ISO 8601 with an explicit offset. The commit date of the source file, which is 2026-09-14T05:48:28Z. Not a wall clock: a rebuild of the same commit produces the same value.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "evidence",
            "type": "string",
            "description": "Every column in this resource is an aggregate computed by this package. Nothing in it is observed, whatever the evidence of the legs underneath.",
            "constraints": {
              "required": true,
              "enum": [
                "derived"
              ]
            }
          }
        ],
        "primaryKey": [
          "country"
        ],
        "missingValues": [
          ""
        ]
      },
      "sources": [
        {
          "title": "GeoNames",
          "path": "https://www.geonames.org/"
        },
        {
          "title": "Virtual Radar Server standing data",
          "path": "https://github.com/vradarserver/standing-data"
        },
        {
          "title": "OpenFlights routes and airlines",
          "path": "https://openflights.org/data.html"
        },
        {
          "title": "OurAirports",
          "path": "https://davidmegginson.github.io/ourairports-data/"
        },
        {
          "title": "Mobility Database",
          "path": "https://mobilitydatabase.org/"
        },
        {
          "title": "ANTT, Brazil: interstate coach authorisations",
          "path": "https://dados.antt.gov.br/"
        },
        {
          "title": "MTOP, Uruguay: interdepartmental coach timetables",
          "path": "https://catalogodatos.gub.uy/"
        },
        {
          "title": "Ferryhopper port connection graph",
          "path": "https://www.ferryhopper.com/"
        },
        {
          "title": "OpenStreetMap route relations, via Overpass",
          "path": "https://www.openstreetmap.org/copyright"
        }
      ]
    },
    {
      "name": "legs_parquet",
      "path": "data/legs.parquet",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 2409662,
      "hash": "sha256:3ec5000ce6365c9b01c1b579af87b610d0908d321eb8b03b3631f8bc00ba8b63",
      "rowCount": 293523,
      "description": "legs.csv again, column oriented, for anybody working at scale. Same rows, same columns, same order. PLAIN encoded, pages compressed with the GZIP codec, which pandas, pyarrow, DuckDB and Spark all read without configuration.",
      "schema": {
        "fields": [
          {
            "name": "from_place_id",
            "type": "string",
            "description": "Origin place. Joins to places.csv place_id.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "to_place_id",
            "type": "string",
            "description": "Destination place. Joins to places.csv place_id.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "from_country",
            "type": "string",
            "description": "ISO 3166-1 alpha-2 of the origin place.",
            "constraints": {
              "required": true,
              "minLength": 2,
              "maxLength": 2
            }
          },
          {
            "name": "to_country",
            "type": "string",
            "description": "ISO 3166-1 alpha-2 of the destination place.",
            "constraints": {
              "required": true,
              "minLength": 2,
              "maxLength": 2
            }
          },
          {
            "name": "mode",
            "type": "string",
            "description": "Mode of the carriers on this leg. No leg in the source mixes two modes; the build fails if one ever does.",
            "constraints": {
              "required": true,
              "enum": [
                "rail",
                "coach",
                "air",
                "ferry"
              ]
            }
          },
          {
            "name": "cross_border",
            "type": "boolean",
            "description": "True where the two endpoints sit in different countries.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "operator_count",
            "type": "integer",
            "description": "Number of carriers on the leg. Derived: it is the length of operator_ids. Zero where the corridor is evidenced but no carrier could be identified; see operator_ids.",
            "constraints": {
              "required": true,
              "minimum": 0
            }
          },
          {
            "name": "operator_ids",
            "type": "string",
            "description": "Space separated operator_id values, joining to operators.csv. Empty where the corridor is evidenced but the carrier named upstream was contradicted by the attribution check and withheld rather than printed: the corridor stands, the name does not.",
            "constraints": {
              "required": false
            }
          },
          {
            "name": "frequency",
            "type": "integer",
            "description": "An integer weight, not a departure count. It rises with the amount of evidence standing behind the leg: one per authorisation row for an observed coach leg, a route weight for an air leg. The product reads it as a rough services-per-day signal and it should not be cited as one.",
            "constraints": {
              "required": true,
              "minimum": 0
            }
          },
          {
            "name": "detour_factor",
            "type": "number",
            "description": "A per-mode constant applied to the great-circle distance when a journey time is worked out, not a measured path ratio for this corridor. Values present: rail 1.15, coach 1.15, air 1, ferry 1.05 or 1.1.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "source",
            "type": "string",
            "description": "Always \"Orlero network build\". The build that produced the row. Upstream feeds are listed once, per resource, under \"sources\": one leg can carry operators contributed by more than one register, so a single upstream name per row would be wrong about the others.",
            "constraints": {
              "required": true,
              "enum": [
                "Orlero network build"
              ]
            }
          },
          {
            "name": "source_url",
            "type": "string",
            "format": "uri",
            "description": "The landing page documenting how this row was produced.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "fetched_at",
            "type": "datetime",
            "description": "ISO 8601 with an explicit offset. The commit date of the source file, which is 2026-09-14T05:48:28Z. Not a wall clock: a rebuild of the same commit produces the same value.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "evidence",
            "type": "string",
            "description": "Carried through from the source unchanged. \"derived\": an operator service area, a mapped route relation or an archival route file covers both places, which is evidence the carrier serves the corridor. \"observed\": a register names the carrier and both endpoints.",
            "constraints": {
              "required": true,
              "enum": [
                "derived",
                "observed"
              ]
            }
          }
        ],
        "primaryKey": [
          "from_place_id",
          "to_place_id",
          "mode"
        ],
        "foreignKeys": [
          {
            "fields": "from_place_id",
            "reference": {
              "resource": "places",
              "fields": "place_id"
            }
          },
          {
            "fields": "to_place_id",
            "reference": {
              "resource": "places",
              "fields": "place_id"
            }
          }
        ],
        "missingValues": [
          ""
        ]
      }
    }
  ]
}
