{
  "agency": {
    "country": "CA",
    "id": "stq-traversiers",
    "name": "Soci\u00e9t\u00e9 des traversiers du Qu\u00e9bec (STQ)",
    "operating_note": "One export covering the provincial ferry crossings, counted as one feed record.",
    "subdivision_code": "CA-QC",
    "subdivision_name": "Quebec"
  },
  "categories": {
    "completeness": {
      "details": {
        "accessibility": {
          "measures": "presence_not_usability",
          "score": 100.0,
          "stops_marked_accessible_pct": 71.4,
          "stops_marked_not_accessible_pct": 28.6,
          "stops_stated_pct": 100.0,
          "trips_stated_pct": 100.0
        },
        "accessibility_measures": "presence_not_usability",
        "cemv": {
          "declared": false,
          "supported": false
        },
        "components": {
          "contact": 15.0,
          "fares": 0.0,
          "headsigns": 15.0,
          "stop_names": 15.0,
          "wheelchair_stops": 25.0,
          "wheelchair_trips": 15.0
        },
        "fare_free": false,
        "fares": {
          "applied": false,
          "has_leg_rules": false,
          "has_products": false,
          "has_transfer_rules": false,
          "model": "none",
          "product_count": 0
        },
        "flex": {
          "booking_reachable": false,
          "booking_rule_count": 0,
          "has_booking_rules": false,
          "has_flex": false
        },
        "has_fares": false,
        "headsign_applicable_trips": 4956,
        "headsign_loop_exempt_trips": 0,
        "headsign_pct": 100.0,
        "headsign_scored_pct": 100.0,
        "headsign_stop_headsign_trips": 0,
        "mixed_case_stop_name_pct": 100.0,
        "pathways": {
          "has_entrances": false,
          "has_levels": false,
          "has_pathways": false,
          "has_stations": false,
          "has_step_free": false,
          "pathway_count": 0
        },
        "stops": 21,
        "translations": {
          "feed_lang": "fr",
          "has_translations": false,
          "languages": [],
          "translated_tables": [],
          "translation_count": 0
        },
        "trips": 4956,
        "unmeasured_components": [],
        "wheelchair_accessible_pct": 100.0,
        "wheelchair_boarding_pct": 100.0,
        "wheelchair_marked_accessible_pct": 71.4,
        "wheelchair_marked_not_accessible_pct": 28.6
      },
      "findings": [
        {
          "code": "scorecard_no_fare_data",
          "consequence": {
            "absences": [
              "Rider-trip figures come from the United States National Transit Database, which does not cover this feed's country.",
              "This record does not store transit need. The agency page and its reports add it from the need overlays and name their date."
            ],
            "code": "scorecard_no_fare_data",
            "line": "This one is about the feed as a whole, so there is no share of it to count.",
            "reach": {
              "affected": null,
              "basis": "none",
              "basis_label": null,
              "reason": "feed_level",
              "share": null,
              "total": null,
              "total_source": null
            },
            "ridership": {
              "annual_rider_trips": null,
              "ntd_id": null,
              "reason": "outside_ridership_scope"
            },
            "served_area_need": {
              "reason": "not_joined_here",
              "scale": "ca_cimd",
              "tier": null
            }
          },
          "count": 1,
          "effort": "A small file for most flat-fare systems.",
          "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.",
          "owner": "",
          "points": 15.0,
          "severity": "WARNING",
          "what": "The feed contains no fare information.",
          "why": "Riders see 'fare unknown' in trip planners and can't budget their trip; visitors are most affected."
        }
      ],
      "name": "completeness",
      "score": 85.0,
      "status": "measured",
      "summary": "100% of terminals state wheelchair accessibility (71% marked accessible, 29% marked not accessible). This measures what the feed publishes, not whether a terminal is physically usable. Fare data is not published.",
      "weight": 0.25
    },
    "correctness": {
      "details": {
        "distinct_codes": 4,
        "instances_by_severity": {
          "ERROR": 0,
          "INFO": 17,
          "WARNING": 227
        },
        "validator_version": "8.0.1"
      },
      "findings": [
        {
          "code": "mixed_case_recommended_field",
          "consequence": {
            "absences": [
              "Rider-trip figures come from the United States National Transit Database, which does not cover this feed's country.",
              "This record does not store transit need. The agency page and its reports add it from the need overlays and name their date."
            ],
            "code": "mixed_case_recommended_field",
            "line": "This is a validator notice, and the validator decides what each instance covers, so no share of the network can be read from it here.",
            "reach": {
              "affected": null,
              "basis": "none",
              "basis_label": null,
              "reason": "validator_notice",
              "share": null,
              "total": null,
              "total_source": null
            },
            "ridership": {
              "annual_rider_trips": null,
              "ntd_id": null,
              "reason": "outside_ridership_scope"
            },
            "served_area_need": {
              "reason": "not_joined_here",
              "scale": "ca_cimd",
              "tier": null
            }
          },
          "count": 227,
          "effort": "Often a bulk fix in your scheduling software.",
          "fix": "Use mixed case for stop names and headsigns (e.g. 'Main St & 2nd Ave', not 'MAIN ST & 2ND AVE').",
          "owner": "Likely your export tool",
          "points": 8.0,
          "severity": "WARNING",
          "what": "Some rider-facing names are in ALL CAPS or all lowercase.",
          "why": "ALL-CAPS stop and headsign names are harder to read in apps and are read awkwardly by screen readers."
        },
        {
          "code": "service_extends_far_in_the_future",
          "consequence": {
            "absences": [
              "Rider-trip figures come from the United States National Transit Database, which does not cover this feed's country.",
              "This record does not store transit need. The agency page and its reports add it from the need overlays and name their date."
            ],
            "code": "service_extends_far_in_the_future",
            "line": "This is a validator notice, and the validator decides what each instance covers, so no share of the network can be read from it here.",
            "reach": {
              "affected": null,
              "basis": "none",
              "basis_label": null,
              "reason": "validator_notice",
              "share": null,
              "total": null,
              "total_source": null
            },
            "ridership": {
              "annual_rider_trips": null,
              "ntd_id": null,
              "reason": "outside_ridership_scope"
            },
            "served_area_need": {
              "reason": "not_joined_here",
              "scale": "ca_cimd",
              "tier": null
            }
          },
          "count": 12,
          "effort": "Varies.",
          "fix": "Review the rule documentation for 'service_extends_far_in_the_future' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
          "owner": "",
          "points": 0.8,
          "severity": "INFO",
          "what": "Service extends far in the future (flagged by the MobilityData validator).",
          "why": "See the linked rule for what this affects."
        },
        {
          "code": "big_gap_in_service",
          "consequence": {
            "absences": [
              "Rider-trip figures come from the United States National Transit Database, which does not cover this feed's country.",
              "This record does not store transit need. The agency page and its reports add it from the need overlays and name their date."
            ],
            "code": "big_gap_in_service",
            "line": "This is a validator notice, and the validator decides what each instance covers, so no share of the network can be read from it here.",
            "reach": {
              "affected": null,
              "basis": "none",
              "basis_label": null,
              "reason": "validator_notice",
              "share": null,
              "total": null,
              "total_source": null
            },
            "ridership": {
              "annual_rider_trips": null,
              "ntd_id": null,
              "reason": "outside_ridership_scope"
            },
            "served_area_need": {
              "reason": "not_joined_here",
              "scale": "ca_cimd",
              "tier": null
            }
          },
          "count": 4,
          "effort": "A review of your calendar dates.",
          "fix": "Check whether the gap is real, like a seasonal break; if not, add the missing dates to the calendar.",
          "owner": "",
          "points": 0.5,
          "severity": "INFO",
          "what": "The feed has a stretch of two weeks or more with no service running.",
          "why": "A long gap can mean dates were left out of the calendar. Apps then show no trips on those days."
        },
        {
          "code": "feed_valid_beyond_total_service_window",
          "consequence": {
            "absences": [
              "Rider-trip figures come from the United States National Transit Database, which does not cover this feed's country.",
              "This record does not store transit need. The agency page and its reports add it from the need overlays and name their date."
            ],
            "code": "feed_valid_beyond_total_service_window",
            "line": "This is a validator notice, and the validator decides what each instance covers, so no share of the network can be read from it here.",
            "reach": {
              "affected": null,
              "basis": "none",
              "basis_label": null,
              "reason": "validator_notice",
              "share": null,
              "total": null,
              "total_source": null
            },
            "ridership": {
              "annual_rider_trips": null,
              "ntd_id": null,
              "reason": "outside_ridership_scope"
            },
            "served_area_need": {
              "reason": "not_joined_here",
              "scale": "ca_cimd",
              "tier": null
            }
          },
          "count": 1,
          "effort": "Varies.",
          "fix": "Review the rule documentation for 'feed_valid_beyond_total_service_window' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
          "owner": "",
          "points": 0.5,
          "severity": "INFO",
          "what": "Feed valid beyond total service window (flagged by the MobilityData validator).",
          "why": "See the linked rule for what this affects."
        }
      ],
      "name": "correctness",
      "score": 90.2,
      "status": "measured",
      "summary": "The MobilityData validator flagged 4 kinds of issue across 244 instances (0 error, 227 warning, 17 informational).",
      "weight": 0.35
    },
    "freshness": {
      "details": {
        "days_until_expiry": 26735,
        "effective_expiry_date": "2099-12-31",
        "expiry_limited_by": "both",
        "feed_end_date": "2099-12-31",
        "feed_start_date": "2021-04-06",
        "feed_version": "1.1.4",
        "has_feed_info": true,
        "last_service_date": "2099-12-31",
        "seasonal_boundary": false,
        "service_horizon_review_years": 10,
        "service_horizon_status": "unusually_distant",
        "service_type": "fixed"
      },
      "findings": [],
      "name": "freshness",
      "score": 100.0,
      "status": "measured",
      "summary": "Service is published through 2099-12-31, an unusually distant end date. It may be intentional, but confirm it before treating the feed as maintained.",
      "weight": 0.2
    },
    "realtime": {
      "name": "realtime",
      "status": "not_yet_measured",
      "summary": "Not scored yet. Nothing here counts against the grade.",
      "weight": 0.2
    }
  },
  "confidence": {
    "feed_age_days": 0,
    "fetch_source": "origin",
    "level": "medium",
    "measured_categories": 3,
    "notes": [
      "Realtime quality was not measured this run. It does not count against the grade.",
      "The feed was downloaded from the official feed URL on file."
    ],
    "rt_windows": 0,
    "total_categories": 4
  },
  "conformance": {
    "awarded": true,
    "criteria": [
      {
        "detail": "Passes validation with no errors.",
        "key": "valid",
        "met": true
      },
      {
        "detail": "The published window is current, but its service end date is unusually distant; confirm that date is intentional.",
        "key": "current",
        "met": true
      },
      {
        "detail": "States wheelchair access on 100% of terminals and 100% of trips.",
        "key": "accessible",
        "met": true
      }
    ],
    "status": "awarded",
    "summary": "This feed earns the conformance mark: valid, current, and stating wheelchair access on nearly every terminal and trip.",
    "version": 2
  },
  "feed": {
    "license_note": "Creative Commons Attribution 4.0 through Donn\u00e9es Qu\u00e9bec and the federated record on open.canada.ca. Credit the Soci\u00e9t\u00e9 des traversiers du Qu\u00e9bec.",
    "reachable": true,
    "sha256": "0b8342dc66036cd871f32e5f2c129f89412f88e465f034b8f91982a0be6bb64d",
    "size_bytes": 65374,
    "source_provenance": "official",
    "static_url": "https://gtfs.traversiers.com/api/gtfs.zip"
  },
  "ferry_profile": {
    "accessibility": {
      "measures": "published_values_not_physical_usability",
      "terminals": {
        "allowed_count": 15,
        "allowed_pct": 71.4,
        "not_allowed_count": 6,
        "not_allowed_pct": 28.6,
        "stated_count": 21,
        "stated_pct": 100.0,
        "total_count": 21
      },
      "trips": {
        "allowed_count": 4546,
        "allowed_pct": 91.7,
        "not_allowed_count": 410,
        "not_allowed_pct": 8.3,
        "stated_count": 4956,
        "stated_pct": 100.0,
        "total_count": 4956
      }
    },
    "bikes": {
      "allowed_count": 4570,
      "allowed_pct": 92.2,
      "not_allowed_count": 386,
      "not_allowed_pct": 7.8,
      "stated_count": 4956,
      "stated_pct": 100.0,
      "total_count": 4956
    },
    "cars": {
      "allowed_count": 4570,
      "allowed_pct": 92.2,
      "not_allowed_count": 386,
      "not_allowed_pct": 7.8,
      "stated_count": 4956,
      "stated_pct": 100.0,
      "total_count": 4956
    },
    "fares": {
      "applied": false,
      "fare_free": false,
      "model": "none",
      "scope": "whole_feed"
    },
    "graded": false,
    "measured": true,
    "realtime": {
      "configured_kinds": [],
      "kinds_configured": 0,
      "scope": "whole_feed"
    },
    "route_count": 10,
    "scope": "ferry_routes_and_trips",
    "stop_access": {
      "direct_count": 0,
      "eligible_terminal_count": 0,
      "stated_count": 0,
      "stated_pct": null,
      "through_station_count": 0
    },
    "terminal_hierarchy": {
      "boarding_location_count": 21,
      "parented_boarding_location_count": 0,
      "parented_boarding_location_pct": 0.0,
      "referenced_station_count": 0
    },
    "trip_count": 4956
  },
  "fetch": {
    "final_url": "https://gtfs.traversiers.com/api/gtfs.zip",
    "max_attempts": 4,
    "reader_archive_profile": "raw-v1",
    "source": "origin",
    "user_agent": "gtfs-scorecard/1.5.1 (+https://gtfsscorecard.org)"
  },
  "generated_at": "2026-10-20T00:00:00+00:00",
  "geo": {
    "bbox": [
      -73.12696,
      46.04742,
      -58.65085,
      51.22537
    ],
    "lat": 48.02432,
    "lon": -69.40674,
    "stop_count": 21
  },
  "mode_profile": {
    "ferry_only": true,
    "graded": false,
    "has_ferry": true,
    "is_multimodal": false,
    "measured": true,
    "modes": [
      {
        "key": "ferry",
        "label": "Ferry",
        "route_count": 10,
        "trip_count": 4956,
        "trip_share_pct": 100.0
      }
    ],
    "primary_mode": "ferry",
    "primary_mode_label": "Ferry",
    "route_count": 10,
    "trip_count": 4956
  },
  "overall": {
    "grade": "A",
    "margin_to_lower_band": 1.0,
    "margin_to_next_band": null,
    "score": 91.0
  },
  "recommendations": [],
  "routability": {
    "boardable_stops": 21,
    "findings": [],
    "orphan_stops": 0,
    "single_stop_trips": 0,
    "trips_total": 4956
  },
  "route_map": {
    "drawn_route_count": 0,
    "has_shapes": false,
    "path": "data/artifacts/stq-traversiers/geometry.geojson",
    "route_count": 10,
    "routes": [
      {
        "color": "002B56",
        "color_name": "black",
        "has_shape": false,
        "id": "h-harbour-chevery",
        "label": "HHC",
        "long": "Harrington Harbour\u2013Chevery",
        "short": "HHC",
        "text_color": "FFFFFF",
        "type_label": "Ferry"
      },
      {
        "color": "002B56",
        "color_name": "black",
        "has_shape": false,
        "id": "i-v-n-d-des-sept-douleurs",
        "label": "IV",
        "long": "l'\u00eele-Verte",
        "short": "IV",
        "text_color": "FFFFFF",
        "type_label": "Ferry"
      },
      {
        "color": "002B56",
        "color_name": "black",
        "has_shape": false,
        "id": "ile-d-entree-cap-aux-meules",
        "label": "IE",
        "long": "\u00cele d'Entr\u00e9e\u2013Cap-aux-Meules",
        "short": "IE",
        "text_color": "FFFFFF",
        "type_label": "Ferry"
      },
      {
        "color": "002B56",
        "color_name": "black",
        "has_shape": false,
        "id": "isle-aux-coudres",
        "label": "IAC",
        "long": "L'Isle-aux-Coudres\u2013Saint-Joseph-de-la-Rive",
        "short": "IAC",
        "text_color": "FFFFFF",
        "type_label": "Ferry"
      },
      {
        "color": "002B56",
        "color_name": "black",
        "has_shape": false,
        "id": "l-isle-aux-grues-montmagny",
        "label": "IAG",
        "long": "L'Isle-aux-Grues\u2013Montmagny",
        "short": "IAG",
        "text_color": "FFFFFF",
        "type_label": "Ferry"
      },
      {
        "color": "002B56",
        "color_name": "black",
        "has_shape": false,
        "id": "matane",
        "label": "MBCG",
        "long": "Matane\u2013Baie-Comeau\u2013Godbout",
        "short": "MBCG",
        "text_color": "FFFFFF",
        "type_label": "Ferry"
      },
      {
        "color": "002B56",
        "color_name": "black",
        "has_shape": false,
        "id": "quebec",
        "label": "QL",
        "long": "Qu\u00e9bec-L\u00e9vis",
        "short": "QL",
        "text_color": "FFFFFF",
        "type_label": "Ferry"
      },
      {
        "color": "002B56",
        "color_name": "black",
        "has_shape": false,
        "id": "riv-st-augustin",
        "label": "RSA",
        "long": "Rivi\u00e8re Saint-Augustin",
        "short": "RSA",
        "text_color": "FFFFFF",
        "type_label": "Ferry"
      },
      {
        "color": "002B56",
        "color_name": "black",
        "has_shape": false,
        "id": "sorel",
        "label": "STSIL",
        "long": "Sorel-Tracy\u2013Saint-Ignace-de-Loyola",
        "short": "STSIL",
        "text_color": "FFFFFF",
        "type_label": "Ferry"
      },
      {
        "color": "002B56",
        "color_name": "black",
        "has_shape": false,
        "id": "tadoussac",
        "label": "TBSC",
        "long": "Tadoussac\u2013Baie-Sainte-Catherine",
        "short": "TBSC",
        "text_color": "FFFFFF",
        "type_label": "Ferry"
      }
    ],
    "stop_count": 21,
    "stop_points_capped": false
  },
  "rubric_version": "1.4",
  "schema_version": "1.19",
  "scoring_profile": {
    "id": "gtfs-scorecard-1.4",
    "provenance": "GTFS Scorecard's project-authored weights, deductions, thresholds, grade bands, and fix ranking, informed by the California Transit Data Guidelines and the MobilityData gtfs-validator. It is not a worldwide standard or a compliance determination.",
    "rubric_version": "1.4"
  },
  "snapshot_date": "2026-10-20",
  "top_fixes": [
    {
      "code": "scorecard_no_fare_data",
      "consequence": {
        "absences": [
          "Rider-trip figures come from the United States National Transit Database, which does not cover this feed's country.",
          "This record does not store transit need. The agency page and its reports add it from the need overlays and name their date."
        ],
        "code": "scorecard_no_fare_data",
        "line": "This one is about the feed as a whole, so there is no share of it to count.",
        "reach": {
          "affected": null,
          "basis": "none",
          "basis_label": null,
          "reason": "feed_level",
          "share": null,
          "total": null,
          "total_source": null
        },
        "ridership": {
          "annual_rider_trips": null,
          "ntd_id": null,
          "reason": "outside_ridership_scope"
        },
        "served_area_need": {
          "reason": "not_joined_here",
          "scale": "ca_cimd",
          "tier": null
        }
      },
      "count": 1,
      "effort": "A small file for most flat-fare systems.",
      "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.",
      "owner": "",
      "points": 15.0,
      "rank": 1,
      "severity": "WARNING",
      "what": "The feed contains no fare information.",
      "why": "Riders see 'fare unknown' in trip planners and can't budget their trip; visitors are most affected."
    },
    {
      "code": "mixed_case_recommended_field",
      "consequence": {
        "absences": [
          "Rider-trip figures come from the United States National Transit Database, which does not cover this feed's country.",
          "This record does not store transit need. The agency page and its reports add it from the need overlays and name their date."
        ],
        "code": "mixed_case_recommended_field",
        "line": "This is a validator notice, and the validator decides what each instance covers, so no share of the network can be read from it here.",
        "reach": {
          "affected": null,
          "basis": "none",
          "basis_label": null,
          "reason": "validator_notice",
          "share": null,
          "total": null,
          "total_source": null
        },
        "ridership": {
          "annual_rider_trips": null,
          "ntd_id": null,
          "reason": "outside_ridership_scope"
        },
        "served_area_need": {
          "reason": "not_joined_here",
          "scale": "ca_cimd",
          "tier": null
        }
      },
      "count": 227,
      "effort": "Often a bulk fix in your scheduling software.",
      "fix": "Use mixed case for stop names and headsigns (e.g. 'Main St & 2nd Ave', not 'MAIN ST & 2ND AVE').",
      "owner": "Likely your export tool",
      "points": 8.0,
      "rank": 2,
      "severity": "WARNING",
      "what": "Some rider-facing names are in ALL CAPS or all lowercase.",
      "why": "ALL-CAPS stop and headsign names are harder to read in apps and are read awkwardly by screen readers."
    },
    {
      "code": "service_extends_far_in_the_future",
      "consequence": {
        "absences": [
          "Rider-trip figures come from the United States National Transit Database, which does not cover this feed's country.",
          "This record does not store transit need. The agency page and its reports add it from the need overlays and name their date."
        ],
        "code": "service_extends_far_in_the_future",
        "line": "This is a validator notice, and the validator decides what each instance covers, so no share of the network can be read from it here.",
        "reach": {
          "affected": null,
          "basis": "none",
          "basis_label": null,
          "reason": "validator_notice",
          "share": null,
          "total": null,
          "total_source": null
        },
        "ridership": {
          "annual_rider_trips": null,
          "ntd_id": null,
          "reason": "outside_ridership_scope"
        },
        "served_area_need": {
          "reason": "not_joined_here",
          "scale": "ca_cimd",
          "tier": null
        }
      },
      "count": 12,
      "effort": "Varies.",
      "fix": "Review the rule documentation for 'service_extends_far_in_the_future' at https://gtfs-validator.mobilitydata.org/rules.html and check the flagged rows in your feed.",
      "owner": "",
      "points": 0.8,
      "rank": 3,
      "severity": "INFO",
      "what": "Service extends far in the future (flagged by the MobilityData validator).",
      "why": "See the linked rule for what this affects."
    }
  ],
  "validator_version": "8.0.1"
}
