{
  "agency_count": 267,
  "average_score": 60.0,
  "common_fixes": [
    {
      "agencies": 156,
      "code": "scorecard_wheelchair_boarding_unknown",
      "fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops."
    },
    {
      "agencies": 146,
      "code": "scorecard_wheelchair_accessible_unknown",
      "fix": "Set wheelchair_accessible on every trip. If every vehicle is accessible, this may be one default; otherwise use the value for each trip."
    },
    {
      "agencies": 101,
      "code": "scorecard_missing_feed_info_dates",
      "fix": "Add feed_info.txt with feed_start_date and feed_end_date to your export."
    },
    {
      "agencies": 85,
      "code": "scorecard_no_fare_data",
      "fix": "Add fare_attributes.txt (or Fares v2 files) with your fare structure. If your service is fare-free, ask to have it marked fare-free instead."
    },
    {
      "agencies": 44,
      "code": "decreasing_or_equal_stop_time_distance",
      "fix": "Re-generate shape distances in your export; flag to your vendor if it persists."
    },
    {
      "agencies": 24,
      "code": "trip_distance_exceeds_shape_distance",
      "fix": "Review the rule documentation for 'trip_distance_exceeds_shape_distance' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed."
    },
    {
      "agencies": 13,
      "code": "equal_shape_distance_diff_coordinates",
      "fix": "Review the rule documentation for 'equal_shape_distance_diff_coordinates' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed."
    },
    {
      "agencies": 13,
      "code": "scorecard_missing_headsigns",
      "fix": "Add the destination, direction, or 'via' label riders actually see to trip_headsign. Do not copy the route name. If the label changes during the trip, use stop_headsign."
    },
    {
      "agencies": 12,
      "code": "stop_time_with_arrival_before_previous_departure_time",
      "fix": "Review the rule documentation for 'stop_time_with_arrival_before_previous_departure_time' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed."
    },
    {
      "agencies": 11,
      "code": "block_trips_with_overlapping_stop_times",
      "fix": "Review the rule documentation for 'block_trips_with_overlapping_stop_times' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed."
    },
    {
      "agencies": 9,
      "code": "scorecard_wheelchair_boarding_unknown",
      "fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every terminal. A field survey can start with the busiest terminals."
    },
    {
      "agencies": 7,
      "code": "equal_shape_distance_diff_coordinates_distance_below_threshold",
      "fix": "Review the rule documentation for 'equal_shape_distance_diff_coordinates_distance_below_threshold' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed."
    },
    {
      "agencies": 6,
      "code": "missing_required_field",
      "fix": "Review the rule documentation for 'missing_required_field' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed."
    },
    {
      "agencies": 6,
      "code": "point_near_origin",
      "fix": "Review the rule documentation for 'point_near_origin' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed."
    },
    {
      "agencies": 6,
      "code": "scorecard_feed_expired",
      "fix": "Re-export the feed with a calendar that reaches further out. Set feed_end_date in feed_info.txt past your next service change."
    },
    {
      "agencies": 6,
      "code": "trip_distance_exceeds_shape_distance_below_threshold",
      "fix": "Re-generate shape_dist_traveled on export so stop and shape distances use the same units."
    },
    {
      "agencies": 5,
      "code": "stop_too_far_from_shape_using_user_distance",
      "fix": "Check the flagged stops' shape_dist_traveled against the route shape, and re-generate it on export if they disagree."
    },
    {
      "agencies": 5,
      "code": "equal_shape_distance_same_coordinates",
      "fix": "Turn on shape cleanup in your export tool, or drop the repeated points from shapes.txt."
    },
    {
      "agencies": 5,
      "code": "mixed_case_recommended_field",
      "fix": "Use mixed case for stop names and headsigns (e.g. 'Main St & 2nd Ave', not 'MAIN ST & 2ND AVE')."
    },
    {
      "agencies": 4,
      "code": "start_and_end_range_out_of_order",
      "fix": "Review the rule documentation for 'start_and_end_range_out_of_order' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed."
    },
    {
      "agencies": 3,
      "code": "missing_bike_allowance",
      "fix": "Review the rule documentation for 'missing_bike_allowance' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed."
    },
    {
      "agencies": 3,
      "code": "missing_timepoint_value",
      "fix": "Set timepoint=1 on stops that are real time checks and 0 on the rest. If every published time is a scheduled one, mark them all 1."
    },
    {
      "agencies": 3,
      "code": "invalid_url",
      "fix": "Review the rule documentation for 'invalid_url' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed."
    },
    {
      "agencies": 3,
      "code": "non_ascii_or_non_printable_char",
      "fix": "Only change the flagged IDs if an app needs basic ASCII values. Update each place that uses the ID. Keep all names and headsigns in their original language."
    },
    {
      "agencies": 3,
      "code": "scorecard_feed_expiring_soon",
      "fix": "Re-export with a validity window that reaches at least 60 days out."
    },
    {
      "agencies": 3,
      "code": "duplicate_key",
      "fix": "Review the rule documentation for 'duplicate_key' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed."
    },
    {
      "agencies": 2,
      "code": "missing_recommended_field",
      "fix": "Review the flagged fields and fill in the ones your riders would use."
    },
    {
      "agencies": 2,
      "code": "decreasing_shape_distance",
      "fix": "Review the rule documentation for 'decreasing_shape_distance' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed."
    },
    {
      "agencies": 2,
      "code": "stop_without_stop_time",
      "fix": "Remove retired stops from the export, or add them back to the trips that should serve them."
    },
    {
      "agencies": 2,
      "code": "unused_shape",
      "fix": "Turn on 'remove unused shapes' (or the like) in your export tool."
    },
    {
      "agencies": 2,
      "code": "expired_calendar",
      "fix": "Remove past service periods the next time you export the feed."
    }
  ],
  "comparison": {
    "absolute_rankings_published": false,
    "eligible_count": 235,
    "excluded_count": 32,
    "exclusion_counts": {
      "measured_category_set_mismatch": 30,
      "reader_archive_profile_mismatch": 1,
      "rubric_version_mismatch": 1,
      "scoring_profile_mismatch": 1,
      "scoring_profile_rubric_mismatch": 1
    },
    "individual_percentiles_published": false,
    "measured_category_cohorts": {
      "correctness+freshness+completeness": 235,
      "correctness+freshness+completeness+realtime": 30
    },
    "note": "Score aggregates and named changes use one current producer contract, raw reader archive profile, and measured-category set across canonical feed records, with unresolved duplicate identities removed. Absolute rankings and individual percentiles are not published.",
    "required_measured_categories": [
      "correctness",
      "freshness",
      "completeness"
    ],
    "required_reader_archive_profile": "raw-v1",
    "required_rubric_version": "1.3",
    "required_scoring_profile_id": "gtfs-scorecard-1.3",
    "required_validator_version": "8.0.1"
  },
  "expired": {
    "lapsed": 8,
    "stale": 0,
    "total": 8
  },
  "generated_at": "2026-09-01T00:52:24+00:00",
  "grade_distribution": {
    "A": 1,
    "B": 9,
    "C": 45,
    "D": 67,
    "F": 113
  },
  "members": [
    {
      "annual_trips": null,
      "attention_reason": "Service data expires in 53 day(s)",
      "days_until_expiry": 53,
      "expiry_status": "current",
      "grade": "C",
      "id": "ametis-amiens",
      "name": "Ametis (Amiens M\u00e9tropole)",
      "needs_attention": true,
      "score": 76.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data expires in 30 day(s)",
      "days_until_expiry": 30,
      "expiry_status": "expiring_soon",
      "grade": "F",
      "id": "astrobus-lisieux",
      "name": "Astrobus (Lisieux)",
      "needs_attention": true,
      "score": 55.1,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service window shortened unexpectedly on 2026-08-10",
      "days_until_expiry": 48,
      "expiry_status": "current",
      "grade": "F",
      "id": "bibus-brest",
      "name": "Bibus (Brest)",
      "needs_attention": true,
      "score": 54.1,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'trip_distance_exceeds_shape_distance' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "trip_distance_exceeds_shape_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": "Score changed sharply on 2026-08-31",
      "days_until_expiry": 305,
      "expiry_status": "current",
      "grade": "F",
      "id": "citibus-narbonne",
      "name": "Citibus (Narbonne)",
      "needs_attention": true,
      "score": 52.1,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": "The export's structure changed",
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "C",
      "id": "corolis-beauvais",
      "name": "Corolis (Beauvais)",
      "needs_attention": true,
      "score": 72.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data expires in 55 day(s)",
      "days_until_expiry": 55,
      "expiry_status": "current",
      "grade": "D",
      "id": "ginko-besancon",
      "name": "Ginko (Besan\u00e7on)",
      "needs_attention": true,
      "score": 69.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": "Score changed sharply on 2026-08-31",
      "days_until_expiry": 305,
      "expiry_status": "current",
      "grade": "C",
      "id": "ilevia-lille",
      "name": "il\u00e9via (M\u00e9tropole Europ\u00e9enne de Lille)",
      "needs_attention": true,
      "score": 74.3,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Add feed_info.txt with feed_start_date and feed_end_date to your export.",
      "top_fix_code": "scorecard_missing_feed_info_dates"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data expires in 48 day(s)",
      "days_until_expiry": 48,
      "expiry_status": "current",
      "grade": "F",
      "id": "izilo-lorient",
      "name": "Izilo (Lorient)",
      "needs_attention": true,
      "score": 49.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'trip_distance_exceeds_shape_distance' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "trip_distance_exceeds_shape_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": "The export's structure changed",
      "days_until_expiry": 305,
      "expiry_status": "current",
      "grade": "F",
      "id": "kiceo-vannes",
      "name": "Kic\u00e9o (Vannes)",
      "needs_attention": true,
      "score": 54.1,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'trip_distance_exceeds_shape_distance' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "trip_distance_exceeds_shape_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": "The export's structure changed",
      "days_until_expiry": 30,
      "expiry_status": "expiring_soon",
      "grade": "F",
      "id": "le-met-metz",
      "name": "LE MET' (Metz)",
      "needs_attention": true,
      "score": 47.5,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'foreign_key_violation' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "foreign_key_violation"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data expires in 35 day(s)",
      "days_until_expiry": 35,
      "expiry_status": "current",
      "grade": "F",
      "id": "lignes-dazur-nice",
      "name": "Lignes d'Azur (Nice)",
      "needs_attention": true,
      "score": 55.0,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data expires in 48 day(s)",
      "days_until_expiry": 48,
      "expiry_status": "current",
      "grade": "F",
      "id": "montelibus-montelimar",
      "name": "Mont\u00e9libus (Mont\u00e9limar)",
      "needs_attention": true,
      "score": 57.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": "Score changed sharply on 2026-08-30",
      "days_until_expiry": 365,
      "expiry_status": "current",
      "grade": "F",
      "id": "moova-vesoul",
      "name": "moova (Vesoul)",
      "needs_attention": true,
      "score": 47.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'trip_distance_exceeds_shape_distance' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "trip_distance_exceeds_shape_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data expires in 0 day(s)",
      "days_until_expiry": 0,
      "expiry_status": "lapsed",
      "grade": "F",
      "id": "move-vendome",
      "name": "Move (Vend\u00f4me)",
      "needs_attention": true,
      "score": 28.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-export the feed with a calendar that reaches further out. Set feed_end_date in feed_info.txt past your next service change.",
      "top_fix_code": "scorecard_feed_expired"
    },
    {
      "annual_trips": null,
      "attention_reason": "Published seasonal calendar ends in 30 day(s)",
      "days_until_expiry": 30,
      "expiry_status": "expiring_soon",
      "grade": "F",
      "id": "fr-pan-82998",
      "name": "Navette estivale Cort\u00e9 - vall\u00e9e de la Restonica",
      "needs_attention": true,
      "score": 56.8,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data expires in 48 day(s)",
      "days_until_expiry": 48,
      "expiry_status": "current",
      "grade": "F",
      "id": "orizo-grand-avignon",
      "name": "Orizo (Grand Avignon)",
      "needs_attention": true,
      "score": 46.5,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'trip_distance_exceeds_shape_distance' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "trip_distance_exceeds_shape_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data expires in 0 day(s)",
      "days_until_expiry": 0,
      "expiry_status": "lapsed",
      "grade": "F",
      "id": "ritmo-haguenau",
      "name": "Ritmo (Haguenau)",
      "needs_attention": true,
      "score": 32.8,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-export the feed with a calendar that reaches further out. Set feed_end_date in feed_info.txt past your next service change.",
      "top_fix_code": "scorecard_feed_expired"
    },
    {
      "annual_trips": null,
      "attention_reason": "Score fell 3.5 points since 2026-08-30",
      "days_until_expiry": 180,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-11681",
      "name": "R\u00e9seau europ\u00e9en FlixBus et FlixTrain",
      "needs_attention": true,
      "score": 46.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": "Score changed sharply on 2026-08-30",
      "days_until_expiry": 362,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-82324",
      "name": "R\u00e9seau interurbain - Charente (16)",
      "needs_attention": true,
      "score": 55.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": "Score fell 4.6 points since 2026-08-30",
      "days_until_expiry": 362,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-82326",
      "name": "R\u00e9seau interurbain - Charente-Maritime (17)",
      "needs_attention": true,
      "score": 48.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data expires in 30 day(s)",
      "days_until_expiry": 30,
      "expiry_status": "expiring_soon",
      "grade": "F",
      "id": "fr-pan-81479",
      "name": "R\u00e9seau interurbain BreizhGo Bateaux \u2014 Breizhgo Bateaux Br\u00e9hat",
      "needs_attention": true,
      "score": 59.5,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every terminal. A field survey can start with the busiest terminals.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": "The export's structure changed",
      "days_until_expiry": 305,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-81463",
      "name": "R\u00e9seau interurbain BreizhGo Car \u2014 Breizhgo 35",
      "needs_attention": true,
      "score": 51.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'equal_shape_distance_diff_coordinates' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "equal_shape_distance_diff_coordinates"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data expires in 48 day(s)",
      "days_until_expiry": 48,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-83112",
      "name": "R\u00e9seau interurbain Cars R\u00e9gion Express",
      "needs_attention": true,
      "score": 71.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data has expired",
      "days_until_expiry": -1,
      "expiry_status": "lapsed",
      "grade": "F",
      "id": "fluo-grand-est-aube",
      "name": "R\u00e9seau interurbain Fluo Grand Est - Aube",
      "needs_attention": true,
      "score": 15.2,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-export the feed with a calendar that reaches further out. Set feed_end_date in feed_info.txt past your next service change.",
      "top_fix_code": "scorecard_feed_expired"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service window shortened unexpectedly on 2026-08-30",
      "days_until_expiry": 305,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-83530",
      "name": "R\u00e9seau interurbain R\u00e9mi",
      "needs_attention": true,
      "score": 54.1,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data expires in 30 day(s)",
      "days_until_expiry": 30,
      "expiry_status": "expiring_soon",
      "grade": "F",
      "id": "fr-pan-82305",
      "name": "R\u00e9seau maritime de Corse du Sud",
      "needs_attention": true,
      "score": 45.0,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every terminal. A field survey can start with the busiest terminals.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": "The export's structure changed",
      "days_until_expiry": 181,
      "expiry_status": "current",
      "grade": "D",
      "id": "sncf-tgv-intercites-ter",
      "name": "R\u00e9seau SNCF TGV, Intercit\u00e9s et TER",
      "needs_attention": true,
      "score": 66.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data expires in 30 day(s)",
      "days_until_expiry": 30,
      "expiry_status": "expiring_soon",
      "grade": "F",
      "id": "fr-pan-81252",
      "name": "R\u00e9seau urbain A Citadina",
      "needs_attention": true,
      "score": 45.5,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": "Score changed sharply on 2026-08-30",
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-81072",
      "name": "R\u00e9seau urbain AXO",
      "needs_attention": true,
      "score": 39.8,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'trip_distance_exceeds_shape_distance' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "trip_distance_exceeds_shape_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data has expired",
      "days_until_expiry": -1,
      "expiry_status": "lapsed",
      "grade": "F",
      "id": "cap-cotentin",
      "name": "R\u00e9seau urbain Cap Cotentin",
      "needs_attention": true,
      "score": 39.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-export the feed with a calendar that reaches further out. Set feed_end_date in feed_info.txt past your next service change.",
      "top_fix_code": "scorecard_feed_expired"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data expires in 30 day(s)",
      "days_until_expiry": 30,
      "expiry_status": "expiring_soon",
      "grade": "F",
      "id": "fr-cmonbus",
      "name": "R\u00e9seau urbain Cmonbus",
      "needs_attention": true,
      "score": 57.5,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": "Grade slipped from D to F",
      "days_until_expiry": 30,
      "expiry_status": "expiring_soon",
      "grade": "F",
      "id": "fr-pan-79272",
      "name": "R\u00e9seau urbain et scolaire T'CAP \u2014 dsp24data-gtfs-2024-09-23-15-45-06.zip",
      "needs_attention": true,
      "score": 59.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'stop_time_with_arrival_before_previous_departure_time' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "stop_time_with_arrival_before_previous_departure_time"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data expires in 30 day(s)",
      "days_until_expiry": 30,
      "expiry_status": "expiring_soon",
      "grade": "F",
      "id": "fr-pan-81342",
      "name": "R\u00e9seau urbain et scolaire T'CAP \u2014 sco24data-gtfs-2024-10-16-10-39-46.zip",
      "needs_attention": true,
      "score": 55.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'stop_time_with_arrival_before_previous_departure_time' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "stop_time_with_arrival_before_previous_departure_time"
    },
    {
      "annual_trips": null,
      "attention_reason": "Score fell 3.3 points since 2026-08-30",
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-forbus",
      "name": "R\u00e9seau urbain Forbus",
      "needs_attention": true,
      "score": 74.2,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data expires in 41 day(s)",
      "days_until_expiry": 41,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-83528",
      "name": "R\u00e9seau urbain Le Bus de la Ville d\u2019Amboise",
      "needs_attention": true,
      "score": 70.1,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_accessible on every trip. If every vehicle is accessible, this may be one default; otherwise use the value for each trip.",
      "top_fix_code": "scorecard_wheelchair_accessible_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": "Score fell 7.0 points since 2026-08-30",
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-lib-bus",
      "name": "R\u00e9seau urbain Lib'Bus",
      "needs_attention": true,
      "score": 61.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'trip_distance_exceeds_shape_distance' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "trip_distance_exceeds_shape_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": "The export's structure changed",
      "days_until_expiry": 111,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-82291",
      "name": "R\u00e9seau urbain Lin\u00e9otim",
      "needs_attention": true,
      "score": 36.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'duplicate_key' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "duplicate_key"
    },
    {
      "annual_trips": null,
      "attention_reason": "Grade slipped from C to D",
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-moca",
      "name": "R\u00e9seau urbain MOCA",
      "needs_attention": true,
      "score": 65.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Ask your AVL vendor to check that every vehicle assignment reaches TripUpdates. School-day and tripper runs are the ones most often left out.",
      "top_fix_code": "scorecard_rt_trip_coverage"
    },
    {
      "annual_trips": null,
      "attention_reason": "The export's structure changed",
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-79374",
      "name": "R\u00e9seau urbain Optymo",
      "needs_attention": true,
      "score": 77.8,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Add fare_attributes.txt (or Fares v2 files) with your fare structure. If your service is fare-free, ask to have it marked fare-free instead.",
      "top_fix_code": "scorecard_no_fare_data"
    },
    {
      "annual_trips": null,
      "attention_reason": "The export's structure changed",
      "days_until_expiry": 487,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-rubis",
      "name": "R\u00e9seau urbain Rubis",
      "needs_attention": true,
      "score": 61.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Add coordinates for the flagged stops.",
      "top_fix_code": "stop_without_location"
    },
    {
      "annual_trips": null,
      "attention_reason": "The export's structure changed",
      "days_until_expiry": 303,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-83893",
      "name": "R\u00e9seau urbain Sud Sainte Baume",
      "needs_attention": true,
      "score": 47.2,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data expires in 48 day(s)",
      "days_until_expiry": 48,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-82348",
      "name": "R\u00e9seau urbain TCL",
      "needs_attention": true,
      "score": 76.2,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Add feed_info.txt with feed_start_date and feed_end_date to your export.",
      "top_fix_code": "scorecard_missing_feed_info_dates"
    },
    {
      "annual_trips": null,
      "attention_reason": "The export's structure changed",
      "days_until_expiry": 1249,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-transpor-pays-de-lor",
      "name": "R\u00e9seau urbain Transp\u2019Or",
      "needs_attention": true,
      "score": 49.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'start_and_end_range_out_of_order' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "start_and_end_range_out_of_order"
    },
    {
      "annual_trips": null,
      "attention_reason": "Score fell 3.9 points since 2026-08-30",
      "days_until_expiry": 48,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-uggo",
      "name": "R\u00e9seau urbain UGGO",
      "needs_attention": true,
      "score": 65.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data expires in 30 day(s)",
      "days_until_expiry": 30,
      "expiry_status": "expiring_soon",
      "grade": "F",
      "id": "fr-pan-83962",
      "name": "R\u00e9seau urbain Via Bastia",
      "needs_attention": true,
      "score": 35.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'equal_shape_distance_diff_coordinates' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "equal_shape_distance_diff_coordinates"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data expires in 29 day(s)",
      "days_until_expiry": 29,
      "expiry_status": "expiring_soon",
      "grade": "F",
      "id": "sncf-transilien",
      "name": "SNCF Transilien",
      "needs_attention": true,
      "score": 44.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-export with a validity window that reaches at least 60 days out.",
      "top_fix_code": "scorecard_feed_expiring_soon"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data expires in 48 day(s)",
      "days_until_expiry": 48,
      "expiry_status": "current",
      "grade": "F",
      "id": "stas-saint-etienne",
      "name": "STAS (Saint-\u00c9tienne M\u00e9tropole)",
      "needs_attention": true,
      "score": 27.8,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'trip_distance_exceeds_shape_distance' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "trip_distance_exceeds_shape_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data expires in 27 day(s)",
      "days_until_expiry": 27,
      "expiry_status": "expiring_soon",
      "grade": "B",
      "id": "sete-agglopole-mobilite",
      "name": "S\u00e8te Agglopole Mobilit\u00e9",
      "needs_attention": true,
      "score": 84.3,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-export with a validity window that reaches at least 60 days out.",
      "top_fix_code": "scorecard_feed_expiring_soon"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data has expired",
      "days_until_expiry": -2,
      "expiry_status": "lapsed",
      "grade": "F",
      "id": "tmm-moselle-madon",
      "name": "T'MM (Moselle et Madon)",
      "needs_attention": true,
      "score": 48.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-export the feed with a calendar that reaches further out. Set feed_end_date in feed_info.txt past your next service change.",
      "top_fix_code": "scorecard_feed_expired"
    },
    {
      "annual_trips": null,
      "attention_reason": "Published on-demand calendar ends in 27 day(s)",
      "days_until_expiry": 27,
      "expiry_status": "expiring_soon",
      "grade": "C",
      "id": "fr-pan-83155",
      "name": "TAD ligne Arrens-Marsous - Lourdes",
      "needs_attention": true,
      "score": 76.2,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-export with a validity window that reaches at least 60 days out.",
      "top_fix_code": "scorecard_feed_expiring_soon"
    },
    {
      "annual_trips": null,
      "attention_reason": "The export's structure changed",
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "tango-nimes",
      "name": "Tango (N\u00eemes M\u00e9tropole)",
      "needs_attention": true,
      "score": 53.8,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data expires in 46 day(s)",
      "days_until_expiry": 46,
      "expiry_status": "current",
      "grade": "F",
      "id": "tlp-tarbes-lourdes",
      "name": "TLP (Tarbes-Lourdes)",
      "needs_attention": true,
      "score": 55.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'trip_distance_exceeds_shape_distance' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "trip_distance_exceeds_shape_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data expires in 0 day(s)",
      "days_until_expiry": 0,
      "expiry_status": "lapsed",
      "grade": "F",
      "id": "transurbain-evreux",
      "name": "Transurbain (\u00c9vreux)",
      "needs_attention": true,
      "score": 54.3,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-export the feed with a calendar that reaches further out. Set feed_end_date in feed_info.txt past your next service change.",
      "top_fix_code": "scorecard_feed_expired"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data expires in 0 day(s)",
      "days_until_expiry": 0,
      "expiry_status": "lapsed",
      "grade": "F",
      "id": "transvilles-valenciennes",
      "name": "Transvilles (Valenciennes)",
      "needs_attention": true,
      "score": 33.1,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-export the feed with a calendar that reaches further out. Set feed_end_date in feed_info.txt past your next service change.",
      "top_fix_code": "scorecard_feed_expired"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data expires in 0 day(s)",
      "days_until_expiry": 0,
      "expiry_status": "lapsed",
      "grade": "F",
      "id": "tuc-cambrai",
      "name": "TUC (Cambrai)",
      "needs_attention": true,
      "score": 15.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-export the feed with a calendar that reaches further out. Set feed_end_date in feed_info.txt past your next service change.",
      "top_fix_code": "scorecard_feed_expired"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data expires in 30 day(s)",
      "days_until_expiry": 30,
      "expiry_status": "expiring_soon",
      "grade": "F",
      "id": "yole-challans",
      "name": "Yol\u00e9 (Challans)",
      "needs_attention": true,
      "score": 51.3,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'missing_required_file' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "missing_required_file"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 125,
      "expiry_status": "current",
      "grade": "D",
      "id": "agglobus-rodez",
      "name": "Agglobus (Rodez)",
      "needs_attention": false,
      "score": 62.5,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 365,
      "expiry_status": "current",
      "grade": "D",
      "id": "aleop-pays-de-la-loire",
      "name": "Al\u00e9op (Pays de la Loire)",
      "needs_attention": false,
      "score": 61.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Remove retired stops from the export, or add them back to the trips that should serve them.",
      "top_fix_code": "stop_without_stop_time"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "B",
      "id": "aleop-yeu-continent",
      "name": "Al\u00e9op Yeu-Continent (\u00cele d'Yeu ferry)",
      "needs_attention": false,
      "score": 83.3,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_accessible on every trip. If every vehicle is accessible, this may be one default; otherwise use the value for each trip.",
      "top_fix_code": "scorecard_wheelchair_accessible_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 487,
      "expiry_status": "current",
      "grade": "B",
      "id": "fr-bacs-de-loire-en-loire-atlantique-44",
      "name": "Bacs de Loire en Loire-Atlantique (44)",
      "needs_attention": false,
      "score": 80.1,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_accessible on every trip. If every vehicle is accessible, this may be one default; otherwise use the value for each trip.",
      "top_fix_code": "scorecard_wheelchair_accessible_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 365,
      "expiry_status": "current",
      "grade": "D",
      "id": "brittany-ferries",
      "name": "Brittany Ferries",
      "needs_attention": false,
      "score": 69.2,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Add the destination, direction, or 'via' label riders actually see to trip_headsign. Do not copy the route name. If the label changes during the trip, use stop_headsign.",
      "top_fix_code": "scorecard_missing_headsigns"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 336,
      "expiry_status": "current",
      "grade": "B",
      "id": "car-jaune-reunion",
      "name": "Car Jaune (La R\u00e9union)",
      "needs_attention": false,
      "score": 81.2,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_accessible on every trip. If every vehicle is accessible, this may be one default; otherwise use the value for each trip.",
      "top_fix_code": "scorecard_wheelchair_accessible_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 309,
      "expiry_status": "current",
      "grade": "D",
      "id": "carabus-royan",
      "name": "Cara'bus (Royan)",
      "needs_attention": false,
      "score": 63.0,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 320,
      "expiry_status": "current",
      "grade": "D",
      "id": "cars-regionaux-23-creuse",
      "name": "Cars R\u00e9gionaux 23 \u2014 Creuse",
      "needs_attention": false,
      "score": 60.3,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 305,
      "expiry_status": "current",
      "grade": "C",
      "id": "choletbus",
      "name": "Choletbus",
      "needs_attention": false,
      "score": 78.8,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_accessible on every trip. If every vehicle is accessible, this may be one default; otherwise use the value for each trip.",
      "top_fix_code": "scorecard_wheelchair_accessible_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "D",
      "id": "citalis-reunion",
      "name": "Citalis (La R\u00e9union)",
      "needs_attention": false,
      "score": 61.1,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 180,
      "expiry_status": "current",
      "grade": "C",
      "id": "cts-strasbourg",
      "name": "CTS (Strasbourg)",
      "needs_attention": false,
      "score": 74.5,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 273,
      "expiry_status": "current",
      "grade": "D",
      "id": "deepmob-dieppe",
      "name": "DeepMob (Dieppe)",
      "needs_attention": false,
      "score": 61.1,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "D",
      "id": "divia-dijon",
      "name": "DiviaMobilit\u00e9s (Dijon)",
      "needs_attention": false,
      "score": 69.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_accessible on every trip. If every vehicle is accessible, this may be one default; otherwise use the value for each trip.",
      "top_fix_code": "scorecard_wheelchair_accessible_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 88,
      "expiry_status": "current",
      "grade": "F",
      "id": "eurostar",
      "name": "Eurostar",
      "needs_attention": false,
      "score": 58.1,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 123,
      "expiry_status": "current",
      "grade": "D",
      "id": "fil-bleu-tours",
      "name": "Fil Bleu (Tours)",
      "needs_attention": false,
      "score": 61.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'invalid_time' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "invalid_time"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 305,
      "expiry_status": "current",
      "grade": "F",
      "id": "filibus-chartres",
      "name": "Filibus (Chartres)",
      "needs_attention": false,
      "score": 51.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 303,
      "expiry_status": "current",
      "grade": "D",
      "id": "hilagobus-saint-gilles",
      "name": "Hilagobus (Saint-Gilles-Croix-de-Vie)",
      "needs_attention": false,
      "score": 69.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 307,
      "expiry_status": "current",
      "grade": "C",
      "id": "idelis-pau",
      "name": "Idelis (Pau)",
      "needs_attention": false,
      "score": 76.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Add feed_info.txt with feed_start_date and feed_end_date to your export.",
      "top_fix_code": "scorecard_missing_feed_info_dates"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "D",
      "id": "impulsyon-la-roche-sur-yon",
      "name": "Impulsyon (La Roche-sur-Yon)",
      "needs_attention": false,
      "score": 60.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'trip_distance_exceeds_shape_distance' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "trip_distance_exceeds_shape_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 1277,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-84096",
      "name": "Ligne de covoiturage Pays Nantais",
      "needs_attention": false,
      "score": 72.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 273,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-81617",
      "name": "Lignes de covoiturage M covoit' Lignes+",
      "needs_attention": false,
      "score": 61.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'decreasing_shape_distance' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "decreasing_shape_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 306,
      "expiry_status": "current",
      "grade": "F",
      "id": "marineo-boulogne",
      "name": "Marin\u00e9o (Boulogne-sur-Mer)",
      "needs_attention": false,
      "score": 57.5,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'trip_distance_exceeds_shape_distance' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "trip_distance_exceeds_shape_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "mobigo-cote-dor",
      "name": "Mobigo interurbain (C\u00f4te-d'Or)",
      "needs_attention": false,
      "score": 38.2,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'point_near_origin' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "point_near_origin"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "aix-marseille-provence",
      "name": "M\u00e9tropole Aix-Marseille-Provence networks",
      "needs_attention": false,
      "score": 40.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 62,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-81177",
      "name": "Navette estivale SNGO! Giverny Vernon - Gare SNCF",
      "needs_attention": false,
      "score": 71.5,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-navette-pontorson-le-mont-saint-michel",
      "name": "Navette Pontorson \u2013 Le Mont-Saint-Michel",
      "needs_attention": false,
      "score": 64.2,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-83405",
      "name": "Navettes A\u00e9roport de Lille",
      "needs_attention": false,
      "score": 73.2,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-uba",
      "name": "Navettes maritimes - UBA",
      "needs_attention": false,
      "score": 65.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every terminal. A field survey can start with the busiest terminals.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 95,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-83626",
      "name": "Navettes saisonni\u00e8res Bourg-Saint-Maurice",
      "needs_attention": false,
      "score": 56.2,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'point_near_origin' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "point_near_origin"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "C",
      "id": "neobus-ouest-vosgien",
      "name": "Neobus (Ouest Vosgien)",
      "needs_attention": false,
      "score": 74.8,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "ondea-aix-les-bains",
      "name": "Ond\u00e9a (Aix-les-Bains)",
      "needs_attention": false,
      "score": 52.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 125,
      "expiry_status": "current",
      "grade": "C",
      "id": "palmbus-cannes",
      "name": "Palmbus (Cannes)",
      "needs_attention": false,
      "score": 77.2,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 94,
      "expiry_status": "current",
      "grade": "D",
      "id": "pastel-saint-quentin",
      "name": "Pastel (Saint-Quentin)",
      "needs_attention": false,
      "score": 66.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-82872",
      "name": "Programme des vols Finist'Air",
      "needs_attention": false,
      "score": 79.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Add feed_info.txt with feed_start_date and feed_end_date to your export.",
      "top_fix_code": "scorecard_missing_feed_info_dates"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "B",
      "id": "red-redon",
      "name": "RED (Redon)",
      "needs_attention": false,
      "score": 82.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 362,
      "expiry_status": "current",
      "grade": "F",
      "id": "rlv-riom",
      "name": "RLV Mobilit\u00e9s (Riom)",
      "needs_attention": false,
      "score": 31.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 365,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-83113",
      "name": "R\u00e9seau interurbain - Ain (01)",
      "needs_attention": false,
      "score": 52.1,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 365,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-38889",
      "name": "R\u00e9seau interurbain - Allier (03)",
      "needs_attention": false,
      "score": 61.1,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 365,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-80961",
      "name": "R\u00e9seau interurbain - Ard\u00e8che (07)",
      "needs_attention": false,
      "score": 56.5,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 365,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-81245",
      "name": "R\u00e9seau interurbain - Cantal (15)",
      "needs_attention": false,
      "score": 69.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 320,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-82328",
      "name": "R\u00e9seau interurbain - Corr\u00e8ze (19)",
      "needs_attention": false,
      "score": 52.3,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 1583,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-83200",
      "name": "R\u00e9seau interurbain - Corse",
      "needs_attention": false,
      "score": 61.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 341,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-82334",
      "name": "R\u00e9seau interurbain - Deux-S\u00e8vres (79)",
      "needs_attention": false,
      "score": 53.8,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 355,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-82336",
      "name": "R\u00e9seau interurbain - Dordogne (24)",
      "needs_attention": false,
      "score": 52.3,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 334,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-82338",
      "name": "R\u00e9seau interurbain - Gironde (33)",
      "needs_attention": false,
      "score": 48.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 365,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-38881",
      "name": "R\u00e9seau interurbain - Haute-Loire (43)",
      "needs_attention": false,
      "score": 52.1,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 365,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-80964",
      "name": "R\u00e9seau interurbain - Haute-Savoie (74)",
      "needs_attention": false,
      "score": 66.1,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 355,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-82340",
      "name": "R\u00e9seau interurbain - Haute-Vienne (87)",
      "needs_attention": false,
      "score": 60.0,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 365,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-40287",
      "name": "R\u00e9seau interurbain - Is\u00e8re (38)",
      "needs_attention": false,
      "score": 56.8,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 125,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-82342",
      "name": "R\u00e9seau interurbain - Landes (40)",
      "needs_attention": false,
      "score": 71.8,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_accessible on every trip. If every vehicle is accessible, this may be one default; otherwise use the value for each trip.",
      "top_fix_code": "scorecard_wheelchair_accessible_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 365,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-83114",
      "name": "R\u00e9seau interurbain - Loire (42)",
      "needs_attention": false,
      "score": 57.5,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 305,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-82344",
      "name": "R\u00e9seau interurbain - Lot-et-Garonne (47)",
      "needs_attention": false,
      "score": 70.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_accessible on every trip. If every vehicle is accessible, this may be one default; otherwise use the value for each trip.",
      "top_fix_code": "scorecard_wheelchair_accessible_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 365,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-38888",
      "name": "R\u00e9seau interurbain - Puy-de-D\u00f4me (63)",
      "needs_attention": false,
      "score": 54.8,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 303,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-82346",
      "name": "R\u00e9seau interurbain - Pyr\u00e9n\u00e9es-Atlantiques (64)",
      "needs_attention": false,
      "score": 71.0,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_accessible on every trip. If every vehicle is accessible, this may be one default; otherwise use the value for each trip.",
      "top_fix_code": "scorecard_wheelchair_accessible_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 365,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-81244",
      "name": "R\u00e9seau interurbain - Savoie (73)",
      "needs_attention": false,
      "score": 66.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 348,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-82332",
      "name": "R\u00e9seau interurbain - Vienne (86)",
      "needs_attention": false,
      "score": 70.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_accessible on every trip. If every vehicle is accessible, this may be one default; otherwise use the value for each trip.",
      "top_fix_code": "scorecard_wheelchair_accessible_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-81480",
      "name": "R\u00e9seau interurbain BreizhGo Bateaux \u2014 Breizhgo Bateaux Finist\u00e8re",
      "needs_attention": false,
      "score": 60.5,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every terminal. A field survey can start with the busiest terminals.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-81481",
      "name": "R\u00e9seau interurbain BreizhGo Bateaux \u2014 Breizhgo Bateaux Morbihan",
      "needs_attention": false,
      "score": 56.8,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 306,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-81462",
      "name": "R\u00e9seau interurbain BreizhGo Car \u2014 Breizhgo Car 29",
      "needs_attention": false,
      "score": 36.8,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'equal_shape_distance_diff_coordinates' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "equal_shape_distance_diff_coordinates"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 306,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-81464",
      "name": "R\u00e9seau interurbain BreizhGo Car \u2014 Breizhgo Car 56",
      "needs_attention": false,
      "score": 48.2,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'trip_distance_exceeds_shape_distance' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "trip_distance_exceeds_shape_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 90,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-81474",
      "name": "R\u00e9seau interurbain BreizhGo TER",
      "needs_attention": false,
      "score": 65.3,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-82137",
      "name": "R\u00e9seau interurbain bus Proximit\u00e9 ZOU !",
      "needs_attention": false,
      "score": 48.5,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 365,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-80960",
      "name": "R\u00e9seau interurbain et scolaire - Dr\u00f4me (26)",
      "needs_attention": false,
      "score": 48.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-81138",
      "name": "R\u00e9seau interurbain et TAD zonal Corolis",
      "needs_attention": false,
      "score": 41.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'trip_distance_exceeds_shape_distance' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "trip_distance_exceeds_shape_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 150,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-82285",
      "name": "R\u00e9seau interurbain Express ZOU !",
      "needs_attention": false,
      "score": 57.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fluo-grand-est-ardennes",
      "name": "R\u00e9seau interurbain Fluo Grand Est - Ardennes",
      "needs_attention": false,
      "score": 52.8,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 363,
      "expiry_status": "current",
      "grade": "D",
      "id": "fluo-grand-est-bas-rhin",
      "name": "R\u00e9seau interurbain Fluo Grand Est - Bas-Rhin",
      "needs_attention": false,
      "score": 64.3,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'point_near_origin' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "point_near_origin"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-80419",
      "name": "R\u00e9seau interurbain Fluo Grand-Est - Haut-Rhin (68)",
      "needs_attention": false,
      "score": 47.3,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-81989",
      "name": "R\u00e9seau interurbain Fluo Grand-Est - Haute-Marne (52)",
      "needs_attention": false,
      "score": 49.3,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-80421",
      "name": "R\u00e9seau interurbain Fluo Grand-Est - Marne (51)",
      "needs_attention": false,
      "score": 64.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-80423",
      "name": "R\u00e9seau interurbain Fluo Grand-Est - Meurthe-et-Moselle (54)",
      "needs_attention": false,
      "score": 43.1,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-80425",
      "name": "R\u00e9seau interurbain Fluo Grand-Est - Meuse (55)",
      "needs_attention": false,
      "score": 50.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 349,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-80427",
      "name": "R\u00e9seau interurbain Fluo Grand-Est - Moselle (57)",
      "needs_attention": false,
      "score": 40.5,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-80429",
      "name": "R\u00e9seau interurbain Fluo Grand-Est - Vosges (88)",
      "needs_attention": false,
      "score": 36.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 365,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-81026",
      "name": "R\u00e9seau interurbain liO Occitanie",
      "needs_attention": false,
      "score": 52.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'trip_distance_exceeds_shape_distance' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "trip_distance_exceeds_shape_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 366,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-82317",
      "name": "R\u00e9seau interurbain Nomad Car",
      "needs_attention": false,
      "score": 51.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 305,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-80701",
      "name": "R\u00e9seau interurbain TXIK TXAK",
      "needs_attention": false,
      "score": 72.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Add fare_attributes.txt (or Fares v2 files) with your fare structure. If your service is fare-free, ask to have it marked fare-free instead.",
      "top_fix_code": "scorecard_no_fare_data"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 125,
      "expiry_status": "current",
      "grade": "D",
      "id": "leo-auxerrois",
      "name": "R\u00e9seau L\u00e9o (Communaut\u00e9 d'Agglom\u00e9ration de l'Auxerrois)",
      "needs_attention": false,
      "score": 69.0,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_accessible on every trip. If every vehicle is accessible, this may be one default; otherwise use the value for each trip.",
      "top_fix_code": "scorecard_wheelchair_accessible_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 208,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-82382",
      "name": "R\u00e9seau maritime - Gironde (33)",
      "needs_attention": false,
      "score": 78.2,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Add feed_info.txt with feed_start_date and feed_end_date to your export.",
      "top_fix_code": "scorecard_missing_feed_info_dates"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-bacs-de-seine",
      "name": "R\u00e9seau maritime Bacs de Seine",
      "needs_attention": false,
      "score": 65.3,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every terminal. A field survey can start with the busiest terminals.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 121,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-81996",
      "name": "R\u00e9seau maritime Corsica Ferries",
      "needs_attention": false,
      "score": 58.3,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'missing_required_field' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "missing_required_field"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 153,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-83510",
      "name": "R\u00e9seau maritime Corsica Linea",
      "needs_attention": false,
      "score": 68.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'point_near_origin' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "point_near_origin"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-martinique-maritime",
      "name": "R\u00e9seau maritime de Martinique",
      "needs_attention": false,
      "score": 49.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'stop_time_with_arrival_before_previous_departure_time' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "stop_time_with_arrival_before_previous_departure_time"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 91,
      "expiry_status": "current",
      "grade": "F",
      "id": "reseau-mistral-toulon",
      "name": "R\u00e9seau Mistral (Toulon)",
      "needs_attention": false,
      "score": 56.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'equal_shape_distance_diff_coordinates' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "equal_shape_distance_diff_coordinates"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 102,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-81653",
      "name": "R\u00e9seau national Trenitalia France",
      "needs_attention": false,
      "score": 43.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'stop_time_with_arrival_before_previous_departure_time' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "stop_time_with_arrival_before_previous_departure_time"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 305,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-82094",
      "name": "R\u00e9seau scolaire de Flers",
      "needs_attention": false,
      "score": 62.5,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'stop_time_with_arrival_before_previous_departure_time' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "stop_time_with_arrival_before_previous_departure_time"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-82136",
      "name": "R\u00e9seau scolaire interurbain ZOU !",
      "needs_attention": false,
      "score": 53.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "B",
      "id": "fr-pan-83769",
      "name": "R\u00e9seau scolaire Tiva",
      "needs_attention": false,
      "score": 87.2,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_accessible on every trip. If every vehicle is accessible, this may be one default; otherwise use the value for each trip.",
      "top_fix_code": "scorecard_wheelchair_accessible_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "D",
      "id": "stan-nancy",
      "name": "R\u00e9seau Stan (Nancy)",
      "needs_attention": false,
      "score": 60.0,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 229,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-83982",
      "name": "R\u00e9seau urbain - Navette Ariane",
      "needs_attention": false,
      "score": 73.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'invalid_url' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "invalid_url"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-83258",
      "name": "R\u00e9seau urbain 3CMA",
      "needs_attention": false,
      "score": 59.8,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 1483,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-82997",
      "name": "R\u00e9seau urbain A Balanina",
      "needs_attention": false,
      "score": 68.2,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 1583,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-82995",
      "name": "R\u00e9seau urbain A Berlina",
      "needs_attention": false,
      "score": 63.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 487,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-81705",
      "name": "R\u00e9seau urbain Agglobus \u2014 CACL PERIURBAIN",
      "needs_attention": false,
      "score": 30.3,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'equal_shape_distance_diff_coordinates' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "equal_shape_distance_diff_coordinates"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-83304",
      "name": "R\u00e9seau urbain Agglobus \u2014 GTFS L7 ET L10",
      "needs_attention": false,
      "score": 47.8,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'duplicate_key' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "duplicate_key"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-83781",
      "name": "R\u00e9seau urbain Agglobus \u2014 GTFS SEMOP 2026",
      "needs_attention": false,
      "score": 70.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 305,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-75062",
      "name": "R\u00e9seau urbain Alesy",
      "needs_attention": false,
      "score": 72.5,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_accessible on every trip. If every vehicle is accessible, this may be one default; otherwise use the value for each trip.",
      "top_fix_code": "scorecard_wheelchair_accessible_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 181,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-alterneo",
      "name": "R\u00e9seau urbain Altern\u00e9o",
      "needs_attention": false,
      "score": 62.5,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-argentan-bus",
      "name": "R\u00e9seau urbain Argentan Bus",
      "needs_attention": false,
      "score": 67.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 307,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-ca2bm",
      "name": "R\u00e9seau urbain CA2BM",
      "needs_attention": false,
      "score": 33.0,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'stop_time_with_arrival_before_previous_departure_time' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "stop_time_with_arrival_before_previous_departure_time"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-cabus",
      "name": "R\u00e9seau urbain CABUS",
      "needs_attention": false,
      "score": 56.5,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 305,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-82359",
      "name": "R\u00e9seau urbain Calibus",
      "needs_attention": false,
      "score": 67.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 365,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-carsud",
      "name": "R\u00e9seau urbain CarSud",
      "needs_attention": false,
      "score": 49.0,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-cherpa",
      "name": "R\u00e9seau urbain Cherpa",
      "needs_attention": false,
      "score": 74.8,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 365,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-cmonbus-chaumont",
      "name": "R\u00e9seau urbain Cmonbus",
      "needs_attention": false,
      "score": 65.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 733,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-colibri",
      "name": "R\u00e9seau urbain Colibri",
      "needs_attention": false,
      "score": 70.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 2699,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-81476",
      "name": "R\u00e9seau urbain Coralie",
      "needs_attention": false,
      "score": 44.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'trip_distance_exceeds_shape_distance' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "trip_distance_exceeds_shape_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 125,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-couralin",
      "name": "R\u00e9seau urbain Couralin",
      "needs_attention": false,
      "score": 66.3,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 731,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-82150",
      "name": "R\u00e9seau urbain CVL Mobilit\u00e9",
      "needs_attention": false,
      "score": 69.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-cote-bus",
      "name": "R\u00e9seau urbain C\u00f4te&Bus",
      "needs_attention": false,
      "score": 73.2,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 306,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-81557",
      "name": "R\u00e9seau urbain de la CC Jalle Eau Bourde",
      "needs_attention": false,
      "score": 79.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Add feed_info.txt with feed_start_date and feed_end_date to your export.",
      "top_fix_code": "scorecard_missing_feed_info_dates"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-79897",
      "name": "R\u00e9seau urbain de la zone Sud (CAESM)",
      "needs_attention": false,
      "score": 58.0,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-79528",
      "name": "R\u00e9seau urbain Distribus",
      "needs_attention": false,
      "score": 77.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-82683",
      "name": "R\u00e9seau urbain DK'BUS",
      "needs_attention": false,
      "score": 61.5,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-79728",
      "name": "R\u00e9seau urbain du Grand Albigeois",
      "needs_attention": false,
      "score": 76.5,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 103,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-81585",
      "name": "R\u00e9seau urbain du Pays de Gex",
      "needs_attention": false,
      "score": 67.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 487,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-84112",
      "name": "R\u00e9seau urbain Duobus",
      "needs_attention": false,
      "score": 59.2,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 1065,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-ecla-mobilite",
      "name": "R\u00e9seau urbain ECLA Mobilit\u00e9",
      "needs_attention": false,
      "score": 55.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-envia",
      "name": "R\u00e9seau urbain Envia",
      "needs_attention": false,
      "score": 69.1,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-estival",
      "name": "R\u00e9seau urbain Estival",
      "needs_attention": false,
      "score": 63.3,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'block_trips_with_overlapping_stop_times' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "block_trips_with_overlapping_stop_times"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 125,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-83203",
      "name": "R\u00e9seau urbain estival Biscabus",
      "needs_attention": false,
      "score": 66.2,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 365,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-81042",
      "name": "R\u00e9seau urbain et interurbain Aire\u2019MOB",
      "needs_attention": false,
      "score": 60.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'trip_distance_exceeds_shape_distance' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "trip_distance_exceeds_shape_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 116,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-altigo",
      "name": "R\u00e9seau urbain et interurbain Altigo",
      "needs_attention": false,
      "score": 47.0,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'missing_required_field' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "missing_required_field"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-83789",
      "name": "R\u00e9seau urbain et interurbain Trans'Agglo",
      "needs_attention": false,
      "score": 39.2,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'start_and_end_range_out_of_order' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "start_and_end_range_out_of_order"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 109,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-83762",
      "name": "R\u00e9seau urbain et scolaire Lila Presqu'ile",
      "needs_attention": false,
      "score": 59.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'trip_distance_exceeds_shape_distance' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "trip_distance_exceeds_shape_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 305,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-83881",
      "name": "R\u00e9seau urbain et scolaire Yc\u00e9o",
      "needs_attention": false,
      "score": 72.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-82370",
      "name": "R\u00e9seau urbain Evalys",
      "needs_attention": false,
      "score": 71.1,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'block_trips_with_overlapping_stop_times' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "block_trips_with_overlapping_stop_times"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 125,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-79544",
      "name": "R\u00e9seau urbain Eveole",
      "needs_attention": false,
      "score": 55.8,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'block_trips_with_overlapping_stop_times' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "block_trips_with_overlapping_stop_times"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 61,
      "expiry_status": "current",
      "grade": "B",
      "id": "fr-pan-81432",
      "name": "R\u00e9seau urbain Evidence",
      "needs_attention": false,
      "score": 84.5,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-fablio",
      "name": "R\u00e9seau urbain Fablio",
      "needs_attention": false,
      "score": 61.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 375,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-grandole-mobilites",
      "name": "R\u00e9seau urbain Grandole Mobilit\u00e9s",
      "needs_attention": false,
      "score": 71.8,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-hobus",
      "name": "R\u00e9seau urbain Hobus",
      "needs_attention": false,
      "score": 71.3,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 153,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-hop-bus",
      "name": "R\u00e9seau urbain Hop Bus",
      "needs_attention": false,
      "score": 42.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'duplicate_key' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "duplicate_key"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 365,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-81519",
      "name": "R\u00e9seau urbain Hopl\u00e0",
      "needs_attention": false,
      "score": 66.3,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 487,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-80461",
      "name": "R\u00e9seau urbain Imagine",
      "needs_attention": false,
      "score": 49.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-isibus",
      "name": "R\u00e9seau urbain Isibus",
      "needs_attention": false,
      "score": 69.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-karulis",
      "name": "R\u00e9seau urbain KARU'LIS",
      "needs_attention": false,
      "score": 35.1,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'stop_time_with_arrival_before_previous_departure_time' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "stop_time_with_arrival_before_previous_departure_time"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-agglo-en-bus",
      "name": "R\u00e9seau urbain L'Agglo en Bus",
      "needs_attention": false,
      "score": 71.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 273,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-agglobus-foix",
      "name": "R\u00e9seau urbain l'agglobus",
      "needs_attention": false,
      "score": 69.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "D",
      "id": "lbus-bernay",
      "name": "R\u00e9seau urbain l'Bus (Bernay)",
      "needs_attention": false,
      "score": 69.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-52917",
      "name": "R\u00e9seau urbain L'va",
      "needs_attention": false,
      "score": 59.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-83725",
      "name": "R\u00e9seau urbain Le 37",
      "needs_attention": false,
      "score": 55.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 395,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-80465",
      "name": "R\u00e9seau urbain Le Bus",
      "needs_attention": false,
      "score": 57.3,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-le-sit",
      "name": "R\u00e9seau urbain Le SIT",
      "needs_attention": false,
      "score": 73.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-79508",
      "name": "R\u00e9seau urbain Libellus",
      "needs_attention": false,
      "score": 58.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 301,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-82355",
      "name": "R\u00e9seau urbain Lib\u00e9o",
      "needs_attention": false,
      "score": 70.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_accessible on every trip. If every vehicle is accessible, this may be one default; otherwise use the value for each trip.",
      "top_fix_code": "scorecard_wheelchair_accessible_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-lyneo",
      "name": "R\u00e9seau urbain Lyneo",
      "needs_attention": false,
      "score": 41.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'block_trips_with_overlapping_stop_times' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "block_trips_with_overlapping_stop_times"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-mio",
      "name": "R\u00e9seau urbain Mio",
      "needs_attention": false,
      "score": 70.0,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-81058",
      "name": "R\u00e9seau urbain Mobi",
      "needs_attention": false,
      "score": 66.3,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-monrezo",
      "name": "R\u00e9seau urbain MonR\u00e9ZO",
      "needs_attention": false,
      "score": 63.1,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-80443",
      "name": "R\u00e9seau urbain Mouv\u00e9o",
      "needs_attention": false,
      "score": 74.8,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Add fare_attributes.txt (or Fares v2 files) with your fare structure. If your service is fare-free, ask to have it marked fare-free instead.",
      "top_fix_code": "scorecard_no_fare_data"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 1583,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-mouveo-saint-omer",
      "name": "R\u00e9seau urbain Mouv\u00e9o (Saint-Omer)",
      "needs_attention": false,
      "score": 75.5,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'block_trips_with_overlapping_stop_times' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "block_trips_with_overlapping_stop_times"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-muvistrada",
      "name": "R\u00e9seau urbain Muvistrada",
      "needs_attention": false,
      "score": 45.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'block_trips_with_overlapping_stop_times' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "block_trips_with_overlapping_stop_times"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-nemus",
      "name": "R\u00e9seau urbain Nemus",
      "needs_attention": false,
      "score": 74.0,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 305,
      "expiry_status": "current",
      "grade": "B",
      "id": "fr-pan-79576",
      "name": "R\u00e9seau urbain Nosbus",
      "needs_attention": false,
      "score": 88.3,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape_dist_traveled on export so stop and shape distances use the same units.",
      "top_fix_code": "trip_distance_exceeds_shape_distance_below_threshold"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 362,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-ole",
      "name": "R\u00e9seau urbain Ol\u00e9",
      "needs_attention": false,
      "score": 47.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 305,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-81421",
      "name": "R\u00e9seau urbain Ol\u00e9ane",
      "needs_attention": false,
      "score": 67.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_accessible on every trip. If every vehicle is accessible, this may be one default; otherwise use the value for each trip.",
      "top_fix_code": "scorecard_wheelchair_accessible_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-83859",
      "name": "R\u00e9seau urbain Papillon",
      "needs_attention": false,
      "score": 59.2,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pass-o",
      "name": "R\u00e9seau urbain Pass'O",
      "needs_attention": false,
      "score": 71.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-83467",
      "name": "R\u00e9seau urbain Pays des Ecrins",
      "needs_attention": false,
      "score": 49.8,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 125,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-82357",
      "name": "R\u00e9seau urbain P\u00e9ribus",
      "needs_attention": false,
      "score": 74.8,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_accessible on every trip. If every vehicle is accessible, this may be one default; otherwise use the value for each trip.",
      "top_fix_code": "scorecard_wheelchair_accessible_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 125,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-83408",
      "name": "R\u00e9seau urbain Qub",
      "needs_attention": false,
      "score": 76.8,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Add fare_attributes.txt (or Fares v2 files) with your fare structure. If your service is fare-free, ask to have it marked fare-free instead.",
      "top_fix_code": "scorecard_no_fare_data"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-82367",
      "name": "R\u00e9seau urbain R'Bus",
      "needs_attention": false,
      "score": 68.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 126,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-rezo",
      "name": "R\u00e9seau urbain Rezo",
      "needs_attention": false,
      "score": 67.3,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "B",
      "id": "fr-riv-connect",
      "name": "R\u00e9seau urbain Riv'Connect",
      "needs_attention": false,
      "score": 80.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 362,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-52937",
      "name": "R\u00e9seau urbain Ruban",
      "needs_attention": false,
      "score": 51.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'block_trips_with_overlapping_stop_times' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "block_trips_with_overlapping_stop_times"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "B",
      "id": "fr-pan-79537",
      "name": "R\u00e9seau urbain R\u00e9so",
      "needs_attention": false,
      "score": 86.2,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Check the flagged stops' shape_dist_traveled against the route shape, and re-generate it on export if they disagree.",
      "top_fix_code": "stop_too_far_from_shape_using_user_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 109,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-81070",
      "name": "R\u00e9seau urbain Sablons Bus",
      "needs_attention": false,
      "score": 53.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'trip_distance_exceeds_shape_distance' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "trip_distance_exceeds_shape_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 365,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-79859",
      "name": "R\u00e9seau urbain Sa\u00f4nibus",
      "needs_attention": false,
      "score": 45.3,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-83533",
      "name": "R\u00e9seau urbain T'Bus",
      "needs_attention": false,
      "score": 66.5,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-79865",
      "name": "R\u00e9seau urbain Tam",
      "needs_attention": false,
      "score": 55.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'trip_distance_exceeds_shape_distance' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "trip_distance_exceeds_shape_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 670,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-79864",
      "name": "R\u00e9seau urbain Ticobus",
      "needs_attention": false,
      "score": 67.0,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-ticea",
      "name": "R\u00e9seau urbain Tic\u00e9a",
      "needs_attention": false,
      "score": 61.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-83531",
      "name": "R\u00e9seau urbain TIG",
      "needs_attention": false,
      "score": 78.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "B",
      "id": "fr-tiva",
      "name": "R\u00e9seau urbain TIVA",
      "needs_attention": false,
      "score": 89.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Add the destination, direction, or 'via' label riders actually see to trip_headsign. Do not copy the route name. If the label changes during the trip, use stop_headsign.",
      "top_fix_code": "scorecard_missing_headsigns"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 487,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-tmco",
      "name": "R\u00e9seau urbain TMCO",
      "needs_attention": false,
      "score": 77.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 482,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-tohm",
      "name": "R\u00e9seau urbain TOHM",
      "needs_attention": false,
      "score": 61.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'trip_distance_exceeds_shape_distance' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "trip_distance_exceeds_shape_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 365,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-81794",
      "name": "R\u00e9seau urbain Tougo",
      "needs_attention": false,
      "score": 71.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Add feed_info.txt with feed_start_date and feed_end_date to your export.",
      "top_fix_code": "scorecard_missing_feed_info_dates"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 363,
      "expiry_status": "current",
      "grade": "B",
      "id": "fr-tout-enbus",
      "name": "R\u00e9seau urbain Tout'enbus",
      "needs_attention": false,
      "score": 87.1,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set timepoint=1 on stops that are real time checks and 0 on the rest. If every published time is a scheduled one, mark them all 1.",
      "top_fix_code": "missing_timepoint_value"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-83785",
      "name": "R\u00e9seau urbain Trans'CoVe",
      "needs_attention": false,
      "score": 62.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-83462",
      "name": "R\u00e9seau urbain Transports du Pays Voironnais",
      "needs_attention": false,
      "score": 74.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Add feed_info.txt with feed_start_date and feed_end_date to your export.",
      "top_fix_code": "scorecard_missing_feed_info_dates"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-tub",
      "name": "R\u00e9seau urbain TUB",
      "needs_attention": false,
      "score": 64.0,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-tud",
      "name": "R\u00e9seau urbain TUD",
      "needs_attention": false,
      "score": 58.5,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'equal_shape_distance_diff_coordinates' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "equal_shape_distance_diff_coordinates"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 307,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-tul",
      "name": "R\u00e9seau urbain TUL",
      "needs_attention": false,
      "score": 72.8,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Add fare_attributes.txt (or Fares v2 files) with your fare structure. If your service is fare-free, ask to have it marked fare-free instead.",
      "top_fix_code": "scorecard_no_fare_data"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 305,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-80471",
      "name": "R\u00e9seau urbain TUM",
      "needs_attention": false,
      "score": 59.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-tungt",
      "name": "R\u00e9seau urbain TUNGT",
      "needs_attention": false,
      "score": 51.5,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'stop_time_with_arrival_before_previous_departure_time' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "stop_time_with_arrival_before_previous_departure_time"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 153,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-tus",
      "name": "R\u00e9seau urbain TUS",
      "needs_attention": false,
      "score": 54.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'start_and_end_range_out_of_order' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "start_and_end_range_out_of_order"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-82379",
      "name": "R\u00e9seau urbain TuT",
      "needs_attention": false,
      "score": 63.0,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-vikibus",
      "name": "R\u00e9seau urbain Vikibus",
      "needs_attention": false,
      "score": 70.3,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-villeo-retzeo",
      "name": "R\u00e9seau urbain Vill\u00e9o Retz\u00e9o",
      "needs_attention": false,
      "score": 66.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 125,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-83416",
      "name": "R\u00e9seau urbain Y\u00e9go",
      "needs_attention": false,
      "score": 64.6,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 242,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-82350",
      "name": "R\u00e9seau urbain Y\u00e9lo",
      "needs_attention": false,
      "score": 61.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 284,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-81944",
      "name": "R\u00e9seau urbain \u00e9volitY",
      "needs_attention": false,
      "score": 63.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Add feed_info.txt with feed_start_date and feed_end_date to your export.",
      "top_fix_code": "scorecard_missing_feed_info_dates"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 303,
      "expiry_status": "current",
      "grade": "D",
      "id": "semo-seine-eure",
      "name": "SEMO (Seine-Eure)",
      "needs_attention": false,
      "score": 62.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 298,
      "expiry_status": "current",
      "grade": "F",
      "id": "solea-mulhouse",
      "name": "Sol\u00e9a (Mulhouse Alsace Agglom\u00e9ration)",
      "needs_attention": false,
      "score": 41.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'trip_distance_exceeds_shape_distance' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "trip_distance_exceeds_shape_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "D",
      "id": "t2c-clermont",
      "name": "T2C (Clermont Auvergne M\u00e9tropole)",
      "needs_attention": false,
      "score": 65.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_accessible on every trip. If every vehicle is accessible, this may be one default; otherwise use the value for each trip.",
      "top_fix_code": "scorecard_wheelchair_accessible_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-81158",
      "name": "TAD r\u00e9seau AlloTIC",
      "needs_attention": false,
      "score": 47.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'trip_distance_exceeds_shape_distance' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "trip_distance_exceeds_shape_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-83770",
      "name": "TAD r\u00e9seau Tiva",
      "needs_attention": false,
      "score": 75.2,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'invalid_row_length' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "invalid_row_length"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "taneo-nevers",
      "name": "Tan\u00e9o (Nevers)",
      "needs_attention": false,
      "score": 53.0,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 125,
      "expiry_status": "current",
      "grade": "D",
      "id": "tao-orleans",
      "name": "TAO (Orl\u00e9ans M\u00e9tropole)",
      "needs_attention": false,
      "score": 69.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Add the destination, direction, or 'via' label riders actually see to trip_headsign. Do not copy the route name. If the label changes during the trip, use stop_headsign.",
      "top_fix_code": "scorecard_missing_headsigns"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 124,
      "expiry_status": "current",
      "grade": "D",
      "id": "tbk-quimperle",
      "name": "TBK (Quimperl\u00e9)",
      "needs_attention": false,
      "score": 61.8,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Add fare_attributes.txt (or Fares v2 files) with your fare structure. If your service is fare-free, ask to have it marked fare-free instead.",
      "top_fix_code": "scorecard_no_fare_data"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 72,
      "expiry_status": "current",
      "grade": "F",
      "id": "tic-compiegne",
      "name": "TIC (Compi\u00e8gne)",
      "needs_attention": false,
      "score": 51.3,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'trip_distance_exceeds_shape_distance' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "trip_distance_exceeds_shape_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 91,
      "expiry_status": "current",
      "grade": "F",
      "id": "trace-colmar",
      "name": "TRACE (Colmar)",
      "needs_attention": false,
      "score": 52.1,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Re-generate shape distances in your export; flag to your vendor if it persists.",
      "top_fix_code": "decreasing_or_equal_stop_time_distance"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 103,
      "expiry_status": "current",
      "grade": "D",
      "id": "fr-pan-83990",
      "name": "Trains r\u00e9gionaux ZOU !",
      "needs_attention": false,
      "score": 65.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 125,
      "expiry_status": "current",
      "grade": "D",
      "id": "transmanche-ferries",
      "name": "Transmanche Ferries",
      "needs_attention": false,
      "score": 62.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every terminal. A field survey can start with the busiest terminals.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 153,
      "expiry_status": "current",
      "grade": "F",
      "id": "fr-pan-83821",
      "name": "Transport scolaire SCOL'TUS",
      "needs_attention": false,
      "score": 39.8,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'equal_shape_distance_diff_coordinates' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "equal_shape_distance_diff_coordinates"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 88,
      "expiry_status": "current",
      "grade": "C",
      "id": "tbm-bordeaux-metropole",
      "name": "Transports Bordeaux M\u00e9tropole (TBM)",
      "needs_attention": false,
      "score": 75.9,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 125,
      "expiry_status": "current",
      "grade": "A",
      "id": "fr-pan-81618",
      "name": "T\u00e9l\u00e9ph\u00e9rique de la Bastille - Bulles de Grenoble",
      "needs_attention": false,
      "score": 97.7,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Add feed_contact_email to feed_info.txt.",
      "top_fix_code": "scorecard_no_feed_contact"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 548,
      "expiry_status": "current",
      "grade": "C",
      "id": "fr-pan-82880",
      "name": "T\u00e9l\u00e9ph\u00e9rique Papang",
      "needs_attention": false,
      "score": 73.2,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 307,
      "expiry_status": "current",
      "grade": "F",
      "id": "zest-menton",
      "name": "Zest (Menton)",
      "needs_attention": false,
      "score": 52.2,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Set wheelchair_boarding to 1 (accessible) or 2 (not accessible) for every stop. A field survey can start with the busiest stops.",
      "top_fix_code": "scorecard_wheelchair_boarding_unknown"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 122,
      "expiry_status": "current",
      "grade": "F",
      "id": "zoom-grand-chalon",
      "name": "Zoom (Le Grand Chalon)",
      "needs_attention": false,
      "score": 44.4,
      "shapes_status": null,
      "snapshot_date": "2026-08-31",
      "top_fix": "Review the rule documentation for 'block_trips_with_overlapping_stop_times' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "block_trips_with_overlapping_stop_times"
    }
  ],
  "needs_attention": 56,
  "realtime": {
    "bands": {
      "mostly": 6,
      "reliable": 24,
      "spotty": 0
    },
    "configured_feed_records": 30,
    "median_coverage_pct": null,
    "median_lag_seconds": 20,
    "median_uptime_pct": 99.5,
    "members": [
      {
        "band": "mostly",
        "configured_kinds": [
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1785856234,
        "id": "fr-lib-bus",
        "last_ts": 1788213532,
        "median_coverage_pct": null,
        "median_lag_seconds": 23,
        "name": "R\u00e9seau urbain Lib'Bus",
        "observations": 200,
        "uptime_pct": 96.0
      },
      {
        "band": "mostly",
        "configured_kinds": [
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1785856493,
        "id": "fr-tohm",
        "last_ts": 1788213789,
        "median_coverage_pct": null,
        "median_lag_seconds": 26,
        "name": "R\u00e9seau urbain TOHM",
        "observations": 200,
        "uptime_pct": 96.5
      },
      {
        "band": "mostly",
        "configured_kinds": [
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1785856021,
        "id": "fr-cote-bus",
        "last_ts": 1788213335,
        "median_coverage_pct": null,
        "median_lag_seconds": 8,
        "name": "R\u00e9seau urbain C\u00f4te&Bus",
        "observations": 200,
        "uptime_pct": 97.5
      },
      {
        "band": "mostly",
        "configured_kinds": [
          "service_alerts",
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1785855837,
        "id": "fr-alterneo",
        "last_ts": 1788213172,
        "median_coverage_pct": null,
        "median_lag_seconds": 38,
        "name": "R\u00e9seau urbain Altern\u00e9o",
        "observations": 200,
        "uptime_pct": 98.0
      },
      {
        "band": "mostly",
        "configured_kinds": [
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1785856132,
        "id": "fr-grandole-mobilites",
        "last_ts": 1788213431,
        "median_coverage_pct": null,
        "median_lag_seconds": 8,
        "name": "R\u00e9seau urbain Grandole Mobilit\u00e9s",
        "observations": 200,
        "uptime_pct": 98.0
      },
      {
        "band": "mostly",
        "configured_kinds": [
          "trip_updates"
        ],
        "first_ts": 1785856396,
        "id": "fr-rezo",
        "last_ts": 1788213693,
        "median_coverage_pct": null,
        "median_lag_seconds": 52,
        "name": "R\u00e9seau urbain Rezo",
        "observations": 200,
        "uptime_pct": 98.5
      },
      {
        "band": "reliable",
        "configured_kinds": [
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1785856101,
        "id": "fr-forbus",
        "last_ts": 1788213400,
        "median_coverage_pct": null,
        "median_lag_seconds": 87,
        "name": "R\u00e9seau urbain Forbus",
        "observations": 200,
        "uptime_pct": 99.0
      },
      {
        "band": "reliable",
        "configured_kinds": [
          "trip_updates"
        ],
        "first_ts": 1785856593,
        "id": "fr-tub",
        "last_ts": 1788213887,
        "median_coverage_pct": null,
        "median_lag_seconds": 57,
        "name": "R\u00e9seau urbain TUB",
        "observations": 200,
        "uptime_pct": 99.0
      },
      {
        "band": "reliable",
        "configured_kinds": [
          "trip_updates"
        ],
        "first_ts": 1785856427,
        "id": "fr-riv-connect",
        "last_ts": 1788213723,
        "median_coverage_pct": null,
        "median_lag_seconds": 50,
        "name": "R\u00e9seau urbain Riv'Connect",
        "observations": 200,
        "uptime_pct": 99.0
      },
      {
        "band": "reliable",
        "configured_kinds": [
          "trip_updates"
        ],
        "first_ts": 1785855990,
        "id": "fr-colibri",
        "last_ts": 1788213304,
        "median_coverage_pct": null,
        "median_lag_seconds": 47,
        "name": "R\u00e9seau urbain Colibri",
        "observations": 200,
        "uptime_pct": 99.0
      },
      {
        "band": "reliable",
        "configured_kinds": [
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1785856200,
        "id": "fr-hop-bus",
        "last_ts": 1788213497,
        "median_coverage_pct": null,
        "median_lag_seconds": 7,
        "name": "R\u00e9seau urbain Hop Bus",
        "observations": 200,
        "uptime_pct": 99.0
      },
      {
        "band": "reliable",
        "configured_kinds": [
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1785855804,
        "id": "fr-agglo-en-bus",
        "last_ts": 1788213140,
        "median_coverage_pct": null,
        "median_lag_seconds": 7,
        "name": "R\u00e9seau urbain L'Agglo en Bus",
        "observations": 200,
        "uptime_pct": 99.0
      },
      {
        "band": "reliable",
        "configured_kinds": [
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1785856332,
        "id": "fr-nemus",
        "last_ts": 1788213629,
        "median_coverage_pct": null,
        "median_lag_seconds": 23,
        "name": "R\u00e9seau urbain Nemus",
        "observations": 200,
        "uptime_pct": 99.5
      },
      {
        "band": "reliable",
        "configured_kinds": [
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1785856069,
        "id": "fr-envia",
        "last_ts": 1788213368,
        "median_coverage_pct": null,
        "median_lag_seconds": 20,
        "name": "R\u00e9seau urbain Envia",
        "observations": 200,
        "uptime_pct": 99.5
      },
      {
        "band": "reliable",
        "configured_kinds": [
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1785856365,
        "id": "fr-ole",
        "last_ts": 1788213662,
        "median_coverage_pct": null,
        "median_lag_seconds": 20,
        "name": "R\u00e9seau urbain Ol\u00e9",
        "observations": 200,
        "uptime_pct": 99.5
      },
      {
        "band": "reliable",
        "configured_kinds": [
          "trip_updates"
        ],
        "first_ts": 1785856624,
        "id": "fr-uggo",
        "last_ts": 1788213918,
        "median_coverage_pct": null,
        "median_lag_seconds": 13,
        "name": "R\u00e9seau urbain UGGO",
        "observations": 200,
        "uptime_pct": 99.5
      },
      {
        "band": "reliable",
        "configured_kinds": [
          "service_alerts",
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1785856530,
        "id": "fr-tout-enbus",
        "last_ts": 1788213824,
        "median_coverage_pct": null,
        "median_lag_seconds": 8,
        "name": "R\u00e9seau urbain Tout'enbus",
        "observations": 200,
        "uptime_pct": 99.5
      },
      {
        "band": "reliable",
        "configured_kinds": [
          "service_alerts",
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1785855950,
        "id": "fr-cmonbus",
        "last_ts": 1788213273,
        "median_coverage_pct": null,
        "median_lag_seconds": 6,
        "name": "R\u00e9seau urbain Cmonbus",
        "observations": 200,
        "uptime_pct": 99.5
      },
      {
        "band": "reliable",
        "configured_kinds": [
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1785855870,
        "id": "fr-carsud",
        "last_ts": 1788213205,
        "median_coverage_pct": null,
        "median_lag_seconds": 0,
        "name": "R\u00e9seau urbain CarSud",
        "observations": 200,
        "uptime_pct": 99.5
      },
      {
        "band": "reliable",
        "configured_kinds": [
          "service_alerts",
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1785855905,
        "id": "fr-cherpa",
        "last_ts": 1788213239,
        "median_coverage_pct": null,
        "median_lag_seconds": 0,
        "name": "R\u00e9seau urbain Cherpa",
        "observations": 200,
        "uptime_pct": 99.5
      },
      {
        "band": "reliable",
        "configured_kinds": [
          "service_alerts",
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1785857424,
        "id": "lbus-bernay",
        "last_ts": 1788214881,
        "median_coverage_pct": null,
        "median_lag_seconds": 0,
        "name": "R\u00e9seau urbain l'Bus (Bernay)",
        "observations": 200,
        "uptime_pct": 99.5
      },
      {
        "band": "reliable",
        "configured_kinds": [
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1785856656,
        "id": "fr-vikibus",
        "last_ts": 1788213950,
        "median_coverage_pct": null,
        "median_lag_seconds": 48,
        "name": "R\u00e9seau urbain Vikibus",
        "observations": 200,
        "uptime_pct": 100.0
      },
      {
        "band": "reliable",
        "configured_kinds": [
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1785856299,
        "id": "fr-mouveo-saint-omer",
        "last_ts": 1788213596,
        "median_coverage_pct": null,
        "median_lag_seconds": 30,
        "name": "R\u00e9seau urbain Mouv\u00e9o (Saint-Omer)",
        "observations": 200,
        "uptime_pct": 100.0
      },
      {
        "band": "reliable",
        "configured_kinds": [
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1785856562,
        "id": "fr-transpor-pays-de-lor",
        "last_ts": 1788213856,
        "median_coverage_pct": null,
        "median_lag_seconds": 29,
        "name": "R\u00e9seau urbain Transp\u2019Or",
        "observations": 200,
        "uptime_pct": 100.0
      },
      {
        "band": "reliable",
        "configured_kinds": [
          "service_alerts",
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1785856164,
        "id": "fr-hobus",
        "last_ts": 1788213463,
        "median_coverage_pct": null,
        "median_lag_seconds": 28,
        "name": "R\u00e9seau urbain Hobus",
        "observations": 200,
        "uptime_pct": 100.0
      },
      {
        "band": "reliable",
        "configured_kinds": [
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1785856459,
        "id": "fr-rubis",
        "last_ts": 1788213755,
        "median_coverage_pct": null,
        "median_lag_seconds": 20,
        "name": "R\u00e9seau urbain Rubis",
        "observations": 200,
        "uptime_pct": 100.0
      },
      {
        "band": "reliable",
        "configured_kinds": [
          "service_alerts",
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1785859519,
        "id": "tbm-bordeaux-metropole",
        "last_ts": 1788217626,
        "median_coverage_pct": null,
        "median_lag_seconds": 14,
        "name": "Transports Bordeaux M\u00e9tropole (TBM)",
        "observations": 200,
        "uptime_pct": 100.0
      },
      {
        "band": "reliable",
        "configured_kinds": [
          "service_alerts",
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1785856267,
        "id": "fr-moca",
        "last_ts": 1788213565,
        "median_coverage_pct": null,
        "median_lag_seconds": 9,
        "name": "R\u00e9seau urbain MOCA",
        "observations": 200,
        "uptime_pct": 100.0
      },
      {
        "band": "reliable",
        "configured_kinds": [
          "service_alerts",
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1785855082,
        "id": "car-jaune-reunion",
        "last_ts": 1788212227,
        "median_coverage_pct": null,
        "median_lag_seconds": 8,
        "name": "Car Jaune (La R\u00e9union)",
        "observations": 200,
        "uptime_pct": 100.0
      },
      {
        "band": "reliable",
        "configured_kinds": [
          "service_alerts",
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1785854946,
        "id": "cap-cotentin",
        "last_ts": 1788212097,
        "median_coverage_pct": null,
        "median_lag_seconds": 7,
        "name": "R\u00e9seau urbain Cap Cotentin",
        "observations": 200,
        "uptime_pct": 100.0
      }
    ],
    "monitored_feed_records": 30
  },
  "rollup": {
    "country_code": "FR",
    "country_name": "France",
    "id": "country-fr",
    "name": "France"
  },
  "schema_version": "1.18",
  "shapes_readiness": {
    "at_risk": 0,
    "not_measured": 267,
    "not_ready": 0,
    "ready": 0,
    "total": 267
  },
  "state_percentile": null
}
