MobilityData canonical GTFS Schedule validator rules
181 of 181 rules
| Code | Description | Severity | Category |
|---|---|---|---|
| attribution_without_role | Attribution with no role. | WARNING | integrity |
| bidirectional_exit_gate | Pathway is bidirectional and has mode 7 (exit gate). | ERROR | semantic |
| big_gap_in_service | A service has a gap of more than 13 days between active service dates. | INFO | currency |
| block_trips_with_overlapping_stop_times | Trips with the same block id have overlapping stop times. | ERROR | semantic |
| csv_parsing_failed | Parsing of a CSV file failed. | ERROR | structure |
| decreasing_or_equal_stop_time_distance | Decreasing or equal `shape_dist_traveled` in `stop_times.txt`. | ERROR | semantic |
| decreasing_shape_distance | Decreasing `shape_dist_traveled` in `shapes.txt`. | ERROR | semantic |
| duplicate_fare_media | Two distinct fare media have the same fare media name and type. | WARNING | quality |
| duplicate_geo_json_key | A key in `locations.geojson` is duplicated. | ERROR | structure |
| duplicate_geography_id | Geography id is duplicated across multiple files. | ERROR | integrity |
| duplicate_key | Duplicated entity. | ERROR | integrity |
| duplicate_route_name | Two distinct routes have either the same `route_short_name`, the same `route_long_name`, or the same combination of `route_short_name` and `route_long_name`. | WARNING | quality |
| duplicated_column | Duplicated column in CSV. | ERROR | structure |
| empty_column_name | A column name is empty. | ERROR | structure |
| empty_file | A CSV file is empty. | ERROR | structure |
| empty_row | A row in the input file has only spaces. | WARNING | structure |
| equal_shape_distance_diff_coordinates | Two consecutive points have equal `shape_dist_traveled` and different lat/lon coordinates in `shapes.txt` and the distance between the two points is greater than the 1.11m. | ERROR | semantic |
| equal_shape_distance_diff_coordinates_distance_below_threshold | Two consecutive points have equal `shape_dist_traveled` and different lat/lon coordinates in `shapes.txt` and the distance between the two points is greater than 0 but less than 1.11m. | WARNING | semantic |
| equal_shape_distance_same_coordinates | Two consecutive points have equal `shape_dist_traveled` and the same lat/lon coordinates in `shapes.txt`. | WARNING | quality |
| expired_calendar | Dataset should not contain date ranges for services that have already expired. | WARNING | currency |
| fare_product_with_multiple_default_rider_categories | This notice is generated when a fare product is associated with multiple rider categories that are marked as default. | ERROR | semantic |
| fare_transfer_rule_duration_limit_type_without_duration_limit | A row from GTFS file `fare_transfer_rules.txt` has a defined `duration_limit_type` field but no `duration_limit` specified. | ERROR | integrity |
| fare_transfer_rule_duration_limit_without_type | A row from GTFS file `fare_transfer_rules.txt` has a defined `duration_limit` field but no `duration_limit_type` specified. | ERROR | integrity |
| fare_transfer_rule_invalid_transfer_count | A row from GTFS file `fare_transfer_rules.txt` has a defined `transfer_count` with an invalid value. | ERROR | format |
| fare_transfer_rule_missing_transfer_count | A row from `fare_transfer_rules.txt` has `from_leg_group_id` equal to `to_leg_group_id`, but has no `transfer_count` specified. | integrity | |
| fare_transfer_rule_with_forbidden_transfer_count | A row from `fare_transfer_rules.txt` has `from_leg_group_id` not equal to `to_leg_group_id`, but has `transfer_count` specified. | ERROR | integrity |
| fare_transfer_rule_without_transfer_count | A row from `fare_transfer_rules.txt` has `from_leg_group_id` equal to `to_leg_group_id`, but has no `transfer_count` specified. | ERROR | integrity |
| fast_travel_between_consecutive_stops | A transit vehicle moves too fast between two consecutive stops. | WARNING | plausibility |
| fast_travel_between_far_stops | A transit vehicle moves too fast between two far stops. | WARNING | plausibility |
| feed_expiration_date30_days | Dataset should cover at least the next 30 days of service. | WARNING | currency |
| feed_expiration_date7_days | Dataset should be valid for at least the next 7 days. | WARNING | currency |
| feed_info_lang_and_agency_lang_mismatch | Mismatching feed and agency language fields. | WARNING | semantic |
| feed_valid_beyond_total_service_window | The feed is valid 14 days beyond its total service window. | INFO | currency |
| forbidden_arrival_or_departure_time | The arrival or departure times are provided alongside pickup or drop-off windows in `stop_times.txt`. | ERROR | integrity |
| forbidden_continuous_pickup_drop_off | Continuous pickup or drop-off are forbidden when routes.continuous_pickup or routes.continuous_drop_off are 0, 2 or 3 and stop_times.start_pickup_drop_off_window or stop_times.end_pickup_drop_off_window are defined for any trip of this route. | ERROR | integrity |
| forbidden_drop_off_type | pickup_drop_off_window fields are forbidden when the drop_off_type is regularly scheduled (0). | ERROR | integrity |
| forbidden_geography_id | A stop_time entry has more than one geographical id defined. | ERROR | integrity |
| forbidden_pickup_type | pickup_drop_off_window fields are forbidden when the pickup_type is regularly scheduled (0) or must be coordinated with the driver (3). | ERROR | integrity |
| forbidden_prior_day_booking_field_value | A forbidden field value is present for a prior-day booking rule in `booking_rules.txt` | ERROR | integrity |
| forbidden_prior_notice_start_day | `prior_notice_start_day` value is forbidden when `prior_notice_duration_max` is set. | ERROR | integrity |
| forbidden_prior_notice_start_time | `prior_notice_start_time` value is forbidden when `prior_notice_start_day` value is not set in booking_rules.txt. | ERROR | integrity |
| forbidden_real_time_booking_field_value | A forbidden field value is present for a real-time booking rule in `booking_rules.txt`. | ERROR | integrity |
| forbidden_same_day_booking_field_value | A forbidden field value is present for a same-day booking rule in `booking_rules.txt`. | ERROR | integrity |
| forbidden_shape_dist_traveled | A stop_time entry has a `shape_dist_traveled` without a `stop_id` value. | ERROR | integrity |
| foreign_key_violation | Wrong foreign key. | ERROR | integrity |
| future_calendar | All services in the feed start in the future; no service covers today's date. | INFO | currency |
| future_feed | The feed covers the future only. | INFO | currency |
| geo_json_duplicated_element | Duplicated elements in locations.geojson file. | ERROR | structure |
| geo_json_unknown_element | Unknown elements in locations.geojson file. | INFO | structure |
| i_o_error | Error in IO operation. | ERROR | runtime |
| inconsistent_agency_lang | Inconsistent language among agencies. | WARNING | semantic |
| inconsistent_agency_timezone | Inconsistent Timezone among agencies. | ERROR | semantic |
| inconsistent_route_type_for_block_id | A block should have the same route mode. | WARNING | semantic |
| inconsistent_route_type_for_in_seat_transfer | An in-seat transfer should occur in the same route mode. | WARNING | semantic |
| invalid_character | This field contains invalid characters, such as the replacement character ("\uFFFD"). | ERROR | format |
| invalid_color | A field contains an invalid color value. | ERROR | format |
| invalid_currency | A field contains a wrong currency code. | ERROR | format |
| invalid_currency_amount | A currency amount field has a value that does not match the format of its corresponding currency code field. | ERROR | format |
| invalid_date | A field cannot be parsed as date. | ERROR | format |
| invalid_email | A field contains a malformed email address. | ERROR | format |
| invalid_float | A field cannot be parsed as a floating point number. | ERROR | format |
| invalid_geometry | A polygon in `locations.geojson` is unparsable or invalid. | ERROR | format |
| invalid_input_files_in_subfolder | At least 1 GTFS file is in a subfolder. | ERROR | package |
| invalid_integer | A field cannot be parsed as an integer. | ERROR | format |
| invalid_language_code | A field contains a wrong language code. | ERROR | format |
| invalid_phone_number | A field contains a malformed phone number. | ERROR | format |
| invalid_pickup_drop_off_window | The pickup/drop-off window in `stop_times.txt` is invalid. | ERROR | semantic |
| invalid_prior_notice_duration_min | An invalid `prior_notice_duration_min` value is present in a booking rule. | ERROR | semantic |
| invalid_row_length | Invalid csv row length. | ERROR | structure |
| invalid_time | A field cannot be parsed as time. | ERROR | format |
| invalid_timezone | A field cannot be parsed as a timezone. | ERROR | format |
| invalid_url | A field contains a malformed URL. | ERROR | format |
| leading_or_trailing_whitespaces | The value in CSV file has leading or trailing whitespaces. | WARNING | structure |
| location_with_unexpected_stop_time | A location in `stops.txt` that is not a stop is referenced by some `stop_times.stop_id`. | ERROR | semantic |
| location_without_parent_station | A location that must have `parent_station` field does not have it. | ERROR | integrity |
| malformed_json | A JSON file is malformed. | ERROR | structure |
| missing_bike_allowance | Ferry trips should include bike allowance information. | WARNING | quality |
| missing_calendar_and_calendar_date_files | Missing GTFS files `calendar.txt` and `calendar_dates.txt`. | ERROR | package |
| missing_feed_contact_email_and_url | Best Practices for `feed_info.txt` suggest providing at least one of `feed_contact_email` and `feed_contact_url`. | WARNING | quality |
| missing_feed_info_date | One of `feed_start_date` or `feed_end_date` is specified, but not both. | WARNING | integrity |
| missing_level_id | `stops.level_id` is conditionally required. | ERROR | integrity |
| missing_pickup_drop_off_booking_rule_id | pickup_booking_rule_id is recommended when pickup_type=2 and drop_off_booking_rule_id is recommended when drop_off_type=2. | WARNING | integrity |
| missing_pickup_or_drop_off_window | Either the start or end pickup/drop-off window is missing in `stop_times.txt`. | ERROR | integrity |
| missing_prior_day_booking_field_value | The `prior_notice_last_day` and the `prior_notice_last_time` values are required for prior day `booking_type` in booking_rules.txt. | integrity | |
| missing_prior_notice_duration_min | `prior_notice_duration_min` value is required for same day `booking_type` in booking_rules.txt. | ERROR | integrity |
| missing_prior_notice_last_day | The `prior_notice_last_day` is required when booking_type=2 (prior day booking) is specified in booking_rules.txt. | ERROR | integrity |
| missing_prior_notice_last_time | The `prior_notice_last_time` is required when booking_type=2 (prior day booking) is specified in booking_rules.txt. | ERROR | integrity |
| missing_prior_notice_start_time | `prior_notice_start_time` value is required when `prior_notice_start_day` value is set in booking_rules.txt. | ERROR | integrity |
| missing_recommended_column | A recommended column is missing in the input file. | quality | |
| missing_recommended_field | A recommended field is missing. | WARNING | quality |
| missing_recommended_file | A recommended file is missing. | WARNING | quality |
| missing_required_agency_id | Agency id is required when there are multiple agencies. | ERROR | integrity |
| missing_required_column | A required column is missing in the input file. | ERROR | structure |
| missing_required_element | A required element is missing in `locations.geojson`. | ERROR | structure |
| missing_required_field | A required field is missing. | ERROR | structure |
| missing_required_file | A required file is missing. | ERROR | package |
| missing_stop_name | `stops.stop_name` is required for `location_type` equal to `0`, `1`, or `2`. | ERROR | integrity |
| missing_stop_times_record | Only one stop_times record is found where two are required. | ERROR | semantic |
| missing_timepoint_value | `stop_times.timepoint` value is missing for a record. | WARNING | integrity |
| missing_trip_edge | Missing trip edge `arrival_time` or `departure_time`. | ERROR | semantic |
| mixed_case_recommended_field | This field has customer-facing text and should use Mixed Case (should contain upper and lower case letters). | WARNING | quality |
| more_than_one_entity | More than one row in CSV. | WARNING | structure |
| new_line_in_value | New line or carriage return in a value in CSV file. | ERROR | structure |
| non_ascii_or_non_printable_char | Non ascii or non printable char in ID field. | WARNING | quality |
| number_out_of_range | Out of range value. | ERROR | format |
| overlapping_frequency | Trip frequencies overlap. | ERROR | semantic |
| overlapping_zone_and_pickup_drop_off_window | Two entities have overlapping pickup/drop-off windows and zones. | ERROR | semantic |
| pathway_dangling_generic_node | A generic node has only one incident location in a pathway graph. | WARNING | semantic |
| pathway_loop | A pathway starts and ends at the same location. | WARNING | semantic |
| pathway_to_platform_with_boarding_areas | A pathway has an endpoint that is a platform which has boarding areas. | ERROR | semantic |
| pathway_to_stop_with_access_outside_of_station_pathways | A pathway has an endpoint that is a stop with stop_access=1, which should be accessible outside of the station's pathways. | ERROR | semantic |
| pathway_to_wrong_location_type | A pathway has an endpoint that is a station. | ERROR | semantic |
| pathway_unreachable_location | A location is not reachable at least in one direction: from the entrances or to the exits. | ERROR | semantic |
| platform_without_parent_station | A platform has no `parent_station` field set. | INFO | integrity |
| point_near_origin | A point is too close to origin `(0, 0)`. | ERROR | plausibility |
| point_near_pole | A point is too close to the North or South Pole. | ERROR | plausibility |
| prior_notice_last_day_after_start_day | Prior notice last day should not be greater than the prior notice start day in booking_rules.txt. | ERROR | semantic |
| route_both_short_and_long_name_missing | Both `route_short_name` and `route_long_name` are missing for a route. | ERROR | integrity |
| route_color_contrast | Insufficient route color contrast. | WARNING | quality |
| route_long_name_contains_short_name | Long name should not contain short name for a single route. | WARNING | quality |
| route_networks_specified_in_more_than_one_file | Indicates that route network identifiers are specified across multiple files. | ERROR | integrity |
| route_short_name_too_long | Short name of a route is too long (more than 12 characters). | WARNING | quality |
| runtime_exception_in_loader_error | RuntimeException while loading GTFS dataset in memory. | ERROR | runtime |
| runtime_exception_in_validator_error | RuntimeException while validating GTFS archive. | ERROR | runtime |
| same_name_and_description_for_route | Same name and description for route. | WARNING | quality |
| same_name_and_description_for_stop | Same name and description for stop. | WARNING | quality |
| same_route_and_agency_url | Same `routes.route_url` and `agency.agency_url`. | WARNING | quality |
| same_stop_and_agency_url | Same `stops.stop_url` and `agency.agency_url`. | WARNING | quality |
| same_stop_and_route_url | Same `stops.stop_url` and `routes.route_url`. | WARNING | quality |
| service_extends_far_in_the_future | A service end date is more than 2 years in the future. | INFO | currency |
| service_has_no_active_day_of_the_week | A service is not valid for any day of the week. | WARNING | semantic |
| service_window_outside_feed_period | A service window is not covered by the feed's validity period. | INFO | currency |
| single_shape_point | The shape within `shapes.txt` contains a single shape point. | WARNING | semantic |
| start_and_end_range_equal | Two date or time fields are equal. | ERROR | semantic |
| start_and_end_range_out_of_order | Two date or time fields are out of order. | ERROR | semantic |
| station_with_parent_station | A station has `parent_station` field set. | ERROR | integrity |
| stop_access_specified_for_incorrect_location | A location that is not a stop has stop_access specified. | ERROR | integrity |
| stop_access_specified_for_stop_with_no_parent_station | A stop without a value for parent station has stop_access specified. | ERROR | integrity |
| stop_has_too_many_matches_for_shape | Stop entry that has many potential matches to the trip's path of travel, as defined by the shape entry in `shapes.txt`. | WARNING | plausibility |
| stop_time_timepoint_without_times | `arrival_time` or `departure_time` not specified for timepoint. | ERROR | integrity |
| stop_time_with_arrival_before_previous_departure_time | Backwards time travel between stops in `stop_times.txt` | ERROR | semantic |
| stop_time_with_only_arrival_or_departure_time | Missing `stop_times.arrival_time` or `stop_times.departure_time`. | ERROR | integrity |
| stop_too_far_from_shape | Stop too far from trip shape. | WARNING | plausibility |
| stop_too_far_from_shape_using_user_distance | Stop time too far from shape. | WARNING | plausibility |
| stop_without_location | `stop_lat` and/or `stop_lon` is missing for stop with `location_type` equal to`0`, `1`, or `2` | ERROR | integrity |
| stop_without_stop_time | A stop in `stops.txt` is not referenced by any `stop_times.stop_id`. | WARNING | quality |
| stop_without_zone_id | Stop without value for `stops.zone_id` contained in a route with a zone-dependent fare rule. | INFO | integrity |
| stops_match_shape_out_of_order | Two stop entries are different than their arrival-departure order defined by `shapes.txt`. | WARNING | plausibility |
| thread_execution_error | ExecutionException during multithreaded validation | ERROR | runtime |
| timeframe_only_start_or_end_time_specified | A row from `timeframes.txt` was found with only one of `start_time` and `end_time` specified. | ERROR | integrity |
| timeframe_overlap | Two entries in `timeframes.txt` with the same `timeframe_group_id` and `service_id` have overlapping time intervals. | ERROR | semantic |
| timeframe_start_or_end_time_greater_than_twenty_four_hours | A time in `timeframes.txt` is greater than `24:00:00`. | ERROR | format |
| too_many_rows | A CSV file has too many rows. | ERROR | structure |
| transfer_distance_above_2_km | The transfer distance from stop to stop in `transfers.txt` is larger than 2 km. | INFO | plausibility |
| transfer_distance_too_large | The transfer distance from stop to stop in `transfers.txt` is larger than 10 km. | WARNING | plausibility |
| transfer_with_invalid_stop_location_type | A stop id field from GTFS file `transfers.txt` references a stop that has a `location_type` other than 0 or 1 (aka Stop/Platform or Station). | ERROR | integrity |
| transfer_with_invalid_trip_and_route | A trip id field from GTFS file `transfers.txt` references a route that does not match its `trips.txt` `route_id`. | ERROR | integrity |
| transfer_with_invalid_trip_and_stop | A trip id field from GTFS file `transfers.txt` references a stop that is not included in the referenced trip's stop-times. | ERROR | integrity |
| transfer_with_suspicious_mid_trip_in_seat | A trip id field from GTFS file `transfers.txt` with an in-seat transfer type references a stop that is not in the expected position in the trip's stop-times. | WARNING | plausibility |
| translation_foreign_key_violation | An entity with the given `record_id` and `record_sub_id` cannot be found in the referenced table. | ERROR | integrity |
| translation_unexpected_value | A field in a translations row has value but must be empty. | ERROR | integrity |
| translation_unknown_table_name | A translation references an unknown or missing GTFS table. | WARNING | integrity |
| trip_coverage_not_active_for_next7_days | Trips data should be valid for at least the next seven days. | WARNING | currency |
| trip_distance_exceeds_shape_distance | The distance between the last shape point and last stop point is greater than or equal to the 11.1m threshold. | ERROR | semantic |
| trip_distance_exceeds_shape_distance_below_threshold | The distance between the last shape point and last stop point is greater than 0 but less than the 11.1m threshold. | WARNING | semantic |
| trip_headsign_matches_intermediate_stop | Trip headsign matches the name of an intermediate stop, not the last stop. | INFO | quality |
| trip_with_shape_dist_traveled_but_no_shape_distances | A trip has shape_dist_traveled values in stop_times.txt but the shape referenced by the trip's shape_id does not have shape_dist_traveled values on all of its points in shapes.txt. | INFO | semantic |
| u_r_i_syntax_error | A string could not be parsed as a URI reference. | ERROR | format |
| unexpected_enum_value | An enum has an unexpected value. | WARNING | format |
| unknown_column | A column name is unknown. | INFO | structure |
| unknown_file | A file is unknown. | INFO | package |
| unsorted_stop_times | Stop times are not sorted by trip_id and stop_sequence. | INFO | quality |
| unsupported_feature_type | An unsupported feature type is used in the `locations.geojson` file. | ERROR | structure |
| unsupported_geo_json_type | An unsupported GeoJSON type is used in the `locations.geojson` file. | ERROR | structure |
| unsupported_geometry_type | A GeoJSON feature has an unsupported geometry type in `locations.geojson`. | ERROR | structure |
| unusable_trip | Trips must have more than one stop to be usable. | WARNING | semantic |
| unused_parent_station | Unused parent station. | quality | |
| unused_shape | Shape is not used in GTFS file `trips.txt`. | WARNING | quality |
| unused_station | Unused station. | INFO | quality |
| unused_trip | Trip is not be used in `stop_times.txt` | WARNING | quality |
| wrong_parent_location_type | Incorrect type of the parent location. | ERROR | integrity |
