{
  "agency_count": 81,
  "average_score": 70.3,
  "common_fixes": [
    {
      "agencies": 63,
      "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": 62,
      "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": 53,
      "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": 9,
      "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": 6,
      "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": 5,
      "code": "scorecard_missing_feed_info_dates",
      "fix": "Add feed_info.txt with feed_start_date and feed_end_date to your export."
    },
    {
      "agencies": 5,
      "code": "scorecard_feed_expiring_soon",
      "fix": "Re-export with a validity window that reaches at least 60 days out."
    },
    {
      "agencies": 3,
      "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": 2,
      "code": "missing_recommended_file",
      "fix": "Add feed_info.txt with publisher name, URL, language, and feed_start_date/feed_end_date."
    },
    {
      "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": "missing_recommended_field",
      "fix": "Review the flagged fields and fill in the ones your riders would use."
    },
    {
      "agencies": 2,
      "code": "invalid_phone_number",
      "fix": "Review the rule documentation for 'invalid_phone_number' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed."
    },
    {
      "agencies": 2,
      "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."
    }
  ],
  "comparison": {
    "absolute_rankings_published": false,
    "eligible_count": 76,
    "excluded_count": 5,
    "exclusion_counts": {
      "measured_category_set_mismatch": 5
    },
    "individual_percentiles_published": false,
    "measured_category_cohorts": {
      "correctness+freshness+completeness": 76,
      "correctness+freshness+completeness+realtime": 5
    },
    "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.4",
    "required_scoring_profile_id": "gtfs-scorecard-1.4",
    "required_validator_version": "8.0.1"
  },
  "expired": {
    "lapsed": 0,
    "stale": 0,
    "total": 0
  },
  "generated_at": "2026-10-16T01:21:49+00:00",
  "grade_distribution": {
    "A": 2,
    "B": 6,
    "C": 43,
    "D": 18,
    "F": 7
  },
  "members": [
    {
      "annual_trips": null,
      "attention_reason": "Service data expires in 43 day(s)",
      "days_until_expiry": 43,
      "expiry_status": "current",
      "grade": "D",
      "id": "bc-transit-revelstoke",
      "name": "BC Transit (Revelstoke Transit System)",
      "needs_attention": true,
      "score": 66.4,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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 38 day(s)",
      "days_until_expiry": 38,
      "expiry_status": "current",
      "grade": "D",
      "id": "bc-transit-whistler",
      "name": "BC Transit (Whistler Transit System)",
      "needs_attention": true,
      "score": 62.5,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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 17 day(s)",
      "days_until_expiry": 17,
      "expiry_status": "expiring_soon",
      "grade": "C",
      "id": "brampton-transit",
      "name": "Brampton Transit",
      "needs_attention": true,
      "score": 70.0,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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 44 day(s)",
      "days_until_expiry": 44,
      "expiry_status": "current",
      "grade": "C",
      "id": "codiac-transpo",
      "name": "Codiac Transpo",
      "needs_attention": true,
      "score": 72.6,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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 44 day(s)",
      "days_until_expiry": 44,
      "expiry_status": "current",
      "grade": "B",
      "id": "edmonton-transit-service",
      "name": "Edmonton Transit Service (ETS)",
      "needs_attention": true,
      "score": 85.5,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": "Service data expires in 43 day(s)",
      "days_until_expiry": 43,
      "expiry_status": "current",
      "grade": "B",
      "id": "go-transit-metrolinx",
      "name": "GO Transit (Metrolinx)",
      "needs_attention": true,
      "score": 82.7,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "top_fix": "Use mixed case for stop names and headsigns (e.g. 'Main St & 2nd Ave', not 'MAIN ST & 2ND AVE').",
      "top_fix_code": "mixed_case_recommended_field"
    },
    {
      "annual_trips": null,
      "attention_reason": "Service data expires in 43 day(s)",
      "days_until_expiry": 43,
      "expiry_status": "current",
      "grade": "C",
      "id": "gova-greater-sudbury",
      "name": "GOVA Transit (Greater Sudbury)",
      "needs_attention": true,
      "score": 73.1,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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 45 day(s)",
      "days_until_expiry": 45,
      "expiry_status": "current",
      "grade": "F",
      "id": "halifax-transit",
      "name": "Halifax Transit",
      "needs_attention": true,
      "score": 32.9,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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 44 day(s)",
      "days_until_expiry": 44,
      "expiry_status": "current",
      "grade": "C",
      "id": "london-transit-commission",
      "name": "London Transit Commission (Ontario)",
      "needs_attention": true,
      "score": 76.1,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": "Service data expires in 16 day(s)",
      "days_until_expiry": 16,
      "expiry_status": "expiring_soon",
      "grade": "F",
      "id": "oakville-transit",
      "name": "Oakville Transit",
      "needs_attention": true,
      "score": 42.4,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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 51 day(s)",
      "days_until_expiry": 51,
      "expiry_status": "current",
      "grade": "D",
      "id": "red-deer-transit",
      "name": "Red Deer Transit",
      "needs_attention": true,
      "score": 60.0,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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 17 day(s)",
      "days_until_expiry": 17,
      "expiry_status": "expiring_soon",
      "grade": "D",
      "id": "rtl-longueuil",
      "name": "R\u00e9seau de transport de Longueuil",
      "needs_attention": true,
      "score": 62.9,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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 30 day(s)",
      "days_until_expiry": 30,
      "expiry_status": "expiring_soon",
      "grade": "D",
      "id": "thunder-bay-transit",
      "name": "Thunder Bay Transit",
      "needs_attention": true,
      "score": 69.3,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": "Service data expires in 16 day(s)",
      "days_until_expiry": 16,
      "expiry_status": "expiring_soon",
      "grade": "F",
      "id": "toronto-transit-commission",
      "name": "Toronto Transit Commission (TTC)",
      "needs_attention": true,
      "score": 47.9,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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 46 day(s)",
      "days_until_expiry": 46,
      "expiry_status": "current",
      "grade": "C",
      "id": "transcollines",
      "name": "Transcollines (R\u00e9gie intermunicipale de transport des Collines)",
      "needs_attention": true,
      "score": 75.8,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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 16 day(s)",
      "days_until_expiry": 16,
      "expiry_status": "expiring_soon",
      "grade": "F",
      "id": "york-region-transit",
      "name": "York Region Transit (YRT)",
      "needs_attention": true,
      "score": 56.4,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": null,
      "days_until_expiry": 72,
      "expiry_status": "current",
      "grade": "C",
      "id": "barrie-transit",
      "name": "Barrie Transit (Ontario)",
      "needs_attention": false,
      "score": 77.6,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 77,
      "expiry_status": "current",
      "grade": "C",
      "id": "bc-transit-100-mile-house",
      "name": "BC Transit (100 Mile House Transit System)",
      "needs_attention": false,
      "score": 73.5,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 442,
      "expiry_status": "current",
      "grade": "C",
      "id": "bc-transit-ashcroft-cache-creek-clinton",
      "name": "BC Transit (Ashcroft-Cache Creek-Clinton Transit System)",
      "needs_attention": false,
      "score": 73.5,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 79,
      "expiry_status": "current",
      "grade": "D",
      "id": "bc-transit-bulkley-nechako-prince-george",
      "name": "BC Transit (Bulkley-Nechako and Prince George Transit Systems)",
      "needs_attention": false,
      "score": 68.7,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 325,
      "expiry_status": "current",
      "grade": "C",
      "id": "bc-transit-campbell-river",
      "name": "BC Transit (Campbell River Transit System)",
      "needs_attention": false,
      "score": 71.7,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 79,
      "expiry_status": "current",
      "grade": "C",
      "id": "bc-transit-central-fraser-valley",
      "name": "BC Transit (Central Fraser Valley Transit System)",
      "needs_attention": false,
      "score": 70.8,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 442,
      "expiry_status": "current",
      "grade": "C",
      "id": "bc-transit-clearwater",
      "name": "BC Transit (Clearwater Transit System)",
      "needs_attention": false,
      "score": 72.6,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 77,
      "expiry_status": "current",
      "grade": "C",
      "id": "bc-transit-columbia-valley",
      "name": "BC Transit (Columbia Valley, Cranbrook, Elk Valley, and Kimberley)",
      "needs_attention": false,
      "score": 71.3,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 167,
      "expiry_status": "current",
      "grade": "C",
      "id": "bc-transit-comox-valley",
      "name": "BC Transit (Comox Valley Transit System)",
      "needs_attention": false,
      "score": 70.5,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 77,
      "expiry_status": "current",
      "grade": "C",
      "id": "bc-transit-cowichan-valley",
      "name": "BC Transit (Cowichan Valley Regional Transit System)",
      "needs_attention": false,
      "score": 71.7,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 77,
      "expiry_status": "current",
      "grade": "C",
      "id": "bc-transit-creston-valley",
      "name": "BC Transit (Creston Valley Transit System)",
      "needs_attention": false,
      "score": 72.3,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 442,
      "expiry_status": "current",
      "grade": "C",
      "id": "bc-transit-dawson-creek",
      "name": "BC Transit (Dawson Creek Transit System)",
      "needs_attention": false,
      "score": 73.5,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 442,
      "expiry_status": "current",
      "grade": "C",
      "id": "bc-transit-fort-st-john",
      "name": "BC Transit (Fort St. John Transit System)",
      "needs_attention": false,
      "score": 73.5,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 254,
      "expiry_status": "current",
      "grade": "C",
      "id": "bc-transit-hazelton-kitimat-terrace",
      "name": "BC Transit (Hazelton, Kitimat, and Terrace)",
      "needs_attention": false,
      "score": 71.3,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 80,
      "expiry_status": "current",
      "grade": "C",
      "id": "bc-transit-kamloops",
      "name": "BC Transit (Kamloops Transit System)",
      "needs_attention": false,
      "score": 70.8,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 65,
      "expiry_status": "current",
      "grade": "D",
      "id": "bc-transit-kelowna",
      "name": "BC Transit (Kelowna Regional Transit System)",
      "needs_attention": false,
      "score": 68.7,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 442,
      "expiry_status": "current",
      "grade": "C",
      "id": "bc-transit-merritt",
      "name": "BC Transit (Merritt Transit System)",
      "needs_attention": false,
      "score": 73.0,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 77,
      "expiry_status": "current",
      "grade": "C",
      "id": "bc-transit-mount-waddington",
      "name": "BC Transit (Mount Waddington Transit System)",
      "needs_attention": false,
      "score": 71.7,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 65,
      "expiry_status": "current",
      "grade": "D",
      "id": "bc-transit-nanaimo",
      "name": "BC Transit (Nanaimo Regional Transit System)",
      "needs_attention": false,
      "score": 68.8,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 184,
      "expiry_status": "current",
      "grade": "C",
      "id": "bc-transit-pemberton-valley",
      "name": "BC Transit (Pemberton Valley Transit System)",
      "needs_attention": false,
      "score": 73.5,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 79,
      "expiry_status": "current",
      "grade": "C",
      "id": "bc-transit-port-alberni",
      "name": "BC Transit (Port Alberni Regional Transit System)",
      "needs_attention": false,
      "score": 72.6,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 254,
      "expiry_status": "current",
      "grade": "C",
      "id": "bc-transit-port-edward-prince-rupert",
      "name": "BC Transit (Port Edward and Prince Rupert Transit Systems)",
      "needs_attention": false,
      "score": 71.7,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 80,
      "expiry_status": "current",
      "grade": "C",
      "id": "bc-transit-powell-river",
      "name": "BC Transit (Powell River Regional Transit System)",
      "needs_attention": false,
      "score": 71.7,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 442,
      "expiry_status": "current",
      "grade": "C",
      "id": "bc-transit-quesnel",
      "name": "BC Transit (Quesnel Transit System)",
      "needs_attention": false,
      "score": 71.7,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 197,
      "expiry_status": "current",
      "grade": "C",
      "id": "bc-transit-salt-spring-island",
      "name": "BC Transit (Salt Spring Island Transit System)",
      "needs_attention": false,
      "score": 76.1,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 442,
      "expiry_status": "current",
      "grade": "D",
      "id": "bc-transit-shuswap-vernon",
      "name": "BC Transit (Shuswap and Vernon Regional Transit Systems)",
      "needs_attention": false,
      "score": 69.5,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 77,
      "expiry_status": "current",
      "grade": "C",
      "id": "bc-transit-smithers",
      "name": "BC Transit (Smithers Transit System)",
      "needs_attention": false,
      "score": 77.0,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 326,
      "expiry_status": "current",
      "grade": "C",
      "id": "bc-transit-south-okanagan-similkameen",
      "name": "BC Transit (South Okanagan-Similkameen Transit System)",
      "needs_attention": false,
      "score": 71.7,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": "C",
      "id": "bc-transit-squamish",
      "name": "BC Transit (Squamish Transit System)",
      "needs_attention": false,
      "score": 72.3,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 207,
      "expiry_status": "current",
      "grade": "C",
      "id": "bc-transit-sunshine-coast",
      "name": "BC Transit (Sunshine Coast Transit System)",
      "needs_attention": false,
      "score": 72.3,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 80,
      "expiry_status": "current",
      "grade": "D",
      "id": "bc-transit-victoria",
      "name": "BC Transit (Victoria Regional Transit System)",
      "needs_attention": false,
      "score": 67.8,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 171,
      "expiry_status": "current",
      "grade": "C",
      "id": "bc-transit-west-coast",
      "name": "BC Transit (West Coast Transit System)",
      "needs_attention": false,
      "score": 73.5,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 77,
      "expiry_status": "current",
      "grade": "D",
      "id": "bc-transit-west-kootenay",
      "name": "BC Transit (West Kootenay Transit System)",
      "needs_attention": false,
      "score": 68.7,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 77,
      "expiry_status": "current",
      "grade": "C",
      "id": "bc-transit-williams-lake",
      "name": "BC Transit (Williams Lake Transit System)",
      "needs_attention": false,
      "score": 72.6,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 65,
      "expiry_status": "current",
      "grade": "F",
      "id": "burlington-transit",
      "name": "Burlington Transit",
      "needs_attention": false,
      "score": 58.1,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 66,
      "expiry_status": "current",
      "grade": "F",
      "id": "calgary-transit",
      "name": "Calgary Transit",
      "needs_attention": false,
      "score": 34.7,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 80,
      "expiry_status": "current",
      "grade": "D",
      "id": "exo-trains",
      "name": "exo (commuter rail network)",
      "needs_attention": false,
      "score": 67.5,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 80,
      "expiry_status": "current",
      "grade": "C",
      "id": "exo-chambly-richelieu-carignan",
      "name": "exo Chambly-Richelieu-Carignan",
      "needs_attention": false,
      "score": 72.4,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 80,
      "expiry_status": "current",
      "grade": "C",
      "id": "exo-lassomption",
      "name": "exo L'Assomption",
      "needs_attention": false,
      "score": 73.7,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 80,
      "expiry_status": "current",
      "grade": "C",
      "id": "exo-la-presquile",
      "name": "exo La Presqu'\u00cele",
      "needs_attention": false,
      "score": 72.5,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 80,
      "expiry_status": "current",
      "grade": "D",
      "id": "exo-laurentides",
      "name": "exo Laurentides",
      "needs_attention": false,
      "score": 69.8,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 80,
      "expiry_status": "current",
      "grade": "C",
      "id": "exo-le-richelain-roussillon",
      "name": "exo Le Richelain / Roussillon",
      "needs_attention": false,
      "score": 70.7,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 80,
      "expiry_status": "current",
      "grade": "D",
      "id": "exo-sorel-varennes",
      "name": "exo Sorel-Varennes",
      "needs_attention": false,
      "score": 67.2,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 80,
      "expiry_status": "current",
      "grade": "D",
      "id": "exo-sud-ouest",
      "name": "exo Sud-Ouest",
      "needs_attention": false,
      "score": 69.8,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 80,
      "expiry_status": "current",
      "grade": "D",
      "id": "exo-terrebonne-mascouche",
      "name": "exo Terrebonne-Mascouche",
      "needs_attention": false,
      "score": 67.2,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 80,
      "expiry_status": "current",
      "grade": "C",
      "id": "exo-vallee-du-richelieu",
      "name": "exo Vall\u00e9e du Richelieu",
      "needs_attention": false,
      "score": 70.7,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 80,
      "expiry_status": "current",
      "grade": "D",
      "id": "exo-sainte-julie",
      "name": "exo Ville de Sainte-Julie",
      "needs_attention": false,
      "score": 67.2,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 72,
      "expiry_status": "current",
      "grade": "F",
      "id": "hamilton-street-railway",
      "name": "Hamilton Street Railway (HSR)",
      "needs_attention": false,
      "score": 54.8,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 358,
      "expiry_status": "current",
      "grade": "C",
      "id": "kingston-transit",
      "name": "Kingston Transit",
      "needs_attention": false,
      "score": 77.0,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 77,
      "expiry_status": "current",
      "grade": "B",
      "id": "lethbridge-transit",
      "name": "Lethbridge Transit",
      "needs_attention": false,
      "score": 81.1,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 86,
      "expiry_status": "current",
      "grade": "F",
      "id": "regina-transit",
      "name": "Regina Transit",
      "needs_attention": false,
      "score": 44.3,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 64,
      "expiry_status": "current",
      "grade": "C",
      "id": "rtc-quebec",
      "name": "R\u00e9seau de transport de la Capitale (RTC)",
      "needs_attention": false,
      "score": 71.5,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 442,
      "expiry_status": "current",
      "grade": "C",
      "id": "saint-john-transit",
      "name": "Saint John Transit",
      "needs_attention": false,
      "score": 79.5,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 66,
      "expiry_status": "current",
      "grade": "A",
      "id": "stlevis",
      "name": "Soci\u00e9t\u00e9 de transport de L\u00e9vis (STL\u00e9vis)",
      "needs_attention": false,
      "score": 92.1,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 77,
      "expiry_status": "current",
      "grade": "D",
      "id": "stsv-salaberry-de-valleyfield",
      "name": "Soci\u00e9t\u00e9 de transport de Salaberry-de-Valleyfield",
      "needs_attention": false,
      "score": 63.5,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 66,
      "expiry_status": "current",
      "grade": "B",
      "id": "sts-sherbrooke",
      "name": "Soci\u00e9t\u00e9 de transport de Sherbrooke (STS)",
      "needs_attention": false,
      "score": 86.8,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 72,
      "expiry_status": "current",
      "grade": "C",
      "id": "sttr-trois-rivieres",
      "name": "Soci\u00e9t\u00e9 de transport de Trois-Rivi\u00e8res",
      "needs_attention": false,
      "score": 72.0,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": "rimouski-transit",
      "name": "Soci\u00e9t\u00e9 des transports de Rimouski",
      "needs_attention": false,
      "score": 87.2,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 26740,
      "expiry_status": "current",
      "grade": "A",
      "id": "stq-traversiers",
      "name": "Soci\u00e9t\u00e9 des traversiers du Qu\u00e9bec (STQ)",
      "needs_attention": false,
      "score": 91.0,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 87,
      "expiry_status": "current",
      "grade": "B",
      "id": "transit-windsor",
      "name": "Transit Windsor",
      "needs_attention": false,
      "score": 80.4,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 1174,
      "expiry_status": "current",
      "grade": "C",
      "id": "transport-rouyn-noranda",
      "name": "Transport en commun de Rouyn-Noranda",
      "needs_attention": false,
      "score": 74.8,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 172,
      "expiry_status": "current",
      "grade": "B",
      "id": "up-express",
      "name": "Union Pearson Express (UP Express)",
      "needs_attention": false,
      "score": 83.6,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "top_fix": "Review the rule documentation for 'invalid_phone_number' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "top_fix_code": "invalid_phone_number"
    },
    {
      "annual_trips": null,
      "attention_reason": null,
      "days_until_expiry": 120,
      "expiry_status": "current",
      "grade": "C",
      "id": "via-rail-canada",
      "name": "VIA Rail Canada",
      "needs_attention": false,
      "score": 78.9,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 78,
      "expiry_status": "current",
      "grade": "C",
      "id": "ville-de-drummondville",
      "name": "Ville de Drummondville",
      "needs_attention": false,
      "score": 77.9,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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": 8842,
      "expiry_status": "current",
      "grade": "D",
      "id": "whitehorse-transit",
      "name": "Whitehorse Transit (Yukon)",
      "needs_attention": false,
      "score": 60.8,
      "shapes_status": null,
      "snapshot_date": "2026-10-15",
      "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"
    }
  ],
  "needs_attention": 16,
  "realtime": {
    "bands": {
      "mostly": 0,
      "reliable": 5,
      "spotty": 0
    },
    "configured_feed_records": 5,
    "median_coverage_pct": null,
    "median_lag_seconds": 5,
    "median_uptime_pct": 100.0,
    "members": [
      {
        "band": "reliable",
        "configured_kinds": [
          "service_alerts",
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1789933776,
        "id": "hamilton-street-railway",
        "last_ts": 1792104484,
        "median_coverage_pct": null,
        "median_lag_seconds": 56,
        "name": "Hamilton Street Railway (HSR)",
        "observations": 200,
        "uptime_pct": 100.0
      },
      {
        "band": "reliable",
        "configured_kinds": [
          "service_alerts",
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1789930496,
        "id": "edmonton-transit-service",
        "last_ts": 1792101228,
        "median_coverage_pct": null,
        "median_lag_seconds": 18,
        "name": "Edmonton Transit Service (ETS)",
        "observations": 200,
        "uptime_pct": 100.0
      },
      {
        "band": "reliable",
        "configured_kinds": [
          "service_alerts",
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1789933591,
        "id": "gova-greater-sudbury",
        "last_ts": 1792104298,
        "median_coverage_pct": null,
        "median_lag_seconds": 5,
        "name": "GOVA Transit (Greater Sudbury)",
        "observations": 200,
        "uptime_pct": 100.0
      },
      {
        "band": "reliable",
        "configured_kinds": [
          "service_alerts",
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1789934332,
        "id": "kingston-transit",
        "last_ts": 1792105036,
        "median_coverage_pct": null,
        "median_lag_seconds": 5,
        "name": "Kingston Transit",
        "observations": 200,
        "uptime_pct": 100.0
      },
      {
        "band": "reliable",
        "configured_kinds": [
          "service_alerts",
          "trip_updates",
          "vehicle_positions"
        ],
        "first_ts": 1789937174,
        "id": "thunder-bay-transit",
        "last_ts": 1792107847,
        "median_coverage_pct": null,
        "median_lag_seconds": 5,
        "name": "Thunder Bay Transit",
        "observations": 200,
        "uptime_pct": 100.0
      }
    ],
    "monitored_feed_records": 5
  },
  "rollup": {
    "country_code": "CA",
    "country_name": "Canada",
    "id": "country-ca",
    "name": "Canada"
  },
  "schema_version": "1.19",
  "shapes_readiness": {
    "at_risk": 0,
    "not_measured": 81,
    "not_ready": 0,
    "ready": 0,
    "total": 81
  },
  "state_percentile": null
}
